*目次 [#eef34d77] #contents *はじめに [#nece2545] 今回の課題はライントレースをするロボットのプログラミングであった。 今回の課題の目標は ・定義等を用いて単純でわかりやすいプログラムにすること ・ロボットのパーツはできるだけ少なくすること ・できるだけ早い時間でゴールすること ・交差点では1秒間止まり、止まったとき音を出す ということであった。 *課題2について [#n7719eb3] &ref(2016a/Member/naho/Mission2/2016a-mission2.png,50%,図); 私はBからCに到達するロボットのプログラミングをした。 交差点では右折するか直進するかの2択であった。 急カーブを曲がりきるためにはカーブを外回りに回った方が良いが、交差点のプログラムの都合上ラインの右側をトレースさせることにした。 *ロボットについて [#i47f81cd] 本体 ・本体 &ref(2016a/Member/naho/Mission2/S_4558945048711.jpg,20%,本体); 基本的な構造は課題1と同様となっている ・カラーセンサー部 カラーセンサー部 &ref(2016a/Member/naho/Mission2/S_4558945093428.jpg,20%,カラーセンサー); カラーセンサーがタイヤから遠すぎると多少の動きで数値が激しく変化し、進みが遅くなってしまう。 反対に、近すぎてもカラーセンサーの位置がほとんど変わらなくなってしまう。そのため、今回はカラーセンサーの位置に気を遣いながらロボットの組み立てを行った。 *プログラミング [#e691b45d] #!/usr/bin/python 2行目以降の内容を/usr/bin/pythonへの入力として取り扱う。 import ev3dev.ev3 as ev3 import time ev3dev.ev3をev3として導入する。 また、timeという関数を導入する。 ml = ev3.LargeMotor('outA') mr = ev3.LargeMotor('outB') cs = ev3.ColorSensor('in1') s = ev3.Sound() プログラミングで動かすパーツについて上記のように略称を定義した。 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) 上記の定義は、カラーセンサーが黒を0,35秒以内だけ感知したときの場合、 黒を感知している(カラーセンサーの値が50以上)ときは右に曲がるように進み、 白を感知している(カラーセンサーの値が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(動作時間、左輪のパワー、右輪のパワー) とおいている。 動作時間は1/1000秒単位となっている。 mr.stop() ml.stop() line() cross(1000,0,0) cross(1000,-17,17) cross(1000,30,-30) cross(1000,10,10) s.speak('right').wait() 1つめの交差点で右に曲がる line() cross(1000,0,0) cross(1000,-17,17) cross(1000,13,13) s.speak('straight').wait() 2つめの交差点では直進する line() cross(1000,0,0) cross(1000,-17,17) cross(1000,13,13) s.speak('straight').wait() 3つめの交差点では直進する line() cross(1000,0,0) cross(1000,-17,17) cross(1000,30,-30) cross(1000,10,10) s.speak('right').wait() 4つめの交差点では右に曲がる line() cross(1000,0,0) cross(1000,-17,17) cross(1000,30,-30) cross(1000,10,10) s.speak('right').wait() 5つめの交差点では右に曲がる line() cross(1000,-17,17) cross(1000.30.30) cross(1500,30,30) s.speak('goal').wait() ゴールする *反省点 [#se92ec75] 前回の似顔絵ロボットのプログラミングとくらべるとはるかにすっきりとしたわかりやすいプログラミン グとなったと思うが、もっとすっきりとしたプログラミングにできたのではないかと思う。 例えば、右に曲がるときとまっすぐに進むときで定義をすればなんども同じプログラムを書く必要はなかったので、そのようにしたかったが知識と技量が足りなかった。 また、ゴールすることを最優先に考えた結果、ロボットの動きの左右の動きが激しくなってしまい、あまり早くゴールすることができなかった。 *感想 [#qbdd39d1] 今回の課題は前回ほどギリギリで辛い状況にはならなかったのでよかった。 だが、改善点も多くあった。私のライントレースロボットはゴールするまでに「85秒」かかった。 もっと短い時間でゴールするようなプログラムをかければよかった。 今回のプログラミングでも改善点は多く見つかったが、解決することができなかった。 しかし、前回のプログラミングよりは格段に成長したと思うので、課題3ではいままでの集大成として満足のいくプログラミングを書きたい。