[[2016a/Member]]
#contents
*初めに [#p0942013]
私たちは課題1同様EV3にTera Termを使用することでWindowsOSのままで接続している。またプログラミング言語も前回同様Pythonを使用している。
EV3は細かい時間指定などが可能だったため、最終的な調整に多くの時間をかけての活動となった。
*ロボットについて [#u8b8cad0]
私たちが使用したのは教育用レゴ社EV3である。今回は以下の写真のような形にすることで、光センサーを導入した。
#ref(./S_4549447425984.jpg,100%)
光センサーについてはこのような近い距離に配置することでより正確な明るさを測ることができた。
また光センサーを車体の左側に設置したため、ライントレースの時に線の左側をなぞることで線の真上を走っているように見せることが可能になった。
#ref(./S_4549447530201.jpg,100%)
*走行コースについて [#v44eb640]
私が担当したのはC地点からA地点に向かうコースであった。このコースは計6回の交差点を通過し、そのうち3回は左折、2回は直進、そして1回右折をしなければならない。走行コースは以下のコースである。
#ref(./2016a-mission2.png,100%)
C地点を出発→S地点を左折→P地点を左折Q地点を直進→Q地点を直進→R地点を左折→P地点を左折→A地点に到着
*プログラミングについて [#z69754a6]
今回私たちは、ライントレースかつ交差点の認識、交差点での右折・左折・直進の計4つの動きについてのプログラミングをそれぞれ定義し、その定義文を自分のコースに合わせて並べていく、というようなプログラミングにした。
まず初めに2つのモーターとカラーセンサーについて定義した。
m = ev3.LargeMotor('outA')
n = ev3.LargeMotor('outB')
cs = ev3.ColorSensor('in1')
その後、上記記載の4つの場合についてのプログラミングを書き込んだ。
�.薀ぅ鵐肇譟璽垢噺鮑硬世稜Ъ�
def trace(x):
t0 = time.time()
while time.time() - t0 < x:
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=45)
n.run_forever(duty_cycle_sp=45)
t0 = time.time()
else:
m.run_forever(duty_cycle_sp=20)
n.run_forever(duty_cycle_sp=-30)
x秒間黒を認識したときに左折するような動きを見せて止まるようにしてある。xを変更することで、細かい旋回が必要なところで交差点と誤認しないようにした。
��交差点を右折する
def turnR():
m.run_forever(duty_cycle_sp=-50)
n.run_forever(duty_cycle_sp=20)
time.sleep(0.825)
m.run_forever(duty_cycle_sp=40)
n.run_forever(duty_cycle_sp=40)
time.sleep(0.9)
交差点を右折させるために、車体をバックさせたのちに直進し、カラーセンサーが右折した先の線の左側付近に重なるように調節した。
この場合、左折と違って直進する時間を長くとり、右折した先の線を越えていくように設定する必要があった。(下図を参照、赤線はカラーセンサーの移動経路)
#ref(./S_4567489721857.jpg,100%)
�8鮑硬世鮑言泙垢�
def turnL():
m.run_forever(duty_cycle_sp=20)
n.run_forever(duty_cycle_sp=-30)
time.sleep(0.6)
m.run_forever(duty_cycle_sp=40)
n.run_forever(duty_cycle_sp=40)
time.sleep(0.425)
右折同様、一旦バックさせた後に直進させて左折先の線の左側に重なるように調節した。こちらは右折よりも経路が短くて済む(下図を参照、赤線はカラーセンサーの移動経路)
#ref(./,100%)
#ref(./S_4567489584309.jpg,100%)
�じ鮑硬世鯆梢覆垢�
def straight(x,y):
m.run_forever(duty_cycle_sp=x)
n.run_forever(duty_cycle_sp=y)
time.sleep(0.225)
�,傍�載したが、交差点を認知したときに左折をするような動きを取り、また交差点と認識するまでにかかる時間の設定が異なるため、直進する動きが始まる位置がその時々によって異なる。そのため、それに合わせて右輪と左輪のスピードを調節するようにした。
以上の4プログラムを利用し、指定されたコースを通るために以下のようにした。
trace(0.225)
turnL()
trace(0.225)
turnL()
trace(0.24)
straight(30,40)
trace(0.245)
straight(35,30)
trace(0.235)
turnR()
trace(0.225)
turnL()
trace(0.23)
その後、A地点の枠に入るために直進の操作を行い、ライントレースを完了させた。
straight(70,70)
m.stop
n.stop
*ライントレースの結果 [#z3f89ba7]
私はコースを56秒で走り切るように調整を行った。スピードを速くしようとすると、急カーブで曲がり切れなくなったり、勢いがつき過ぎてラインの中央にまでセンサーがいってしまい、交差点と誤認してしまうという問題があったが、そうならず、かつそれなりのスピードを出せるように設定した結果、1分を切ることに成功した。
*プログラミングをしていて苦労した点 [#ue168453]
前述にもあったように、右折の突起には移動経路が他よりも長いうえ、線を完全に越えなければならないため、そこを調節することが難しかったように思う。また、小さな円を一周するところ(Q地点の円)で、交差点と誤認してしまう場合が非常に多かったため、そこでのトレースで何秒黒が続いたときに交差点と認識するか、という点での調整が非常に困難だった。
*課題�△鯆未靴導悗鵑世海� [#u0ef39df]
今回の課題では定義文を活用したことで、前回よりも非常にすっきりとまとまったように思う。また、訂正も1か所行うだけで、同じ動きをすべて訂正できたため、多くの回数走らせて調節することができた。また、定義文の中で関数を利用することで、その利用方法も確認できた。