[[2016a/Member]] 目次 #contents *課題 [#aa0de297] #ref(./r0.PNG,自分の担当するライントレース) C地点からA地点へ (三人目) ~C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点 *ロボットの概形 [#udfdcfd8] ~ロボットの概形は以下の通りである #ref(./r1.png,547 KB,ev3の概形である) 全体の概形である ~ #ref(./r2.png,光センサー側) 光センサー側 ~ #ref(./r3.png,モーター側) モーター側 *光センサーの考え方 [#b7aef466] 黒線に入ればとっさに白の方へ移動する(if文とelse文のループが抜けてしまうため) 下記のプログラムを例にして説明する。 t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) 黒線に入ればとっさに白の方へ移動する mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) 白生地に入れば黒線の方へ移動する 白生地に入れば黒線の方へ移動する mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) ~if文でこの動作を実現する。自分の場合は黒線の端すれすれじゃないと実現できなかった。 ~t0に前回の時間が入っていて、 time.time()で現在の時間が得られるので、 time.time() - t0というのは今回と前回の時間の差になります。 また、交差点では黒線が集中するのでそれを利用して、ループを終わらせる。 ~ということで、 while time.time() - t0 < 0.37は 「今回と前回の時間の差が0.37秒未満である間ループを継続する」 という意味になります。 ~t0がif cs.value () 30 :の条件において設定されているので 白から黒に渡りきるときに時刻をリセットして 黒を渡った時間が0,37未満になれば、 (つまり、黒線に入ってから白線にはいるの要した時間が0,37未満) ループを継続することができます。 ~交差点を止まる方法はこれを利用したものである。 交差点は幾何的に黒部分の集中があるため、 黒の移動時間が長くなり、上のプログラムのif文のループを継続できなくなる地点ができる。 ~サブルーチンで交差点を認識する方法があったが、 あえて挑戦しようと思いこの方法で交差点をとまった。 ~また、今回と前回の時間の差が〜秒未満の〜はロボットが 移動するたびに位置が不安定になるため、(if文のループを始める際 黒線と白線の境に直線に沿ってほぼ並行になるような位置にロボットを置く必要がある。) 調整した。 *プログラミング [#ta9e8ea5] #!/usr/bin/python import ev3dev.ev3 as ev3 import time mr = ev3.LargeMotor('outB') ml = ev3.LargeMotor('outA') cs = ev3.ColorSensor('in1') def go(t,dl,dr): mr.run_forever(duty_cycle_sp=dr) ml.run_forever(duty_cycle_sp=dl) time.sleep(t/1000) ml.stop() mr.stop() c→s t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(1850,21,-21)ほぼ90回転 s→p t0 = time.time() while time.time() - t0 < 5.0 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) s→pへ移動中中途半端に止まってしまったので t0 = time.time() while time.time() - t0 < 0.38 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(1000,20,20) 少し前に進む go(1000,28,-28)ほぼ90回転 p→q t0 = time.time() while time.time() - t0 < 0.41 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=20) t0 = time.time() while time.time() - t0 < 0.3 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=20) q→q go(1850,30,20)黒線上の真ん中からはし際に移動する while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(1850,30,20) t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(2000,30,30) t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) t0 = time.time() while time.time() - t0 < 0.5 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) r→p t0 = time.time() while time.time() - t0 < 0.4 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(1800,30,-30)ほぼ90回転 t0 = time.time() while time.time() - t0 < 0.25 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) p→a go(1800,30,-30) t0 = time.time() while time.time() - t0 < 0.37 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) t0 = time.time() while time.time() - t0 < 1.2 : if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) go(1000,30,-30) t0 = time.time() while time.time() - t0 < 0.4: if cs.value () > 30 : mr.run_forever(duty_cycle_sp=40) ml.run_forever(duty_cycle_sp=20) t0 = time.time() else : mr.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) 到着。 *感想 [#f71d408a] 前回の絵描きロボットよりも格段と難しかった。 カラーセンサーの反応の士具合が非常に扱いにくいせいだ。 これからロボット関係のことに触れることがあればカラーセンサーの苦手は克服したい。