目次
今回は移動方法と打撃方法について考える必要がある
今回は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() #通信を続ける
今回バッターロボットの設計は主にbickyが行った(実質の初作品)
いかに少ない部品でカッコよく、他の班にはないインパクトを与えられるかということに拘った。打球については、野球らしさを出すため、ボールを転がすとボールがそれてしまうことを恐れたため空中に投げられたボールをそのまま打つことにした。今回は安定して得点するという考えをを敢えて捨て、思うがままにロボットを作成した。(ネタに走った。)
全体図(写真は設計途中の段階のものであり、本番ではセンサーを全て取り外している)
EV3 Lモーター ×1 (税込4,644円/個)
前後の移動は後輪のLモーターが行い、移動向きの変更は前輪のMモーターが行った。
Mモーターが動くことによって前輪の向きが変わり、二輪車と同様に移動方向が変わる
6
Mモーターを動かすことにより、Lモーターから後輪へ動力を伝えるギアに小さなギアを噛ませ、後輪が動かなくする。
後輪が動かない状態でLモーターを動かすことでLモーター自身が持ち上がり、変形する。
変形後にバットを構え、MQTTにより合図が送られた時にバットを振る
この時、角度制御をしているためバットの振り過ぎによりロボットが痛むといったことは起こらない。
今回は初めてロボット本体の設計をほぼ一人で行いました。今までLegoを触ってこなかったためかうまく組み上げられなかったため、ロボットが組みあがったのは本番の前日でした。まあ、動作中の不具合により解体しましたが。そのため、徹夜でロボットを再設計し、プログラムを書き換えました(笑)。通信のプログラムに関してはbeingさんに丸投げし、使い方を教えてもらいました。また本番直前で通信がうまくいかなくOSを移植するという事態となり、beingさん、penさんに助けてもらいました。beingさん、penさんに感謝。
時間がなかったことや、ゼミをうけている当初から変形ロボットやステアリング機構を持つロボットを作ってみたかったこともあり、最後まで拘ってロボットの製作をしたため徹夜&練習なしのぶっつけ本番となってしまいました。本番中に練習時間が取れたこともあり、移動や変形がある程度うまく行ったのですが、やはりこういったものはスケジュール管理が大切で特に徹夜は1日までと感じました。余談ですが今回徹夜をしてる際、pep◯i strong なるものを飲んでいたのですが、眠気が全く来ずに徹夜できました。コーラに感謝。