[[2019a/Member]]
#contents

*課題3の説明 [#ef306799]

ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。

#ref(2019a/Mission3/2019a-mission3.png,80%,ロボコンのフィールド平面図)

:フィールドの説明 |
--フィールドは課題2で使用した紙を使用する。
--生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
--残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
--プラ容器には色をつけたり文字や記号を書いてもよい。
--プラ容器は両面テープ等でフィールドに固定してもよい。
--2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
:基本ルール |
--競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
--図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
--開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
--途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
--競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
--競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
*最初に [#wc3521b4]
今回私はロボットの完成に居合わせませんでした。プログラムも走らせてません。のでグループの人を参考にプログラムを書こうと思います。
今回私はロボットの完成に居合わせませんでした。プログラムも走らせてません。のでグループの人を参考に妄想でプログラムを書こうと思います。
*ロボット [#w3f421a4]
2台分のパーツを1台に取り付けた。
#ref(2019a/Member/reifur/Mission3/kadai3_1.jpg,40%,全体)
**赤丸 [#y9519e6d]
カラーセンサーを2つ取り付けることによって精度上げた。
**黄丸 [#xe3cbc24]
#ref(2019a/Member/reifur/Mission3/1971.jpg,40%,全体)
上図のように先端に棒がついている。この腕をトレイに向かって振り下げることでボールを外に出す。
**青丸 [#o0e12bee]
下図のように動作部分を回すことで地面にあるボールを回収していく。
#ref(2019a/Member/reifur/Mission3/kadai3_2.jpg,25%,全体)
また逆回転させることでボールを撃ち出す。
*プログラム [#v8d95653]
**モジュールのインポート、インスタンスの作成 [#jd362490]
 #!/usr/bin/env python3
 from ev3dev.ev3 import *
 from time import sleep
 
 r = LargeMotor('outC')
 l = LargeMotor('outA')
 csR = ColorSensor('in1')
 csL = ColorSensor('in2')
 a = LargeMotor('outD')
 h = MediumMotor('outB')
aがトレイを傾ける腕でhがボールを回収する腕。
**関数 [#l2b772da]
左のタイヤを軸に右に曲がる
 def move_r(t):
     r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     sleep(t/1000)
右のタイヤを軸に左に曲がる
 def move_l(t):
     l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     sleep(t/1000)
タイヤの間を中心に左回り
 def move_l2(t):
     r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     l.run_timed(time_sp=t, speed_sp=100, stop_action='hold')
     sleep(t/1000)
タイヤの間を中心に右回り
 def move_r2(t):
     r.run_timed(time_sp=t, speed_sp=100, stop_action='hold')
     l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     sleep(t/1000)
後退する
 def move_back(t):
     l.run_timed(time_sp=t, speed_sp=100, stop_action='hold')
     r.run_timed(time_sp=t, speed_sp=100, stop_action='hold')
    sleep(t/1000)
前進する
 def move_forward(t):
     r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold')
     sleep(t/1000)
ライントレースの定義
 def Trace_Method():
     while True:
         if csL.value() >= 15 and csR.value() >= 15:
             move_forward(100)
         elif csL.value() <= 14 and csR.value() >= 15:
             move_l2(100)
         elif csL.value() >= 15 and csR.value() <= 14:
             move_r2(100)
         else:
              break
**動きの方針 [#te62e693]
このロボットの機構の都合上ボールをゴールにシュートするときトレイを傾けてシュートする必要がある。となると一度トレイに球を入れてももう一度倒したら玉が転がって行ってしまう。なのでシュートチャンスは一度きりと考えた方がいいだろう。またトレイの中のボールを回収するのはかなり難易度が高いため元から地面に落ちているボール2つを回収する。
**具体的なルート [#u789b3d6]
まずAからLまで行きボールを回収したのち180度回転し線J'K'上を目指す。着いたらL'でボールを回収しトレイに入れる。
**プログラムを考える [#m34922e8]
まずLまで行くプログラムを考える。KまではTrace_Method()でいいのだがそのままだとおそらく止まってしまう。なので少し書き換える。
 while True:
     if 80 >= csL.value() >= 20 and 80 >= csR.value() >= 20:
         move_forward(100)
     elif 10 < csL.value() <= 20 and 80 >= csR.value() >= 20:
         move_l2(100)
     elif 80 >= csL.value() >= 20 and csR.value() <= 20:
         move_r2(100)
     elif csL.value() <= 10:
         move_forward()
     else:
          h.run_timed(time_sp=1000,speed_sp=80,stop_action='hold')
          brake
たぶんきっとおそらくこれでLまで行きボール回収して停止するはずである。

次に回転してJ'K'まで進む。回転するプログラムはmove_r2()かmove_l2()を使えばおそらくできる。経験から時間は3300ぐらいだと予想する。J'K'まで進むプログラムだがうまく回転できていればどちらかのカラーセンサーが4回黒線を認識したらJ'K'上に着くはず。
 i=0
 while i=<3
     if csR.value() > 10:
         move_forward(200)
     else:
         move_forward(200)
         i+=1
これでJ'K'上に着くはず。次にL'に向かう。このときボールを回収する腕が閉まっているためボールを回収するにはL'に着く前に開けておく必要がある(L'で開けると腕がボールに当たるため)。なのでここで開けておく。
 h.run_timed(time_sp=1000,speed_sp=-80,stop_action='hold')
 while True:
     if 80 >= csL.value() >= 20 and 80 >= csR.value() >= 20:
         move_forward(100)
     elif csL.value() <= 20 and 80 >= csR.value() >= 20:
         move_l2(100)
     elif 80 >= csL.value() >= 20 and 10 < csR.value() <= 20:
         move_r2(100)
     elif csR.value() <= 10:
         move_l()
     else:
         h.run_timed(time_sp=1000,speed_sp=80,stop_action='hold')
         brake
これで2つ目のボールが回収できた(はず)。あとはトレイに入れるだけ。L'で180度回転しライントレースでトレイに向かう。

ここで重大なことに気づきました。シュートするときのベストなトレイから距離がわからない。目的地がわからないとさすがにプログラムが書けないので残念ですがここで妄想プログラミングを終わりとします。
*改善点と反省点 [#b82aca07]
そもそも一度も試していないので改善点はおそらくありますがありません。反省点は時間と発想。期末試験に追われて時間を取れなかった。できればあと3か月くらいは欲しかった。そして発想力。これはどうしようもないかもしれませんが、何もアイディアを思いつけなかったのが悲しかった。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS