2016a/Member

目次

課題

自分の担当するライントレース

C地点からA地点へ (三人目)

C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

ロボットの概形

ロボットの概形は以下の通りである

547 KB,ev3の概形である

全体の概形である

光センサー側

光センサー側

モーター側

モーター側

光センサーの考え方

下記のプログラムを例にして説明する。

t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40) 

黒線に入ればとっさに白の方へ移動する

                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40) 

  白生地に入れば黒線の方へ移動する

                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)

t0に前回の時間が入っていて、 time.time()で現在の時間が得られるので、 time.time() - t0というのは今回と前回の時間の差になります。

ということで、 while time.time() - t0 < 0.37は 「今回と前回の時間の差が0.37秒未満である間ループを継続する」 という意味になります。

t0がif cs.value () 30 :の条件において設定されているので 白から黒に渡りきるときに時刻をリセットして 黒を渡った時間が0,37未満になれば、 (つまり、黒線に入ってから白線にはいるの要した時間が0,37未満)

ループを継続することができます。

交差点を止まる方法はこれを利用したものである。 交差点は幾何的に黒部分の集中があるため、 黒の移動時間が長くなり、上のプログラムのif文のループを継続できなくなる地点ができる。

サブルーチンで交差点を認識する方法があったが、 あえて挑戦しようと思いこの方法で交差点をとまった。

また、今回と前回の時間の差が〜秒未満の〜はロボットが 移動するたびに位置が不安定になるため、(if文のループを始める際 黒線と白線の境に直線に沿ってほぼ並行になるような位置にロボットを置く必要がある。) 調整した。

プログラミング

#!/usr/bin/python
import ev3dev.ev3 as ev3
import time
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outA')
cs = ev3.ColorSensor('in1')
def go(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()

c→s

t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)

go(1850,21,-21)ほぼ90回転

s→p

t0 = time.time()
while time.time() - t0 < 5.0 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)

s→pへ移動中中途半端に止まってしまったので

t0 = time.time()
while time.time() - t0 < 0.38 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
go(1000,20,20) 少し前に進む
go(1000,28,-28)ほぼ90回転

p→q

t0 = time.time()
while time.time() - t0 < 0.41 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=20)
t0 = time.time()
while time.time() - t0 < 0.3 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=20)
q→q
go(1850,30,20)黒線上の真ん中からはし際に移動する
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
go(1850,30,20)
t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
go(2000,30,30)
t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)                                      
                ml.run_forever(duty_cycle_sp=40)
t0 = time.time()
while time.time() - t0 < 0.5 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)

r→p

t0 = time.time()
while time.time() - t0 < 0.4 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
go(1800,30,-30)ほぼ90回転
t0 = time.time()
while time.time() - t0 < 0.25 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)

p→a

go(1800,30,-30)
t0 = time.time()
while time.time() - t0 < 0.37 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
t0 = time.time()
while time.time() - t0 < 1.2 :
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)
go(1000,30,-30)
t0 = time.time()
while time.time() - t0 < 0.4:
        if cs.value () > 30 :
                mr.run_forever(duty_cycle_sp=40)
                ml.run_forever(duty_cycle_sp=20)
                t0 = time.time()
        else :
                mr.run_forever(duty_cycle_sp=20)
                ml.run_forever(duty_cycle_sp=40)

到着。

感想

前回の絵描きロボットよりも格段と難しかった。 カラーセンサーの反応の士具合が非常に扱いにくいせいだ。 これからロボット関係のことに触れることがあればカラーセンサーの苦手は克服したい。


添付ファイル: filer0.PNG 209件 [詳細] filer3.png 104件 [詳細] filer3.jpg 46件 [詳細] filer2.png 99件 [詳細] filer1.png 105件 [詳細] filero (3).JPG 65件 [詳細] filero (2).JPG 57件 [詳細] fileらいん.PNG 45件 [詳細] filero (1).JPG 48件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-02 (火) 23:39:36 (1114d)