目次 #contents *課題3 ~野球~ [#j8a06b3d] -ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ -ピッチャーロボットはA地点をスタートしM地点まで移動する -バッターロボットはC地点をスタートしB地点まで移動する -スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし) -M地点、B地点では接地している部分が枠内に入っていること -ピッチャーロボットはスタート時にピンポン球を5個まで保持できる -ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない -移動の途中で目標に接触してはならない #br #br **アプローチ [#j87c51f6] 今回は移動方法と打撃方法について考える必要がある ***移動方法 [#w3977a61] +R付近まで移動する(黒線の数を計測し、規定の本数を計測した時R付近にいると認識させる) →ライントレースでB地点へ #br メリット:正確にB地点まで移動できる。課題2でのプログラムを利用できる。&br; デメリット:カラーセンサが必要になる。プログラムが複雑になる。 #ref(./.jpg,80%) #br +半円を描くように直接B地点へ行く(角度制御 or 時間制御) #br メリット:プログラムの記述が楽、簡潔になる。センサーを使わない。&br; デメリット:調整が困難であり、確実性がない。 #ref(./.jpg,80%) #br ***打撃方法 [#x3eada8d] +キャッチ&リリース打(?)法 #br メリット:一度ボールをキャッチしてしまえば安定して狙った場所にボールをシュートできる。&br; デメリット:ピッチャーが転がしたボールがバッターに届く前に逸れてしまうことが考えられる。 #br +リアル打法 メリット:これが一番野球してると思います。&br; デメリット:ロボット間の通信速度や打つタイミングがシビア。ゴールを狙うのはほぼ不可能。 #br #br 今回はロボットの構造やネタに走った都合上、半円を描くように直接B地点へ行き、リアル打法で課題に臨んだ。 #br 今回の移動ルート&br; #ref(./.jpg,80%) #br *プログラム(python)の説明 [#k37c462b] #br 今回はMQTTを行うためのライブラリを追加している&br; (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 = '192.168.2.102' #通信相手の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() 今回は後輪を駆動輪とし、前輪は移動方向を変えるために使用した。(バイクと同じ構造である。)&br; また、前輪の操作と打撃の操作は全て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() #通信を続ける #br **MQTT(通信プロトコル)の説明 [#h1321c55] 主な説明はこちら&br; #br -MQTTとは通信の様式を表すものである。 -MQTTはpublisherとsubscriberの間にbrokerが存在しており、情報の受け渡しは全てこのbrokerが担当している。普段使っているメールアプリみたいなイメージをすると良い。 #ref(./.jpg,80%) 変形についてはこちら&br; 移動方向の変更についてはこちら #br *ロボット本体の解説 [#w490f554] 今回バッターロボットの設計は主に私が行った&br; #br 全体図 #ref(./.JPG,80%) #br **使用した部品 [#q03e239e] #ref(./bottom.JPG,around,80%) EV3 Lモーター ×1 (税込4,644円/個) -特徴:重いものをゆっくり 動かすのが得意 -駆動輪、変形のために使用 -今回の重要な部品 #br #clear #br #ref(./.JPG,around,80%) EV3 Mモーター ×1(税込3,780円) -特徴:軽いものを素早く 動かすのが得意 -前輪の操作、打撃を行うために使用 #clear **ブレーキ・変形機構(最重要) [#l0562dda] #ref(./.JPG,around,80%) -変形時に駆動輪を固定することでロボットが変形する -今回の大きな特徴 #clear **前輪の機構(ステアリング機構) [#k5d13991] #ref(./.jpg,around,80%) -この機構のおかげでLモーター1つでロボットを動かすことができた -今回のこだわり #clear #br *ロボットの仕組みの解説 [#x7a361d9] **ロボットの駆動について [#k32417be] 前後の移動は後輪のLモーターが行い、移動向きの変更は前輪のMモーターが行った。 ***移動向きの変更(ステアリング機構) [#ad13b6c9] #ref(./.gif,around,80%) Mモーターが動くことによって前輪の向きが変わり、二輪車と同様に移動方向が変わる #clear **変形について [#i0a11c3e] ***Lモーターからの動力を変形に利用する [#s22be2b4] #ref(./.jpg,around,80%) Mモーターを動かすことにより、Lモーターから後輪へ動力を伝えるギアに小さなギアを噛ませ、後輪が動かなくする。 #clear #br #ref(./.gif,around,80%) 後輪が動かない状態でLモーターを動かすことでLモーター自身が持ち上がり、変形する。 #clear **打撃について [#v636ba0f] #ref(./.gif,around,80%) 変形後にバットを構え、MQTTにより合図が送られた時にバットを振る&br; この時、角度制御をしているためバットの振り過ぎによりロボットが痛むといったことは起こらないようにしている。 &size(20){}; #ref(./.jpg,80%) ** [#u82a4de8] #ref(./.jpg,80%) 対処法 #br + + *** [#se7c6ad3] #ref(./.jpg,80%) 対処法 #br + + + *まとめ [#e722d710]