目次

課題3 ~野球~

  • ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ
  • ピッチャーロボットはA地点をスタートしM地点まで移動する
  • バッターロボットはC地点をスタートしB地点まで移動する
  • スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)
  • M地点、B地点では接地している部分が枠内に入っていること
  • ピッチャーロボットはスタート時にピンポン球を5個まで保持できる
  • ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない
  • 移動の途中で目標に接触してはならない
     

アプローチ

今回は移動方法と打撃方法について考える必要がある

移動方法

  1. R付近まで移動する(黒線の数を計測し、規定の本数を計測した時R付近にいると認識させる) →ライントレースでB地点へ
     
    メリット:正確にB地点まで移動できる。課題2でのプログラムを利用できる。
    デメリット:カラーセンサが必要になる。プログラムが複雑になる。
    ライントレース.png
     
  2. 半円を描くように直接B地点へ行く(角度制御 or 時間制御)
     
    メリット:プログラムの記述が楽、簡潔になる。センサーを使わない。
    デメリット:調整が困難であり、確実性がない。
    直.png
     
    

打撃方法

  1. キャッチ&リリース打(?)法
  • 転がっているボールを一度アームで掴み、その後ボールを射出する方法。
     
    メリット:一度ボールをキャッチしてしまえば安定して狙った場所にボールをシュートできる。
    デメリット:ピッチャーが転がしたボールがバッターに届く前に逸れてしまうことが考えられる。
     
  1. リアル野球打法
  • 空中に射出されたボールをそのまま打つ方法。
    メリット:これが一番野球してると思います。
    デメリット:ロボット間の通信速度や打つタイミングがシビア。ゴールを狙うのはほぼ不可能。
     
     
    今回はロボットの構造やネタに走った都合上、半円を描くように直接B地点へ行き、リアル野球打法で課題に臨んだ。
     
    今回の移動ルート
    進む.png
     

プログラム(python)の説明

 

今回はMQTTを行うためのライブラリを追加している
(pahoというライブラリは最新のev3devのputhon3ではうまく動作しなかった模様)

#!/usr/bin/env python

import paho.mqtt.client as mqtt
import ev3dev.ev3 as ev3
import time

今回は主に1つのLargeMotorで移動する

lm = ev3.LargeMotor('outB')
mm = ev3.MediumMotor('outC')

MQTTに関する記述

host = '〇.〇.〇.〇'   #brokerのIPアドレス
port = 1883              #通信に使う場所(デフォルトでは1883番を使うらしい)
topic = 'pi/st'          #今回の通信の題名(どんな名前でも良い)
def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))     #正常に繋がった時に0とコンソールに表示する
    client.subscribe(topic)                      #指定された題名の通信を受け取る  ←大事

def on_message(client, userdata, msg):      #相手からの通信を受け取った時に行う動作(ここに通信時に行う動作を書く)
    t = 0.4
    time.sleep(t)
    swing()

今回は今までとは異なり、変形に挑戦した。

def transformation():    #変形プログラム
    mm.reset()
    lm.reset()       #位置調整
    turn_R(60)
    lm.run_to_rel_pos(position_sp=100, duty_cycle_sp=100, speed_sp=100, stop_action='hold')
    time.sleep(2)

    lm.reset()      #変形
    lm.run_to_rel_pos(position_sp=80, duty_cycle_sp=100, speed_sp=200, stop_action='hold')
    time.sleep(3)

    mm.reset()      #打撃姿勢をとるプログラム
    mm.run_to_rel_pos(position_sp=110,duty_cycle_sp=100,speed_sp=100, stop_action='hold')
    time.sleep(2)
    lm.reset()
    mm.reset()

今回は後輪を駆動輪とし、前輪は移動方向を変えるために使用した。(バイクと同じ構造である。)
また、前輪の操作と打撃の操作は全てMediumMotorのみで行った。

def turn_L(degree):  #左に曲がるためのプログラム
    mm.reset()   #tuen_left_MAX:degree=85
    mm.run_to_rel_pos(position_sp=degree, duty_cycle_sp=70, speed_sp=80, stop_action='hold')
    time.sleep(3)

def turn_R(degree):   #右に曲がるためのプログラム
    mm.reset()
    mm.run_to_rel_pos(position_sp=-degree, duty_cycle_sp=70, speed_sp=75, stop_action='hold')
    time.sleep(3)
 
def swing():   #打撃用プログラム
    mm.reset()    #バットを振る
    mm.run_to_rel_pos(position_sp=-110,duty_cycle_sp=100,speed_sp=800, stop_action='hold')
    time.sleep(1)
    mm.reset()    #構え直し
    mm.run_to_rel_pos(position_sp=110,duty_cycle_sp=100,speed_sp=500, stop_action='hold')
    time.sleep(1.5)

今回はあまり細かく移動できるロボットではなかったため、最も単純な移動ルートにした。

 def move():   #移動のプログラム(C → B)
    lm.reset()
    mm.reset()
    lm.run_forever(duty_cycle_sp=80,speed_sp=100)
    time.sleep(2.5)
    turn_L(50)
    lm.run_forever(duty_cycle_sp=80,speed_sp=100)
    time.sleep(9)
    lm.stop()

実行した動作

move   #移動(C → B)

transformation() #変形

###通信を行うための準備#############################
client = mqtt.Client(protocol=mqtt.MQTTv311)   #通信をするため、client(subscriber)を生成する

client.on_connect = on_connect       #通信ができた時に行う動作を指定
client.on_message = on_message    #通信を受け取った時に行う動作を指定

################################################


client.connect(host, port=port, keepalive=60)   #通信を行う(60秒間応答があるまで待機し、応答がなかった場合通信を終了する)


client.loop_forever()  #通信を続ける
 

MQTT(通信プロトコル)の説明

主な説明はこちら
ペアの説明はこちら

 
  • MQTTとは通信の様式を表すものである。
  • MQTTはpublisherとsubscriberの間にbrokerが存在しており、情報の受け渡しは全てこのbrokerが担当している。普段使っているメールアプリみたいなイメージをすると良い。
    mqtt.png

変形についてはこちら
移動方向の変更についてはこちら

 

ロボット本体の解説

今回バッターロボットの設計は主にbickyが行った(実質の初作品)
いかに少ない部品でカッコよく、他の班にはないインパクトを与えられるかということに拘った。打球については、野球らしさを出すため、ボールを転がすとボールがそれてしまうことを恐れたため空中に投げられたボールをそのまま打つことにした。今回は安定して得点するという考えをを敢えて捨て、思うがままにロボットを作成した。(ネタに走った。)

 

全体図(写真は設計途中の段階のものであり、本番ではセンサーを全て取り外している)
all.png top1.png front.png

 

使用した部品

large.png

EV3 Lモーター ×1 (税込4,644円/個)

  • 特徴:重いものをゆっくり 動かすのが得意
  • 駆動輪、変形のために使用
  • 今回の重要な部品
     
     
    mid.png
    EV3 Mモーター ×1(税込3,780円)
  • 特徴:軽いものを素早く 動かすのが得意
  • 前輪の操作、打つ動作を行うために使用
     
    support1.png
    支え(球状キャスター)
  • ロボットの支えとして最適な部品
     

ブレーキ・変形機構(最重要)

brake2.png brake.png

 

brake3.png brake6.png

  • 変形時に駆動輪を固定することでロボットが変形する
  • 今回の大きな特徴

前輪の機構(ステアリング機構)

stearing.png
  • この機構のおかげでLモーター1つでロボットを動かすことができた
  • 今回のこだわり
     

ロボットの仕組みの解説

ロボットの駆動について

前後の移動は後輪のLモーターが行い、移動向きの変更は前輪のMモーターが行った。

移動向きの変更(ステアリング機構)

stear.gif

Mモーターが動くことによって前輪の向きが変わり、二輪車と同様に移動方向が変わる

変形について

Lモーターからの動力を変形に利用する

 

1 meta.png 2meta1.png 3meta2.png

 

4meta3.png 別視点meta4.png

 

6

tran.gif
 

Mモーターを動かすことにより、Lモーターから後輪へ動力を伝えるギアに小さなギアを噛ませ、後輪が動かなくする。
後輪が動かない状態でLモーターを動かすことでLモーター自身が持ち上がり、変形する。

打つ動作について

batter.png

変形後にバットを構え、MQTTにより合図が送られた時にバットを振る
この時、角度制御をしているためバットの振り過ぎによりロボットが痛むといったことは起こらない。

まとめ

こだわりポイント

  • 変形
  • 二輪車という見た目
  • モーターLとMを1つづつしか使わないという縛り
  • ステアリング機構
  • 各モーターの機能美を追求
    midi_dual1.png large2.png

反省点

  • ステアリング機構で不具合が多発したため、その機構の改良が必要だった
  • 移動の精度があまりよくなかった
  • 超音波センサでピッチャーとの距離を測り、バッティング位置の修正を行う必要があった
  • 徹夜は1日まで

感想

今回は初めてロボット本体の設計をほぼ一人で行いました。今までLegoを触ってこなかったためかうまく組み上げられなかったため、ロボットが組みあがったのは本番の前日でした。まあ、動作中の不具合により解体しましたが。そのため、徹夜でロボットを再設計し、プログラムを書き換えました(笑)。通信のプログラムに関してはbeingさんに丸投げし、使い方を教えてもらいました。また本番直前で通信がうまくいかなくOSを移植するという事態となり、beingさん、penさんに助けてもらいました。beingさん、penさんに感謝。
時間がなかったことや、ゼミをうけている当初から変形ロボットやステアリング機構を持つロボットを作ってみたかったこともあり、最後まで拘ってロボットの製作をしたため徹夜&練習なしのぶっつけ本番となってしまいました。本番中に練習時間が取れたこともあり、移動や変形がある程度うまく行ったのですが、やはりこういったものはスケジュール管理が大切で特に徹夜は1日までと感じました。余談ですが今回徹夜をしてる際、pep◯i strong なるものを飲んでいたのですが、眠気が全く来ずに徹夜できました。コーラに感謝。


添付ファイル: file直.png 42件 [詳細] file進む.png 35件 [詳細] fileライントレース.png 49件 [詳細] filetop.png 45件 [詳細] filesupport.png 74件 [詳細] filestearing.png 53件 [詳細] filemqtt.png 53件 [詳細] filemidi_dual.png 37件 [詳細] filemeta4.png 40件 [詳細] filemeta3.png 35件 [詳細] filemeta2.png 33件 [詳細] filemeta1.png 40件 [詳細] filemeta.png 52件 [詳細] filelarge2.png 45件 [詳細] filefront.png 33件 [詳細] filebrake6.png 45件 [詳細] filebrake5.png 33件 [詳細] filebrake3.png 42件 [詳細] filebatter.png 51件 [詳細] fileall.png 33件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-18 (土) 12:00:11 (912d)