*Mission2   Line Trace Machine [#x881dcb3]
*目次 [#b5f77f45]
#contents
*課題2内容 [#lb86b843]

-次のいずれかのコースで黒い線に沿って動き、350mlの空き缶(黄色で表示)を移動させるロボットを製作せよ。 (相棒と違うコースを選ぶこと)


**第1コース [#tafb1334]
&ref(2018a/Member/Maedak/Mission2/2018a-mission2-1.png,50%,第一コース);
+Aをスタート
+Bを直進
+Cで一時停止の後、直進
+Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る
+DからEに向かい、Eを直進
+Fを左折
+Gで一時停止の後、左折
+Hで一時停止の後、右折
+Iで一時停止の後、右折
+Lを直進
+Kを直進
+Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう
+Bで一時停止の後、左折
+Aで停止
-(一時停止の指定がある場所は、1秒間停止すること)

**第2コース [#z56ef16a]
&ref(2018a/Member/Maedak/Mission2/2018a-mission2-2.png,50%,第二コース);
+Aをスタート
+Bを右折
+Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
+JからKに向かい、Kを直進
+Lを直進
+Iを左折
+Hで一時停止の後、左折
+Gで一時停止の後、右折
+Fで一時停止の後、右折
+Eを直進
+Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
+で一時停止の後、直進
+Bを直進
+Aで停止
-(一時停止の指定がある場所は、1秒間停止すること)
**注意点 [#z1ff6c50]
-一つの交差点(or T字路 or 直角カーブ)から次の交差点(or T字路 or 直角カーブ)までの移動を一つのサブルーチンまたは関数で定義すること。
-前の交差点からの時間や距離を微調整して交差点を判断するのではなく、通常のカーブと交差点の違いを光センサの値から判断すること。

*今回のびっくりドッキリメカ [#d3905211]
**全体 [#tafe5d8e]
&ref(2018a/Member/Maedak/Mission2/zenntai.jpg,50%,全景);~
二階建て構造になっている.一見不要な構造であるが、実際不要な構造である。~
カラーセンサーの位置を調整するに当たってタイヤの車軸に近ければ近いほど~
曲がりやすいという風の噂を聞いたため、車軸の真上に来るように改造した際の名残である。~
(現在は前に戻っている)~
**センサー [#y241b358]
&ref(2018a/Member/Maedak/Mission2/sensor.jpg,50%,センサー);~
このライントレースの要にして最大の敵。環境・電池の残量・光の度合い・ロボの気分に~
左右され、翻弄され、迷宮入り...。なんてこともあった。最終的にロボの前に設置された。~
**アーム [#m9be5b54]
&ref(2018a/Member/Maedak/Mission2/arm.jpg,50%,アーム);~
曲がったアーム二つをくみあわせ、船型にすることで転倒防止、捕獲を容易にし、センサーに~
よって挟まれることによって意図的ではないがアーム内で固定される様になった。~
#br
これらのロボット作成は全て僕らの壮大な創意工夫により、作成されています。

*ライントレースの方法とその為のプログラミング [#k155846d]

***ライントレースをするために [#je956ad9]
&ref(2018a/Member/Maedak/Mission2/ColorSensor.png,50%,黒と白の境界線);~
def line(x):
   mr.reset()
   ml.reset()
   t0 = time.time()
   while time.time() -t0 < x:
    if cs.value() >= 75:
     mr.run_timed(time_sp=300, speed_sp=80)
     ml.run_timed(time_sp=300, speed_sp=-40)
     t0 = time.time()
    else:
     mr.run_timed(time_sp=300, speed_sp=-40)
     ml.run_timed(time_sp=300, speed_sp=80)
ライントレースは基本的に黒線の端を使って行う。例えば黒線の右端を通る際には~
黒(Color Sensorの値が75以下)だったら左寄りに前進し、白(Color Sensorの値が75以上)~
であれば右寄りに前進する。このようにして、ジグザグに進むことで黒線に沿って~
進むことができる。
***交差点で停止するために [#oeae5914]
&ref(2018a/Member/Maedak/Mission2/cross.png,50%,交差点);

time.time()という現在時刻を表す関数を利用して黒線を認識している時間を計る。~
 x という変数に入れた数字の時間以上に黒線上にいた場合whileループを終了し、停止する。~
停止後はsleep関数の後前進、もしくは左折右折をし、その先での動作を遂行する。
***急カーブを曲がる際に [#pd7b4b00]

急カーブを曲がる際には交差点と誤認識することが多くなる。複数回誤作動が起こるので~
調整が難しい。その為一回目の誤作動を利用してカーブの外側へカラーセンサーを~
移動させることで綺麗に曲がることができるようにした。~
***缶をつかむ際の動き [#i815ab6d]
def can(a):
    mm.reset()
    mm.run_timed(time_sp=1500, speed_sp=75*a)
    sleep(2.5)
前進→アーム→後退という形が理想だが、缶の前では正確に止まることができないので~
正面を向くように調整する。その後アームを下げて捕まえる~
以上の要素を組み込みプログラムを組むと以下のようになる。
**プログラム [#cf6b62e2]

 #!/usr/bin/env python3~
 from ev3dev.ev3 import * ~
 from time import sleep~
 import time~

 ml = LargeMotor('outA')~
 mr = LargeMotor('outD')~
 mm = MediumMotor('outB')~
 cs = ColorSensor('in4')~
 cs.mode = 'COL-REFLECT'~
def line(x):黒線の右端をジグザグ動く。
   mr.reset()
   ml.reset()
   t0 = time.time()
   while time.time() -t0 < x:
    if cs.value() >= 75:
     mr.run_timed(time_sp=300, speed_sp=80)
     ml.run_timed(time_sp=300, speed_sp=-40)
     t0 = time.time()
    else:
     mr.run_timed(time_sp=300, speed_sp=-40)
     ml.run_timed(time_sp=300, speed_sp=80)

def line_m(z):黒線の左端に
   mr.reset()
   ml.reset()
   t0 = time.time()
   while time.time() -t0 < z:
    if cs.value() >= 75:
     mr.run_timed(time_sp=300, speed_sp=-40)
     ml.run_timed(time_sp=300, speed_sp=80)
     t0 = time.time()
    else:
     mr.run_timed(time_sp=300, speed_sp=80)
     ml.run_timed(time_sp=300, speed_sp=-40)

def straight(y,k,t):
    mr.run_timed(time_sp=500*y, speed_sp=k)
    ml.run_timed(time_sp=500*y, speed_sp=t)

def can(a):
    mm.reset()
    mm.run_timed(time_sp=1500, speed_sp=75*a)
    sleep(2.5)
#1st~
line(0.5)~
straight(2,0,100)~
sleep(2)~
#2nd~
line(0.7)~
straight(1,50,50)~
straight(1,125,75)~
sleep(2)~
can(-1)~
sleep(3)~
straight(1,-100,-100)~
straight(1,75,125)~
sleep(1)~
m_line(0.5)~
straight(1,75,125)~

#3rd~
sleep(5)~
straight(2,100,50)~
mr.run_timed(time_sp=800, speed_sp=75)~
ml.run_timed(time_sp=800, speed_sp=100)~
sleep(2)~
line_m(0.5)~
line_m(0.5)~
mr.run_timed(time_sp=800, speed_sp=15)~
ml.run_timed(time_sp=800, speed_sp=100)~

以下缶を置く動作と戻る動作が完成しきらなかった。

*反省と反省と反省と感想 [#i6a1079a]
**反省と反省 [#a5484496]
-プログラムが完成しきらなかった...。
-理想通り動けば成功したが、人生はそう上手くいくものではなく...各所の数値を調整するのが~
大変な苦行であった。
-ロボットを家でも少しずつ調整していればもっとスムーズにできたと思われる。
**反省と感想 [#mf034c31]
-途中で機械に何回か調整が入り、プログラムを書き直さざるを得なくなった。
-紙に水性ペンと油性ペンを両方使ってしまったので濃淡の差が激しくなってしまった。
-上手くトレースできた時はとてもうれしかった!


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS