目次

課題

ライントレースロボットの作成

できるだけ速く、正確にライントレースすること。プログラムを簡潔に書くことを目標とした。

コース概要

2016a-mission2.png

A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点

ロボットの形状

1467898893148.jpg
1467898883732.jpg

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秒でゴールした。

反省・感想

  • 交差点認識プログラムについて考えるのに時間をかけすぎてしまった。
  • traceを改良してもっと早くゴールまでたどり着けるようにしたかった。

添付ファイル: file2016a-mission2.png 88件 [詳細] file1467898883732.jpg 90件 [詳細] file1467898893148.jpg 94件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-04 (木) 13:41:15