ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
ロボットを二体ずつ別々に動かして、それぞれ容器に入っている玉を運ぶロボットと容器の外の玉を運ぶロボットに分担して回収する。ライントレースについては、課題2と同じプログラムが使えるので、回収する動きを丁寧に付け加える必要がある。また、二体ロボットなので動きが被らないようにぶつからないように注意する必要がある。これらのことを意識したプログラムをつくらなければならない。
オレンジ→容器の中の玉の回収
紫→容器の外の玉の回収
それぞれ分担して作ったロボットである。
ピンポン玉を回収したときの図↓
もう一つのロボットである。容器ごと回収していくロボットである。
def motor_init(): #モーターをリセットする mL.reset() mR.reset() def arm_move(t,y): #アームを動かす関数である。tでアームを動かす時間、yで速度を設定 x = time.time() while time.time() - x < t: mM.run_forever(speed_sp=y) mM.stop() sleep(1) def catch_up(x,t): #ピンポン球を回収し、モーターを固定することでアームを固定する。xでモーターの速度を指定し、tで時間を指定する。速度の正負による挙動は上のcatch_upと同様。 mM.run_timed(speed_sp=x,time_sp=t,stop_action='hold') sleep(1) def move_forward(t): #時間tだけ前進する。2つのLarge Motorは速度が正だと前方に行くように回転する、負だと後方に行くように回転する。 x = time.time() while time.time() - x < t: mL.run_forever(speed_sp=-100) mR.run_forever(speed_sp=-100) mL.stop() mR.stop() def move_back(t): #時間tだけ後進する x = time.time() while time.time() - x < t: mL.run_forever(speed_sp=100) mR.run_forever(speed_sp=100) mL.stop() mR.stop() def turn_left(t): #時間tだけ左旋回する x = time.time() while time.time() - x < t: mL.run_forever(speed_sp=100) mR.run_forever(speed_sp=-100) mL.stop() mR.stop() def turn_right(t): #時間tだけ右旋回する x = time.time() while time.time() - x < t: mL.run_forever(speed_sp=-100) mR.run_forever(speed_sp=100) mL.reset() mR.reset() def line_trace_right(t,c): #線の右側に沿って動き、コーナーを検知すると止まる x = time.time() while time.time() - x < t: if cs.value() > c: mL.run_forever(speed_sp=40) mR.run_forever(speed_sp=-80) x = time.time() else: mL.run_forever(speed_sp=-80) mR.run_forever(speed_sp=40) if time.time() - x >t: mL.stop() mR.stop() def line_trace_left(t,c): #線の左側に沿って動き、コーナーを検知すると止まる x = time.time() while time.time() - x < t: if cs.value() > c: mL.run_forever(speed_sp=-80) mR.run_forever(speed_sp=40) x = time.time() else: mL.run_forever(speed_sp=40) mR.run_forever(speed_sp=-80) if time.time() - x >t: mL.stop() mR.stop()
プログラムの定義をパートナーと共有して、玉を一個回収するプログラムをそれぞれ分担して作成し、動きを確認しながら最後に2つのプログラムを合体させる形にした。
motor_init() #モーターをリセット sleep(1) #1秒間動作を停止する(以下同様) print(cs.value()) #カラーセンサーの値を表示 sleep(1) line_trace_left(1,40) #A'からK’まで線の左側に沿って移動する sleep(1) turn_right(0.55) #ピンポン球の方向を向くために角度を調整する sleep(1) move_back(4.2) #前方にアームを展開するとピンポン球にあたるので、一旦下がる。 sleep(1) arm_move(1.5,-400) #アームを展開する sleep(1) move_forward(1.6) #ピンポン球の回収地点まで前進する sleep(1) catch_up(550,750) #ピンポン球を回収する sleep(1) move_forward(5) #前進 sleep(1) turn_right(1.25) #ピンポン球の射出角度を調整 sleep(1) arm_move(1,800) #ピンポン球の射出 sleep(1) turn_left(1.7) #左に旋回 sleep(1) move_forward(0.7) #位置調整 sleep(1) turn_left(1) #位置調整 sleep(1) line_trace_right(1,40) #L'からK'まで線の右側に沿って動く sleep(1) turn_left(0.5) #ロボットが線に平行になるように左旋回する sleep(1) move_forward(6) #コース用紙とコース用紙の境目まで移動
sleep(1) move_forward(4.5) #前進 line_trace_right(1,40) #Kまでライントレース sleep(1) turn_right(0.6) #位置調整 sleep(1) move_back(4.2) #ピンポン玉に当たらないよう後退 sleep(1) arm_move(6,-200) #アームを下げる sleep(1) move_forward(2.2) #回収地点まで前進 sleep(1) catch_up(550,750) #ピンポン玉の回収 sleep(1) turn_right(2.7) #ロボットを右旋回 sleep(1) move_forward(3) #射出位置まで移動 sleep(1) turn_right(2.5) #位置調整 move_back(2) #位置調整 sleep(1) arm_move(1,300) #射出 turn_left(1.5) #コース外へ移動するため位置調整 sleep(1) move_forward(3) #コース外へ移動
最後の課題では前回の課題のプログラムロボットが利用できたが、なかなか思うようにロボットが動かず、同じプログラムでも同じ動きをしないことが多々あった。本番前も何度も調整したりして良い動きをすることもあったが本番では充電切れで一体のロボットは機能しなくなってしまった。もう一体のロボットは練習通りの動きをしてきちんと箱をつかんで運べてピンポン玉一個回収することに成功した。結果としては散々なものでロボットを思い通りに動かすことの難しさを痛感させられた。この経験はとても貴重なものとなった。