[[2017b/Member]]

*課題説明 [#m2376af8]

今回の課題は4人で一チームとなって行うものになる(3人の班もある)。

**基本ルール [#e36e97fa]
&ref(2017b/Member/Reici/Mission3/006.png,50%,コース全体図,課題ページから引用);
-コースは上図の通り。
-紙コップをコース3カ所に口を下にして設置する。
--この紙コップは持参。色を塗るなどの加工が認められている。
-紙コップの中にそれぞれ2個ずつピンポン玉を入れる。
--各班2個ずつのみ配布される。もし試運転で全て行いたいのなら、自分たちで用意する必要がある。
-ピンポン玉をX地点の枠内に、紙コップはY地点の線内に移動する。
--X地点の枠内:割りばしを使用。14cm四方。固定するかしないかは自由。
-上記のコップとは別に5つ、障害物として紙コップを置く。
--直径6cmの円を描き、その中に入れておく
**点数計算 [#kc4b7b66]
基本点と技術点の総合で評価する。
-基本点のみ、全体の試走が終わった後で再挑戦することが出来る。よりよい結果を反映する。
***基本点 [#q4cf4b0e]
-運んだピンポン玉の数×3点
-運んだ紙コップの数×3点
-紙コップを2つ重ねて置くことができた場合はさらに3点加算、3つ重ねて置くことができた場合は6点加算
-障害物の紙コップに接触して一部を円の外に移動した場合は各1点減点
--全部を円の外に移動した場合は各2点減点

***技術点 [#q285d95b]
各チーム(全9チーム+先生の計10人)ごとに以下の項目を20点満点で採点し、その平均点で評価する。
-紙コップとピンポン玉を探し取りにいくまでの動作 (2点)
-紙コップを掴む動作 (2点)
-紙コップを運ぶ動作 (2点)
-紙コップを置く (2点)
-ピンポン玉を拾う動作(2点)
-ピンポン玉を運ぶ動作(2点)
-ピンポン玉を目的に入れる動作(2点)
-2台のRCXまたはNXT、EV3の連携の良さ(2点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
-その他 (2点)

*方針 [#q2a4d860]


今回の課題で必要な動作は

-移動する
-コップ、ピンポン玉の位置(方向)を確認する
-コップを掴む
--コップを持ち上げる(その後、他のコップに重ねる)
-ピンポン玉を枠内に入れる

に大分されると考えた。

ピンポン玉をバラバラに取り扱うのは、センサの感度や保持方法の点から難しい。よって、伏せた紙コップを少し浮かせたまま移動させることで、枠を乗り越えさせ、その後コップを移動させる方針となった。また2班での共同作業ということで、1つの機体を作るのか、2つ運用するのかで方針が迷走したが、とりあえず1班分の部品で組み立ててみる形になった。行き当たりばったり。

*機体説明 [#a63cfd30]

&ref(2017b/Member/Reici/Mission3/002.jpg,25%,アーム試作機);

授業中に歯車を使った持ち上げ機構についての話があったので、試しに作ってみようとしたもの。重すぎて歯車のかみ合わせがズレやすい欠陥有。特にベージュの歯車が頻繁に外れたため、改良する必要があった。

&ref(2017b/Member/Reici/Mission3/003.jpg,25%,アーム完成形);

その後チームメイトと改良したもの。
機構は複雑になったが、EV3一台でコップのホールド・持ち上げ・移動が出来る。発表会では、この機体を二台用いて課題に臨んだ。

&ref(2017b/Member/Reici/Mission3/004.jpg,25%,機体に組み込んだら。EV3はこの上に設置);

アーム部分について補足。両側にフレームや歯車を置くことでアーム自身の重さで傾くことはなくなる。ギアをMモータから徐々に大きくしていくことで安定して動作できるようになったと思う。ただ歯車の噛み合わせは依然として不安定で、モータの回転数通りが直接アームの動きに連動するわけではない。決められた歯車の位置で開始する必要があるのだ。そこで制作途中で何度もコップに「噛ませて」調節する必要があった。改善点が思いつかなかったので、そのまま押し通したが何か上手い方法はなかったのかと考えている。

&ref(2017b/Member/Reici/Mission3/005.jpg,25%,奥がred機、手前がgreen機);

前述の問題点は残るが、&size(8){時間もないので}; 同じ機体を2つ用意した。搭載するEV3の区別の為に赤と緑の部品で適当な角?を付けたが、意外に便利だったのでそのまま置いておく方針になった。最終的にはプログラム本体の名前もred/greenがつく形になる。

*プログラム説明 [#v7f5ff85]

先ず2台を同時に動かす場合に注意しなければならないことがある。

&size(20){互いの機体が干渉しあう可能性}; が常にあるということだ。超音波センサを使ってコップの方向を確認したいのにもう一台が横切りました☆なんてことや、お互い衝突して転倒・続行不可で終了なんてことが起きる可能性は十分予想できる。

これを防ぐという目的もあって、二台が干渉しないようにルートを設定した。

&ref(2017b/Member/Reici/Mission3/001.png,50%,割り当て);

上図の通り、赤と緑に分けている箇所をそれぞれの色の機体で担当する。分担することでアクシデントが起きても一定の点数を稼ごうという狙いもある。おおまかな方針としては、緑側2つのコップを移動・回収したのちに、信号を送信する。一方の赤側は、コップを掴んだところで待機、信号を受信して再び行動する。都合によりこれ以降のプログラミングは担当できていない。私が本来書くべきではないと思うのだが、一応の説明だけ述べることにする。

詳細は[[2017b/Member/ibu/Mission3]]
[[2017b/Member/Koyo/Mission3]]
[[2017b/Member/hakuwa/Mission3]] を参考にしてほしい


**共通設定 [#e9d98fac]

先ずは設定。特に書くことなし。
 mr = ev3.LargeMotor('outC')
 assert mr.connected, "Connect right large motor to port C"
 ml = ev3.LargeMotor('outD')
 assert ml.connected, "Connect left large motor to port A"
 arm = ev3.MediumMotor('outB')
 assert arm.connected, "Connect arm medium motor to port B"
 cs = ev3.ColorSensor()
 assert cs.connected, "Connect a color sensor to any sensor port"
 cs.mode = 'COL-REFLECT'
 us = ev3.UltrasonicSensor()
 assert us.connected, "Connect a color sensor to any sensor port"
 us.mode = 'US-DIST-CM'

上述した歯車調整用の関数。コップを安定して掴む為に必要。
 def init_arm():    
   'pos_positive: to inside, pos_negative: to outside'
   arm.reset()  # del stop_action='hold'
   input('Press Enter to initialize closed arm position')
   arm.reset()

アームを開ける動作
-init_armを実行した後に使用する。
 def arm_open(): 
   arm.run_to_abs_pos(position_sp=200,
                      speed_sp=std_speed*5,
                      stop_action="hold")
   arm.wait_while("running")

アームを閉じ、コップを掴む
-同じくinit_armを実行した後に
 def cup_catch():    
   mr.run_forever(speed_sp=std_speed*5)
   ml.run_forever(speed_sp=std_speed*5)
   while us.value() > 50:
       pass
   for motor in mr, ml:
       motor.stop(stop_action='brake')
   move(5)
   arm.run_to_abs_pos(position_sp=0,
                      speed_sp=std_speed*5,
                      stop_action="hold")
   arm.wait_while("running")
   move(-5)

コップを掴んだまま、&size(8){ちょっとだけ};浮かせるための関数
-同じくinit_armを以下略
 def cup_a_little_lift():   
   arm.run_to_abs_pos(position_sp=-42,
                      speed_sp=std_speed*5,
                      stop_action="hold")
   arm.wait_while("running")

コップを大きく上げる動作。ピンポン玉を離したり、コップを重ねるときに。
-同じく以下略
 def cup_lift(): 
   arm.run_to_abs_pos(position_sp=-230,
                      speed_sp=std_speed*5,
                      stop_action="hold")
   arm.wait_while("running")

他にライントレース用の関数等細々あるが、省略する。


**緑側機体 [#y3b04f44]

 def main():
   #client.connect("10.60.2.156",1883, 60) # ブローカに接続、(60秒以上接続がないと切断)
   line_adjust_by_time('left_edge', 1.3)
   run_until_intersection('left_edge')
   intersection_turn_left()
   change_following_edge()
   run_until_intersection('right_edge')
   intersection_turn_right()
   line_adjust_by_time('right_edge', 1)
   run_until_intersection('right_edge')
   circle(145) # intersection,change direction
   arm_open()
   move(-4)
   search_min_d(1)
   cup_catch()
   circle(-105)
   move(1)
   line_adjust_by_time('left_edge', 1)
   circle(-20)
   run_until_intersection('left_edge')
   cup_a_little_lift()
   move(4)
   circle(35)
   move(5)
   cup_a_little_lift()
   move(10)
   cup_lift()
   circle(-30)
   move(-5)
   search_min_d(1, -1)
   cup_catch()
   arm_open()
   cup_a_little_lift()
   circle(60)
   cup_lift()
   circle(-140)
   arm_open()
   move(-4)
   circle(-90)
   #mqtt_send(1)
   move(50)
   #client.disconnect() # 切断

**赤側機体 [#u9fefc1a]
 
 run_until_line()
   move(4)
   line_adjust_by_edge('right_edge')
   run_until_intersection('right_edge')
   circle(33)
   arm_open()
   search_min_d(0.8)
   cup_catch()
   circle(-160)
   line_adjust_by_edge('left_edge')
   run_until_intersection('left_edge')
   intersection_turn_left()
   line_adjust_by_time('left_edge', 1.3)
   cup_a_little_lift()
   move(5)
   cup_lift()
   move(-50)
   line_adjust_by_time('left_edge', 5)
   run_until_intersection('left_edge')
   while position != 1:
   pass
   move(15)
   circle(35*1.2)
   line_adjust_by_edge('left_edge')
   line_adjust_by_time('left_edge', 3)
   run_until_intersection('left_edge')
   intersection_turn_left()
   run_until_intersection('left_edge')
   circle(-27)
   arm_open()
   client.loop_stop()        # 受信ループを停止
   client.disconnect()       # 接続を切断

全般的に説明がないのは関われなかったからである。時間の都合を付けれなくて申し訳ない。

*結果等 [#g504e5b9]

今回審判を担当したのでその結果を踏まえた考察を少しして、この課題を終わりとしたいと思う。
&ref(2017b/Member/Reici/Mission3/007.png,25%,得点表);

&ref(2017b/Member/Reici/Mission3/007.png,25%,仮得点表);

各チーム名は伏せたうえで得点結果をあげると、上のようになる。なお、再挑戦の加点(基礎点のみ)は加算してないので実際の順位と差はあることに注意されたい。私達のチームは9番目、一番下の欄になる。最終的に僅差で2位になったのは大健闘だと思っている。1位がほぼ満点なのほんとすごい…すごい以外の感想が出てこない…。

全チームの傾向を考えると、基本点が0点だと技術点も釣られて低くなるようだ。サウンドや機体構造で工夫していたチームでも、基本点が取れないと印象が釣られて悪く響く。逆に基本点が1点でも入っていれば技術点は大分甘口になっている印象がある。技術点は各チームの評価なので、どうしても印象に左右されるのだろう。

再挑戦後に変更されうるのは基本点のみなので、先ずは1点分でもピンポン玉やカップを設置することがよりよい順位を取るセオリーなのかな、と考えた。&size(10){満点狙いは余裕のある人がすればいいんじゃないですかね…};

非常に志が低い分析で申し訳ないが、それはそれとして、『2台で分担することによる点数確保』という作戦は一定の成果を上げれたのではないだろうか。

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