- 追加された行はこの色です。
- 削除された行はこの色です。
[[2017a/Member]]
*目次 [#g516ec1b]
#contents
*課題内容 [#p5f4db28]
&ref(2017a/Member/irin/Mission2/マップ.png,60%,コース);
-課題内容は次の経路に沿ってライントレースをするロボットを製作することである。
--E直進
--F(SOUND_UP)
--Q一時停止(SOUND_DOWN)&左折
--R直進(SOUND_UP)
--S左折(SOUND_UP)
--G(SOUND_UP)
--H(SOUND_UP)
--T一時停止(SOUND_DOWN)&直進
--T一時停止(SOUND_DOWN)&直進
--R一時停止(SOUND_DOWN)&左折
--S直進(SOUND_UP)
--P左折(SOUND_UP)
--E一時停止(SOUND_DOWN)&左折
--A停止(SOUND_DOWN)
*ロボットの説明 [#p20a4c3a]
**実際に動いているところ [#be8fa4b8]
https://www.youtube.com/watch?v=xUq5ioWZRWA
**本体について [#xec12109]
&ref(2017a/Member/irin/Mission2/俯瞰1.JPG,60%,EV3上部);
今回のロボット製作で注意したことの一つとして、車輪の幅が挙げられる。
というのも、現在の車輪幅に至る前に、現在より広い車輪幅で製作していたところ小回りが
効きにくく、安定性に欠けることが判明したからである。
そこで、車輪幅を狭くし、小回りが効くようにすることで、急カーブを安定して回れるように改善した。
**カラーセンサーの位置 [#f05101c9]
&ref(2017a/Member/irin/Mission2/securedownload.jpg,60%,EV3裏面);
当初、色センサーの位置をタイヤの近くに設置していたが、直角カーブを検知できず、現在の位置に落ち着いた。タイヤと色センサーは適度に離した方が、タイヤの動きが小さくても、色センサーの動きが大きくなって安定することがわかった。
*プログラムの説明 [#z712b286]
**インスタンスの作成 [#h79ad080]
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3
import time
mr = ev3.LargeMotor("outA") # MotorRight
ml = ev3.LargeMotor("outB") # MotorLeft
ts = ev3.TouchSensor("in1") #TouchSensor
cs= ev3.ColorSensor("in2") #ColorSensor
補足として、MotorRightはロボット右側のモーターであり、これだけを動作させると左折する。MotorLeftはこの逆である。
**今回設定した関数 [#k79d8f30]
def LineTrace(T)
while 1:
if ts.value() == 1:
break
if cs.value() >= 38: #白のとき
ml.run_forever(duty_cycle_sp=60,speed_sp=60)
mr.run_forever(duty_cycle_sp=60,speed_sp=-20)
t_1 = time.time()
elif cs.value() < 38 and cs.value() >= 23 : #白灰のとき
mr.stop()
ml.run_forever(duty_cycle_sp=60,speed_sp=60)
t_1 = time.time()
elif cs.value() < 23 and cs.value() >= 17: #灰色のとき
mr.run_forever(duty_cycle_sp=60,speed_sp=80)
ml.run_forever(duty_cycle_sp=60,speed_sp=80)
t_1 = time.time()
elif cs.value() < 17 and cs.value() >= 10: #黒灰のとき
ml.stop()
mr.run_forever(duty_cycle_sp=60,speed_sp=60)
t_1 = time.time()
elif cs.value() < 10: #黒のとき
mr.run_forever(duty_cycle_sp=60,speed_sp=60)
ml.run_forever(duty_cycle_sp=60,speed_sp=-20)
if time.time() - t_1 >= T:
break
この関数は、ロボットがライントレースを行うための関数である。しかし、実際にたどっているのはラインの左側である。授業で紹介されたように5段階で制御している。というのも、当初、白色、灰色、黒色の3段階で試してみたがうまくいかなかったからである。また、この関数にはライントレースだけではなく、黒色の上に任意の実数T(>0)秒間以上センサーがあった場合、break文を実行してwhileループを抜ける機能が実装されている。
def WhiteTrace(A)
while 1:
if ts.value() == 1:
break
if cs.value() >= 38: #白のとき
ml.run_forever(duty_cycle_sp=60,speed_sp=60)
mr.run_forever(duty_cycle_sp=60,speed_sp=-20)
if time.time() - t_1 >= T:
break
elif cs.value() < 38 and cs.value() >= 23 : #白灰のとき
mr.stop()
ml.run_forever(duty_cycle_sp=60,speed_sp=60)
t_1 = time.time()
elif cs.value() < 23 and cs.value() >= 17: #灰色のとき
mr.run_forever(duty_cycle_sp=60,speed_sp=80)
ml.run_forever(duty_cycle_sp=60,speed_sp=80)
t_1 = time.time()
elif cs.value() < 17 and cs.value() >= 10: #黒灰のとき
ml.stop()
mr.run_forever(duty_cycle_sp=60,speed_sp=60)
t_1 = time.time()
elif cs.value() < 10: #黒のとき
mr.run_forever(duty_cycle_sp=60,speed_sp=60)
ml.run_forever(duty_cycle_sp=60,speed_sp=-20)
t_1 = time.time()
この関数はライントレースを行い、一個目の関数とほぼ同じである。異なっている点は、黒色の上にある時間を検知してbreak文を実行するのではなく、白色の上に任意の時間A(>0)以上あった時break文を実行することである。
この関数を設定した理由としては、直角カーブ(主にH,G)で色センサーがラインをはみ出し、白色しか検知できなかったからである。
**プログラム本体 [#c2ce1ad6]
#F
LineTrace(0.3)
ev3.Sound.speak("F")
ml.stop()
while cs.value() <= 30:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
ml.run_forever(duty_cycle_sp=60,speed_sp=-10)
#Q
LineTrace(0.4)
ev3.Sound.speak("Q")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 30:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
ml.run_forever(duty_cycle_sp=60,speed_sp=-10)
#R
LineTrace(0.3)
ev3.Sound.speak("R")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 30:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#T1
LineTrace(0.5)
ev3.Sound.speak("T1")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 35:
mr.run_forever(duty_cycle_sp=60,speed_sp=10)
ml.run_forever(duty_cycle_sp=60,speed_sp=30)
#T2
LineTrace(0.4)
ev3.Sound.speak("T2")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 20:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
ml.run_forever(duty_cycle_sp=60,speed_sp=10)
#H
WhiteTrace(0.2)
ev3.Sound.speak("H")
#急カーブ
LineTrace(1)
while cs.value() <= 30:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
ml.run_forever(duty_cycle_sp=60,speed_sp=-60)
#G
WhiteTrace(0.8)
mr.stop()
while cs.value() >= 25:
ml.run_forever(duty_cycle_sp=60,speed_sp=30)
WhiteTrace(0.8)
ev3.Sound.speak("G")
#S
LineTrace(0.6)
ev3.Sound.speak("S")
ml.stop()
while cs.value() <=25:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#P
LineTrace(0.3)
ev3.Sound.speak("P")
ml.stop()
while cs.value() <= 35:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#E
LineTrace(0.5)
ev3.Sound.speak("E")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 35:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#A
LineTrace(0.5)
while cs.value() <30:
mr.run_forever(duty_cycle_sp=60,speed_sp=30)
ml.run_forever(duty_cycle_sp=60,speed_sp=30)
ev3.Sound.speak("A")
mr.stop()
ml.stop()
コードのところどころに記述されているLineTrace関数やWhiteTrace関数以外のモーターに関わる命令はロボットの位置調整のために用いられている。
例えば#Qのような一時停止する場合、黒色の上で停止するので次のライントレースを実行する前に灰色あたりにずらさないと、うまく次のライントレースが実行されない。
また、他の例については、#急カーブが挙げられる。今回製作したロボットは、Hのすぐ後に控える急カーブの内側をトレースする。しかしながら、LineTrace関数ではうまくいかなかった。改善策として灰色以下のとき急旋回を行うコードを継ぎ足した。
*今回の課題を振り返って [#h02a0443]
今回の課題を振り返ってみて一番大変だったのは、締め切りが迫ってきている中、T地点付近のトレースがうまくいかず、見直した結果、車輪の幅が広すぎるという結論に至り、ロボットを改造したことである。改造自体はすぐに終わったが、車輪の幅が変わったせいでプログラムに大きな影響が出ていた。というのも、ライントレースの値を見直したり、黒色検知の時間を見直す必要があったのである。完成一歩手前での出来事だったのですごく辛かった。一度終えた作業をもう一度、一から行うというののはなかなかのものであった。それもあり、完成した時はとてもうれしかった。
次は、こんなことにならないよう、もっと見通しを立てて製作していかなければならないと思った。