ライントレースロボットの作成
できるだけ速く、正確にライントレースすること。プログラムを簡潔に書くことを目標とした。
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
ColorSensorを本体の左寄りにしてラインの左端を沿うプログラムでラインの真上をなぞるように動くようにした。
!/usr/bin/python import ev3dev.ev3 as ev3 import time m = ev3.LargeMotor('outA') n = ev3.LargeMotor('outB') cs = ev3.ColorSensor('in1') s = ev3.Sound()
def trace(): #ライン上、ライン境界、ライン外の三段階で明るさを感知しライン境界では直進し他の場合は境界方向に曲がりジグザグ走行する。0.22秒以上ライン上にあるときにそれを交差点と判断して停止する。
t0 = time.time() while time.time() - t0 < 0.22: if cs.value () > 30: m.run_forever(duty_cycle_sp=-30) n.run_forever(duty_cycle_sp=20) t0 = time.time() elif cs.value () >= 10: m.run_forever(duty_cycle_sp=35) n.run_forever(duty_cycle_sp=35) t0 = time.time() else: m.run_forever(duty_cycle_sp=20) n.run_forever(duty_cycle_sp=-30)
def straight(): #交差点を通過する。traceでは確実に交差点にまっすぐ進入できないことも多かったので少し斜めに走らせた。
m.run_forever(duty_cycle_sp=40) n.run_forever(duty_cycle_sp=30) time.sleep(0.5)
def left():
m.run_forever(duty_cycle_sp=30) n.run_forever(duty_cycle_sp=-30) time.sleep(0.8) #左に90°旋回する
def ring(): #交差点進入時に音を鳴らす。
s.beep()
trace() ring() straight() trace() ring() straight() trace() ring() straight() trace() ring() straight() trace() ring() left() m.run_forever(duty_cycle_sp=50) n.run_forever(duty_cycle_sp=50) time.sleep(1.5) #最後の交差点で旋回したのちゴールまで駆け抜ける m.stop n.stop
46秒でゴールした。