*目次 [#x421dcc9]
#contents
*はじめに [#u0445827]
#ref(DSC_0459.JPG)
今回の課題は経路を黒い線にそって動くロボットの作成である。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止するという条件がある。~
私はB地点からC地点へ ・B地点 → ��R右折 → ��Q直進 → ��Q直進 →��P右折 → ��S右折 → C地点 このコースを走らせた。
*ロボットの説明 [#g224fc57]
#ref(DSC_0439.JPG)
今回、黒線と下地の白の左側の境界に合わせてライントレースをするように考えた。なので、左に曲がるときに少し小回りがきくようにColorSensorを機体正面から見て右側に取り付けた。
#ref(DSC_0445.JPG)
また、走行中に黒と白のColorValueを安定させるため、ColorSensorは地面から約1cm離れて取り付けられるようにした。機体だけで考えると、前回の課題1とほぼ同じ作りになっている。
*プログラムの説明 [#x7a17a04]
#!/usr/bin/python
import ev3dev.ev3 as ev3
import time
まず、ev3とtime関数を導入する。
ml = ev3.LargeMotor('outA')
mr = ev3.LargeMotor('outB')
cs = ev3.ColorSensor('in1')
mlを機体左のモーター~
mrを機体右のモーターとした。~
csは機体前方に取り付けたカラーセンサーである。
def line_follow():
t0 = time.time()
while time.time() - t0 < 0.3 :
if cs.value () > 38 :
mr.run_forever(duty_cycle_sp=0)
ml.run_forever(duty_cycle_sp=30)
t0 = time.time()
elif cs.value () > 30 :
mr.run_forever(duty_cycle_sp=20)
ml.run_forever(duty_cycle_sp=20)
t0 = time.time()
elif cs.value () > 12 :
mr.run_forever(duty_cycle_sp=30)
ml.run_forever(duty_cycle_sp=-15)
t0 = time.time()
else :
mr.run_forever(duty_cycle_sp=30)
ml.run_forever(duty_cycle_sp=-5)
次に行ったのはカラーセンサーを使った通常のライントレースのプログラミングである。ライントレースのプログラムはline_followで定義した。上記のプログラミングについて説明をする。
t0 = time.time()
while time.time() - t0 < 0.3 :
上記のプログラムはev3が下記で説明するifまたは、elifの内容を0.3秒より長い時間で検出した場合にはifやelifのプログラムを通過するようになっている。また、ifまたはelifのプログラムを抜け、0.3秒より長くelseのプログラム、つまり黒を検出した場合はwhileのプログラムから抜け出し停止するような設定である。~
それではif、elifのプログラムを見ていこう。
if cs.value () > 38 :
mr.run_forever(duty_cycle_sp=0)
ml.run_forever(duty_cycle_sp=30)
t0 = time.time()
ここで、if構文を用いてまずcs.valueが38を超えるとき、つまり白の時は左モーターだけを回転させ右に曲がるように設定した。また、cs.valueが38を超えないときは、つまり黒に少しだけ入ったとき、このプログラムを通過する。
elif cs.value () > 30 :
mr.run_forever(duty_cycle_sp=20)
ml.run_forever(duty_cycle_sp=20)
t0 = time.time()
elif cs.value () > 12 :
mr.run_forever(duty_cycle_sp=30)
ml.run_forever(duty_cycle_sp=-15)
t0 = time.time()
そして上記に続き、elif構文を用い、cs.valueが31〜38の時、つまりラインの境界の時は直進をするようにプログラムし、cs.valueが30より大きい値だとプログラムを通過するというようになっている。またcs.valueが13〜30の時、つまりラインの境界と中心の間にいるとき、左にすこし旋回するようにしている。cs.valueが12より小さいときはこのプログラムを通過する。
else :
mr.run_forever(duty_cycle_sp=30)
ml.run_forever(duty_cycle_sp=-5)
最後にelse文を用いて、上記のプログラムを全て通過したとき、つまりラインの中央で動いたとき、左に曲がるプログラムにした。
def cross_forward(t):
mr.run_forever(duty_cycle_sp=10)
ml.run_forever(duty_cycle_sp=20)
time.sleep(t/1000)
mr.stop()
ml.stop()
def cross_left(t):
mr.run_forever(duty_cycle_sp=20)
ml.run_forever(duty_cycle_sp=-20)
time.sleep(t/1000)
mr.stop()
ml.stop()
def cross_right(t):
mr.run_forever(duty_cycle_sp=-10)
ml.run_forever(duty_cycle_sp=30)
time.sleep(t/1000)
mr.stop()
ml.stop()
上記のプログラムでは前回の課題1を利用して交差点で止まったときに交差点での次の動きをスムーズにするために交差点直進、交差点左折、交差点右折をそれぞれcross_forward、cross_left、cross_rightで定義した。また、()の中に時間を入れることでそれぞれのプログラムの動作時間を設定できる。ただし、ここではtは1/1000秒であることに注意する。
下記が実際のライントレースのB地点からC地点のプログラミングである。
line_follow() #B地点から�,慮鮑硬世泙妊薀ぅ鵐肇譟璽�
mr.stop() #交差点でストップ
ml.stop()
time.sleep(3)
cross_right(2000) #�,慮鮑硬世魃�折
line_follow() #�,慮鮑硬世魏瓩�てから�△慮鮑硬世泙妊薀ぅ鵐肇譟璽�
mr.stop() #交差点でストップ
ml.stop()
time.sleep(3)
cross_forward(1000) #�△慮鮑硬世鯆梢�
line_follow() #�△慮鮑硬世�ら��の交差点までライントレース
mr.stop() #交差点でストップ
ml.stop()
time.sleep(3)
cross_forward(1000) #��の交差点を直進
line_follow() #��の交差点から�い慮鮑硬世泙妊薀ぅ鵐肇譟璽�
mr.stop() #�い慮鮑硬世妊好肇奪�
ml.stop()
time.sleep(3)
cross_right(2000) #�い慮鮑硬世魃�折
line_follow() #�い慮鮑硬世�ら�イ慮鮑硬世泙妊薀ぅ鵐肇譟璽�
mr.stop() #�イ慮鮑硬世妊好肇奪�
ml.stop()
time.sleep(3)
cross_right(2000) #�イ慮鮑硬世魃�折
line_follow() #�イ慮鮑硬世�らC地点までライントレース
mr.stop() #C地点の入り口でストップ
ml.stop()
cross_forward(3000) #C地点に入ってストップ
*感想 [#wa9bb61f]
今回の課題では、前回のプログラミングを生かして交差点での次の動作をすることは簡単だった。しかし、if文でライントレースをするのが最初難しかった。しかし、検証を何度も行い、白と黒の境界、また黒ラインの中での色の濃さによるプログラムを安定させることが出来た。