はじめに
根塊の課題の内容は「ライントレースロボット」の作成
コースは↑のA〜Bまで
道順も「A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点」と細かく決められている模様
つまりは↓図のように移動するプログラムを作るのが今回の課題
ロボットについて
大まかな作りは前回とほぼ同様
今回もEV3を使用します
それに光センサーを取り付けました
プログラム
上手にdefineしてプログラムを簡単にしようと思い、奮闘したけどエラーで動かず
原因究明のために、同じグループメンバーのプログラムをコピペしたがなぜかエラー
結局諦め、別の方法で書くことに
今回も前回同様、下のように定義
mr = ev3.LargeMotor('outB') ml = ev3.LargeMotor('outA') cs = ev3.ColorSensor('in1') mr_stop = mr.stop(stop_command='brake') ml_stop = ml.stop(stop_command='brake')
交差点と曲がり角を識別するためにはセンサーが何秒間黒と認識したかによって見分けさせます
今回は0.2秒以上黒と認識すれば交差点と認識し、停止します
詳しいプログラムは下
全体のプログラムはこのようになります
#!/usr/bin/python import ev3dev.ev3 as ev3 import time
mr = ev3.LargeMotor('outB') ml = ev3.LargeMotor('outA') cs = ev3.ColorSensor('in1') mr_stop = mr.stop(stop_command='brake') ml_stop = ml.stop(stop_command='brake')
t0 = time.time() while time.time() - t0 < 0.2 : if cs.value () > 40 : mr.run_forever(duty_cycle_sp=-10) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 30 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 12 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-10) t0 = time.time()
else : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-30)
mr.stop() ml.stop()
time.sleep(1)
これでライントレースしながら進み、一つ目の交差点で一秒間停止します
mr.run_forever(duty_cycle_sp=50) ml.run_forever(duty_cycle_sp=50) time.sleep(0.4)
mr_stop ml_stop time.sleep(0.3)
交差点で一時停止→少し前進、又は曲がって前進→ライントレース再開を繰り返していきます
続きは↓
t0 = time.time() while time.time() - t0 < 0.2 : if cs.value () > 40 : mr.run_forever(duty_cycle_sp=-10) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 30 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 12 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-10) t0 = time.time()
else : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-30)
mr.stop() ml.stop()
time.sleep(1)
r.run_forever(duty_cycle_sp=20) ml.run_forever(duty_cycle_sp=40) time.sleep(0.2)
mr_stop ml_stop time.sleep(0.2)
t0 = time.time() while time.time() - t0 < 0.2 : if cs.value () > 40 : mr.run_forever(duty_cycle_sp=-10) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 30 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 12 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-10) t0 = time.time()
else : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-30)
mr.stop() ml.stop()
time.sleep(1)
mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=40) time.sleep(0.2)
mr_stop ml_stop time.sleep(0.3)
t0 = time.time() while time.time() - t0 < 0.2 : if cs.value () > 40 : mr.run_forever(duty_cycle_sp=-10) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 30 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=30) t0 = time.time()
elif cs.value () > 12 : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-10) t0 = time.time()
else : mr.run_forever(duty_cycle_sp=30) ml.run_forever(duty_cycle_sp=-30)
mr.stop() ml.stop()
time.sleep(1) mr.run_forever(duty_cycle_sp=50) ml.run_forever(duty_cycle_sp=-50) time.sleep(0.25) mr_stop ml_stop time.sleep(0.3) mr.run_forever(duty_cycle_sp=50) ml.run_forever(duty_cycle_sp=50) time.sleep(1) mr_stop ml_stop time.sleep(0.3)
これでゴール
今回も長くなってしまいました
具体的な動きですが、基本的にはライントレース。交差点と判断したら停止。少し前進または曲がって再びライントレース
という動きを繰り返します
クリアタイムは52秒でした
最後に
第10講義室と自室では明るさが違うせいでしょうか。交差点を見分けるために細かな微調整を頻繁に変えることが必要でした
そこが今回一番めんどう難しかったところです
いまだにグループメンバーのプログラムをわたしが動かそうと思っても動かない問題の原因はわかっていません
そこの究明も近いうちに行い、最終課題に向けて知識を深めていきたいです