目次 *課題 [#d953fbca] **課題内容 [#o82eb2be] -今回の課題はミッション通り、下図の通り黒い線に沿って、350mlの空き缶を移動させるロボットを作ることである。 #ref(2018a-mission2.png) -ミッションとは下記のとおりである。(私は第一コースを選択した。) --Aをスタート --Bを直進 --Cで一時停止の後、直進 --Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る --DからEに向かい、Eを直進 --Fを左折 --Gで一時停止の後、左折 --Hで一時停止の後、右折 --Iで一時停止の後、右折 --Lを直進 --Kを直進 --Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう --Bで一時停止の後、左折 --Aで停止 --(一時停止の指定がある場所は、1秒間停止すること) *ロボットについて [#o524d935] **ロボット全体 [#dddc2682] #ref(s_IMG_0381.jpg) **センサーの位置 [#z3f5b4d3] どの位置が一番よいか試行錯誤した結果、中央付近にセンサーがあったほうがミッションを達成しやすそうだったので中央に設置した。 #ref(s_IMG_0383.jpg) **アーム [#tb51bf23] 空き缶を置いた後、ロボットが空き缶に当たらないようにするため、最大限にアームを上げることにより、ほぼロボットと一体となるように作った。 #ref(s_IMG_0382.jpg) *プログラムについて [#pad780c0] valueの値を細かく設定することにより、急カーブでも曲がれるようにプログラムした。 下の画像でどの位置でどの程度のvalue値が出るのかを説明する。 #ref(robo.png) ロボットはは赤矢印のように進んでいく。青矢印のぶん進むとロボットが交差点と認識し止まる。 #ref(2.png ) #ref(2.png) **モジュールとインスタンス設定 [#a5834c60] #!/usr/bin/env python3 from ev3dev.ev3 import * import ev3dev.ev3 as ev3 import time arm = ev3.MediumMotor('outC') #アーム mr = ev3.LargeMotor('outD') #右のタイヤ ml = ev3.LargeMotor('outA') #左のタイヤ cs = ev3.ColorSensor('in1') #カラーセンサー **定義 [#f41bab99] -モーターのリセット def mi(): ml.reset() mr.reset() arm.reset() -ライントレース~ value値を細かく設定しているので急カーブでも(外側なら)これで曲がることができる。~ 左からライントレースさせるプログラム def lf(): mi() t0 = time.time() while time.time()-t0 < 0.38: if cs.value() > 70: mr.run_forever(speed_sp=-100) ml.run_forever(speed_sp=100) t0 = time.time() elif cs.value() > 60: mr.run_forever(speed_sp=-80) ml.run_forever(speed_sp=200) t0 = time.time() elif cs.value() > 50: mr.run_forever(speed_sp=300) ml.run_forever(speed_sp=300) elif cs.value() > 40: mr.run_forever(speed_sp=200) ml.run_forever(speed_sp=-80) t0 = time.time() else: mr.run_forever(speed_sp=100) ml.run_forever(speed_sp=-100) 右からライントレースさせるプログラム def rf(): mi() t0 = time.time() while time.time()-t0 < 0.38: if cs.value() > 70: mr.run_forever(speed_sp=100) ml.run_forever(speed_sp=-100) t0 = time.time() elif cs.value() > 60: mr.run_forever(speed_sp=200) ml.run_forever(speed_sp=-80) t0 = time.time() elif cs.value() > 50: mr.run_forever(speed_sp=300) ml.run_forever(speed_sp=300) elif cs.value() > 40: mr.run_forever(speed_sp=-80) ml.run_forever(speed_sp=200) t0 = time.time() else: mr.run_forever(speed_sp=-100) ml.run_forever(speed_sp=100) -一秒間静止するプログラム def wait(): mi() mr.run_forever(speed_sp=0) ml.run_forever(speed_sp=0) time.sleep(1) -前進させるプログラム def gost(t): mi() mr.run_timed(time_sp=t, speed_sp=300, stop_action='brake') ml.run_timed(time_sp=t, speed_sp=300, stop_action='brake') sleep(1) -位置を右にずらすプログラム def tr(t): mi() mr.run_timed(time_sp=t, speed_sp=-200, stop_action='brake') ml.run_timed(time_sp=t, speed_sp=200, stop_action='brake') sleep(1) -位置を左にずらすプログラム def tr(t): mi() mr.run_timed(time_sp=t, speed_sp=200, stop_action='brake') ml.run_timed(time_sp=t, speed_sp=-200, stop_action='brake') sleep(1) -アームを下げる def af(t): mi() arm.run_timed(time_sp=t, speed_sp=-300, stop_action='brake') sleep(1) -アームを上げる def ab(t): mi() arm.run_timed(time_sp=t, speed_sp=300, stop_action='brake') sleep(1) **プログラムの全容 [#x0b3493a] gost(700) #Aから出発 lf() #AからCまでライントレース wait() #Cで一秒停止 gost(200) #tr()も含めて直進する命令 tr(200) lf() #Cからライントレース wait() #Dで一秒停止 tr(150) #空き缶をつかむため少し戻る am(550) #空き缶をつかむ lf() #DからEを直進するための命令 gost(100) tr(100) lf() #EからGまでこれで進む wait() #Gで一秒停止 rf() #ここからHまで右からライントレース wait() #Hで一秒停止 rf() #Iまで進む wait() #Iで一秒停止 rf() #IからJまで直進するための命令 gost(100) tl(100) rf() gost(100) tl(100) rf() wait() #Jで一秒停止 tl(1050) #Yに空き缶を置くため旋回させる ab(550) #アームを上げる tl(1050) #その場で180°旋回させるとロボットが空き缶に当たってしまうので gost(150) #少し前進させた後 tl(500) #左からライントレースできる位置にする lf() wait() #Bで一秒停止 lf() tr(200) #交差点と認識してlf()は終了するのでその後少し右に戻して gost(700) #前進させる *まとめ [#x5e18bb0] 点Eなどの円と直線の交わる場所ではご認識が多く、またアームの範囲が狭いので、うまく缶をつかんでくれないなどの欠点がある。さらに、GからHにかけての急カーブでは内側を回ることがほとんどできなかった。このため、成功確率は極めて低い状況であった。~ 次の課題では十分な時間をかけて成功させたい。