[[2019a/Member]]
目次
#contents
*課題3:ボール運搬ロボット [#f1b4d5a3]
 ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
#ref(./2019a-mission3.png,4.8,コース全図)
&size(17){ フィールドの説明};
&br;   ◦フィールドは課題2で使用した紙を使用する。
&br;   ◦生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
&br;   ◦残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
&br;   ◦プラ容器には色をつけたり文字や記号を書いてもよい。
&br;   ◦プラ容器は両面テープ等でフィールドに固定してもよい。
&br;   ◦2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。

*ロボットの説明 [#qf8a0ddc]
**全体 [#ebd24369]
#ref(./1565395609702.jpg,23.4,全図)
    写真のように一体型にしました。そのため、前方が重くなってしまいました。
&br;   また、車体の前方を高くすることにより、ベルトコンベアの部分に傾斜
&br;   を付けることが出来ました。それにより、容器にベルトコンベア
&br;   を突っ込みやすくなりました。
&br;    2台のRISを写真のように積み重ねたので、下にあるRISのボタンを
&br;   押しにくくなってしまいました。その点は、キットに入っている棒を使って解決しました。
&br;   また、2台のRISの通信は赤外線によって行われるため、RISの位置を考える
&br;   必要がありました。そのため、最初はRISを前後逆につけていましたが、
&br;   赤外線通信がうまく出来なかったので、写真のように取り付けました。
&br;   そのようにしたら、通信をすることが出来るようになりました。
&br;    駆動部、キャタピラ部分の接合がうまく行きませんでした。
&br;   そのため、ロボコンのときに壊れてしまいました。
   

**移動に関するもの [#q60d5a08]
#ref(./m3m.jpg,39.6,駆動部)
    マニュアルに掲載されていた作り方をもとに骨格を作成しました。
&br;   前輪はキャスター付きのようなタイヤではうまく曲がること
&br;   が出来なかったので、つるつるしたパーツを用いることにしました。

**ボールの回収、排出 [#gb95c264]

#ref(./1565395588820.jpg,22.2,アーム)
    写真のようにキャタピラを使いました。当初、キャタピラを両側につけていましたが、
&br;   重くなってしまいました。ですが、チームのメンバーの改良により、写真のように片側
&br;   のみに付けることが可能になりました。容器にキャタピラを入れることが出来るように
#ref(./m3b_1.jpg,37.2,アーム)
   するためにギザギザのパーツを写真のように用いることにより、キャタピラの部分が
&br;   上下に動くことが出来るようにしました。また、その部分が想像以上に重くなり、
&br;   全体のバランスが悪くなってしまいました。
&br;    ボールを回収、排出することに関しては、うまくいってよかったです。

*プログラム [#h86a753d]
**全体 [#d5fa49a2]
***2台のRISの連携について [#ra898602]
    このチームでは、一体型のロボットにしたため、一方のRIS_1が移動に関するものを行い、
&br;   もう一方のRIS_2がボールの回収、排出に関するものを行いました。
&br;   例を下に示します。

   RIS_1でボールの前まで行ったら、RIS_1が下のプログラムを送信、
 SendMessage(SIGNALON);       // RIS_1が送信
   RIS_2が上のプログラムを受け取ります。RIS_2は上のプログラムを受信するまでは、&br;   停止しているというプログラムが下にあります。
 Off(OUT_AC);            // RIS_2がSIGNALONを受信するまで停止
 until(Message() == SIGNALON);
   次に、RIS_2は後述のボールの回収、排出を行います。それが終わると、
 SendMessage(SIGNALOFF);       // RIS_2が送信
   RIS_1に上記のプログラムを送信します。RIS_1は、それを受信するまでは、下記のように停止しており、
&br;   受信すると再度ボール、又はゴールの方へ向かいます。
 Off(OUT_AC);
 until(Message() == SIGNALOFF);      // RIS_1が受信 → 発進
   ゴール前では、上記のようにRIS_2に送信し、RIS_1はゴールに突進し続けます。
&br;   突進し続けさせる理由は、ゴールとの距離感がつかめずに、ゴールでないところでボールを
&br;   離してしまうというのを防ぎたかったからです。そのため、プログラムは下記のようにしました。
 OnFwd(OUT_AC);                      // RIS_1がSIGNALOFFを受信するまで直進
 until(Message() == SIGNALOFF);
   ボールの排出が終わると、RIS_1にMessageを送り終了の予定でしたが、実際にはそこまで
&br;   辿り着きませんでした。

**移動に関するもの [#c32b53a3]
***サブルーチンについて [#k8d8eda2]
    当初、課題2で用いたライントレースのサブルーチンを使おうとしました。しかし、
&br;   ライントレースに行き詰まったため、前回のsub follow_line()を使わずに、直進、
&br;   左折などといったサブルーチンを使いました。
&br;直進
 sub go_f()
 {
     go;Wait(move_t);Off(OUT_AC);
 }
後退
 sub go_b()
 {        
     OnRev(OUT_AC);Wait(move_t);Off(OUT_AC);
 }
左折
 sub go_l()
 {        
     turn_left;Wait(move_t);Off(OUT_AC);
 }
右折
 sub go_r()
 {        
     turn_right;Wait(move_t);Off(OUT_AC);
 }

***task mainについて [#b429c245]
  A’からスタートしてコースを無視してL’のボールを回収し、容器にボールを入れるものです。
 task main()
 {    
   move_t=500;   //直進
   go_f();
   SendMessage(SIGNALON);   //送信
   ClearMessage();
   OnFwd(OUT_AC);
   until(Message() == SIGNALOFF);  //ボール回収 
 
   move_t=250;   //右折
   go_r();
  
   move_t=1000;   //直進
   go_f();
   SendMessage(SIGNALON);      //ボール排出 
   ClearMessage();
   OnFwd(OUT_AC);
   until(Message() == SIGNALOFF); 
 
   move_t=200;  //後退
   go_b(); 
 }


**ボールの回収、排出 [#p703d8d7]
 これらのプログラムは移動したあとに使う必要があったので、2台のRISの間で通信を行いました。
***回収 [#ac90591d]
  これは回収の際に使うサブルーチンです。ロボットの構造が簡素化されていたため、
&br;  簡単なプログラムになりました。
 sub ball_c()
 {    
  Off(OUT_AC);
  until(Message() == SIGNALON);
  OnFwd(OUT_A);    //アーム下げ ← ギザギザの棒で上下移動
  Wait(100);
  Off(OUT_A);
  上のプログラムはギザギザの部品とギアによりアームを下ろすものです。
  OnFwd(OUT_C);   //卓球ボールの巻き上げ ← キャタピラで回収
  Wait(100);
  これは、キャタピラを回転させて、ボールを持ち上げるものです。
  OnRev(OUT_A);    //アーム上げ
  Wait(100);
  Off(OUT_A);
 }
  これにより、アームを上げることにより、容器を引きずらないようにするためのものです。
***排出 [#s2815961]
  これは、ボールの排出に使うサブルーチンです。ボールの排出では、キャタピラを巻き上げた
&br;  ときと逆向きに動かせば良かったので、単純なプログラムにすることが出来ました。
 sub ball_l()
 {    
   Off(OUT_AC);          //SIGNALONを受信するまでは停止
   until(Message() == SIGNALON);
   OnRev(OUT_C);
   Wait(10000);
   Off(OUT_C);
   SendMessage(SIGNALOFF);    //SIGNALOFFを送信 
 }

   task mainはRIS1からメッセージを受信してから動くようにしました。
&br;   ボールの回収や排出が終了したら、SIGNALOFFを送ることによりRIS1の移動に関するものが
&br;   動き始めます。
 task main()
 {    
   ClearMessage();
   t=200;
   ball_c();          //回収
   SendMessage(SIGNALOFF);
   ClearMessage();
   ball_l();          //排出
 }
*まとめ [#td95fd47]
 うまく走らせることが出来なかった。前が重くなってしまったので、前の部分を支えることが
 出来るようなロボットを作る必要があったと思います。光センサーを用いてライントレースを
 したが、光センサーが遠すぎるためか、車体を大きくしすぎたためか、うまくライントレースをする ことが出来なかった。しかし、ロボコンで2つの光センサーを使っているチームがいて、そのチーム 大きな機体でもライントレースをすることが出来ていたので、2つ使えばうまくライントレース
 できたかもしれないと思いました。問題が生じ、ライントレース無しでやることを目指したが、
 ロボコンに間に合わずしっかりと出来ませんでした。
  部品ごと動かすことが出来ました。例えば、Messageを送信してから、ボールを回収する
 ことはできた。
 人間ならボールを運んで容器に入れるなんて余裕なのに、ロボットでやるとうまく行きませんでした。だから、人間とか動物が目的を達成するためにする行動をプログラムによって、再現するのは難しいと思いました。また、人間のような動きをさせることができれば、楽しいだろうと思いました。
 

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