目次
今回の課題はライントレースです。
あらかじめ先生によって決められたコースを、自分たちで紙に描き、用意された3つのミッションを班のメンバーで1つずつ担当して、そのミッションにしたがってライントレースをするロボットを作る、というのが今回の課題の詳細です。
また、交差点では一秒間停止しなければならないという条件もあります。
僕が担当したミッションは
C地点からA地点
C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点
というコースです。
用意された3つのミッションの中で最も長く、右左折も多いミッションです。
ロボットはこんな感じです。
センサーはロボットに密着するほど近くに設置しています。
前回よりも着脱を簡単にし、すっきりした見た目になるようにもしています。
センサーは紙面から約1cmほどの距離で設置しています。
近すぎることはなく、正確にセンサーが働いてくれる距離です。
#!/usr/bin/python import ev3dev.ev3 as ev3 import time mr=ev3.LargeMotor('outA') ml=ev3.LargeMotor('outB') cs=ev3.ColorSensor('in1') def line(): t0=time.time() while time.time()-t0 < 0.35: if cs.value() > 50: mr.run_forever(duty_cycle_sp=60) ml.run_forever(duty_cycle_sp=-30) t0=time.time() else: mr.run_forever(duty_cycle_sp=-30) ml.run_forever(duty_cycle_sp=60) def cross(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() mr.stop() ml.stop() line() cross(1000,0,0) cross(1000,17,-17) #交差点を左折する cross(800,30,-30) cross(1000,10,10) line() cross(1000,0,0) cross(1000,17,-17) #交差点を左折する cross(900,30,-30) cross(1000,10,10) line() cross(1000,0,0) cross(1100,-20,20) #交差点を直進する cross(1000,13,13) line() cross(1000,0,0) cross(1100,-17,17) #交差点を直進する cross(1000,13,13) line() cross(1000,0,0) cross(1000,17,-17) #交差点を右折する cross(1400,-40,40) cross(1400,10,10) line() cross(1000,0,0) cross(1000,17,-17) #交差点を左折する cross(1000,10,-10) cross(1000,10,10) line() cross(1000,0,0) cross(1000,-17,17) #交差点を直進してA地点に到着 cross(1000,13,13)
mr=ev3.LargeMotor('outA') ml=ev3.LargeMotor('outB') cs=ev3.ColorSensor('in1')
ここで、モーターAは右のタイヤなので、motor rightでmr
同じ要領でml、csを決めています。
def line(): t0=time.time() while time.time()-t0 < 0.35: if cs.value() > 50: mr.run_forever(duty_cycle_sp=60) ml.run_forever(duty_cycle_sp=-30) t0=time.time() else: mr.run_forever(duty_cycle_sp=-30) ml.run_forever(duty_cycle_sp=60)
ここでは、ラインを直進するときの挙動を定義しています。
黒を感知したとき(cs.valueが50以上のとき)は、右に曲がり
白を感知したとき(cs.valueが50未満のとき)は、左に曲がるようになっていて
0.35秒以上黒を感知したとき(つまり交差点のとき)は止まるようになっています。
こうすることで、ジグザグにライントレースをし、交差点では止まることができます。
def cross(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()
このプログラムは、交差点での挙動を定義するプログラムです。
ここで定義することで、交差点での挙動を
cross(時間,左タイヤの動き,右タイヤの動き)
というプログラミングで簡潔にわかりやすくできます。
line() cross(1000,0,0) cross(1000,17,-17) cross(800,30,-30) cross(1000,10,10)
一つ目の交差点を左折するプログラムです。
line() cross(1000,0,0) cross(1000,17,-17) cross(900,30,-30) cross(1000,10,10)
二つ目の交差点を左折するプログラムです。
一つ目の交差点を左折するプログラムとは少し数値が違いますが、なぜ違うのかわかりませんでした。
同じ数値ではなぜか2つ目の交差点では左折することができなかったので、微調整をした結果、二つ目はこうなりました。
line() cross(1000,0,0) cross(1100,-20,20) cross(1000,13,13) line() cross(1000,0,0) cross(1100,-17,17) cross(1000,13,13)
三つ目、四つ目の交差点を直進するプログラムです。
これもまた、二つが微妙に数値が違いますが、前述と同じく、原因がわからなかったので、微調整して数値を決定しました。
line() cross(1000,0,0) cross(1000,17,-17) cross(1400,-40,40) cross(1400,10,10)
五つ目の交差点を右折するプログラムです。
今回のライントレースはラインの左側をトレースしていて、左折とは違い、右折では少し大きく曲がる必要があったので、数値が少し大きくなっています。
line() cross(1000,0,0) cross(1000,17,-17) cross(1000,10,-10) cross(1000,10,10)
六つ目の交差点を左折するプログラムです。
line() cross(1000,0,0) cross(1000,-17,17) cross(1000,13,13)
最後の交差点で直進をするプログラムです。
これでゴール地点であるA地点に到着です。
今回は前回ほど苦労はしませんでした。
というのも、前回は初めてのプログラミングで、右も左もわからない状態から始まったのが、今回はその前回の経験、教訓があったので、基本的にプログラミングで悩むことは少なかったからです。
今回の課題も大変でしたが、個人的に大変だったのは、コースが長かったこと、一つだけ右折があり、そこのプログラミングがなかなかうまくできなかったことでした。
特に、今回のライントレースはラインの左側を感知しながら進むやり方をとっていたので、右折のときは、左折のときとは違い、数値を大きく変えなければならず、かなり苦労しました。
今回の反省点は、同じ直進、左折なのに、同じ数値では同じ動きをしなかった原因を解明できなかったこと、交差点で音声を出すことができなかったことです。
次回は、前回、今回の教訓を踏まえて、もっと効率的に、いろいろなことができるように努力しなければならないと思いました。