[[2019a/Member]]
#contents
*課題3:ボール運搬ロボット [#w05fb60a]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
#ref(2019a/Member/www/Mission3/ko-su'.jpg,40%)

**フィールドの説明 [#i12fef37]

-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。


**ルール [#p6d1295d]

-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。


*機体の説明 [#ibcf3892]
**アームの説明 [#ebc42135]

** [#qa382d2f]
**足回りの説明 [#qa382d2f]

*作戦 [#a6325bd5]
課題2と同様、タイヤは全部で3輪で、前輪2つが駆動輪、後輪1つは摩擦を減らすために、ゴムを外したホイールのみを取り付けた。

*経路の説明 [#a6325bd5]
車体が重たく、ガタガタ揺れると壊れそうだったので、極力ライントレースをしないように経路を考えた。
**1つ目のピンポン玉を入れるまでの経路 [#l050ad9c]
#ref(2019a/Member/www/Mission3/michi1.jpg,30%)
スタートしてから2本の黒い線を横切って、3本目の黒い線を認識したら、ライントレースを開始する。

上の図にあるようにしばらく進んだら、ピンポン玉を取り、その場で90度回転してピンポン玉をリリパックの中に入れる。

**2つ目のピンポン玉を取るまでの経路 [#pc741ba9]
#ref(2019a/Member/www/Mission3/michi2.jpg,30%)
少し下がった後に90度回転し、リリパックに当たらないように移動した。

3本の黒い線を横切り、ここでもリリパックに当たらないよう、斜めに移動。

4本目の黒い線を横切った後、ライントレースを開始し、ピンポン玉をつかむ。

**リリパック内のピンポン玉を取るまでの経路 [#z3e7b023]
#ref(2019a/Member/www/Mission3/michi3.jpg,30%)
アームがリリパックの端に引っ掛かり、ピンポン玉がとれなくなることを防止するため、90度回転した後、少し下がってから、ピンポン玉をつかむようにした。

**3つのピンポン玉を入れるまでの経路 [#b356303a]
#ref(2019a/Member/www/Mission3/michi4.jpg,30%)
さらに下がり、90度回転する。

2本目の黒い線で停止、少し前進してリリパック内にピンピン玉を入れる。

*プログラムの説明 [#s935091c]
**共通するプログラム [#k04979a2]
2台のRISで通信を行うために、以下のようにマクロを定義をした。
 #define signal_catch 1
 #define signal_release 2
 #define signal_end 3

**アームのプログラム [#p5ab606a]
***ピンポン玉を取る [#v007d5d0]
untilを最初に書き入れることで、信号を受信してから動くようにした。
 sub CATCH()
 {
 ClearMessage();
 until(Message()==signal_catch);
 OnFwd(OUT_B);Wait(30);Off(OUT_B);Wait(100);//  下がる
 SetPower(OUT_A,2);
 OnRev(OUT_A);Wait(90);Off(OUT_A);Wait(100);// 掴む
 OnRev(OUT_B);Wait(50);Off(OUT_B);Wait(100);//  上がる
 OnFwd(OUT_A);Wait(90);Off(OUT_A);Wait(100);//  手を元に戻す
 OnFwd(OUT_C);Wait(200);Off(OUT_C);Wait(100);// 奥へ送る
 SendMessage(signal_end);
 } 
***ピンポン玉をはなす [#l7a2c675]
 sub release()
 {
 ClearMessage();
 until(Message()==signal_release);  
 OnFwd(OUT_B);Wait(30);Off(OUT_B);Wait(100);//  下がる
 OnRev(OUT_C);Wait(200);Off(OUT_C);Wait(100);// 前へ送る
 OnRev(OUT_B);Wait(50);Off(OUT_B);Wait(100);//  上がる
 SendMessage(signal_end);
 } 
 
 task main()
 {
 ClearMessage();
 CATCH();
 release();
 CATCH();
 CATCH();
 CATCH();
 ClearMessage();
 until(Message()==signal_release);  
 OnFwd(OUT_B);Wait(30);Off(OUT_B);Wait(100);//  下がる
 OnRev(OUT_C);Wait(200);Off(OUT_C);Wait(100);// 前へ送る
 OnRev(OUT_BC);Wait(50);Off(OUT_BC);Wait(100);//  上がりながら送る
 SendMessage(signal_end);
 }
**足回りのプログラム [#q4126503] 
 Mission3_foot
 
 #define black 40
 #define gray_black 44
 #define gray 47
 #define gray_white 50
 #define white 60
 #define go_ahead OnFwd(OUT_AC);
 #define turn_left OnFwd(OUT_A);Off(OUT_C);
 #define turn_right OnFwd(OUT_C);Off(OUT_A);
 #define circling_left OnRev(OUT_C);OnFwd(OUT_A);
 #define circling_right OnRev(OUT_A);OnFwd(OUT_C);
 

**タイヤ周りのプログラム [#q4126503]
 #define signal_catch 1
 #define signal_release 2
 #define signal_end 3
 

 int t; 
 
 sub follow_line()// 右側トレース時間
 {
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);
 while(FastTimer(0)<t){
 if(SENSOR_2<black){circling_right;}
 else if(SENSOR_2<gray_black){turn_right;} 
 else if(SENSOR_2<gray){go_ahead;}
 else if(SENSOR_2<gray_white){turn_left;}
 else if(SENSOR_2<white){circling_left;}
 }
 Off(OUT_AC);Wait(100);
 } 
 
 task main()
 {
 ClearMessage();
 // A'スタート
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//白なら
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//黒なら
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100); 
 t=90;follow_line();//調整
 Wait(100);
 SendMessage(signal_catch);//  L'掴む
 ClearMessage();
 until(Message()==signal_end);
 circling_left;Wait(102);Off(OUT_AC);//調整
 SendMessage(signal_release);//  1個完了
 ClearMessage();
 until(Message()==signal_end);
 OnRev(OUT_AC);Wait(30);Off(OUT_AC);
 circling_left;Wait(102);Off(OUT_AC);
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//白なら
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//黒なら
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100); 
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 turn_right;Wait(100);
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 t=150;follow_line();//調整
 SendMessage(signal_catch);//  L掴む
 ClearMessage();
 until(Message()==signal_end);
 circling_left;Wait(102);Off(OUT_AC);//
 OnRev(OUT_AC);Wait(23);Off(OUT_AC);//
 SendMessage(signal_catch);//  リリパック掴む1
 ClearMessage();
 until(Message()==signal_end);
 Wait(100);
 SendMessage(signal_catch);//  リリパック掴む2
 ClearMessage();
 until(Message()==signal_end); 
 OnRev(OUT_AC);Wait(90);Off(OUT_AC);
 circling_left;Wait(102);Off(OUT_AC);//調整
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//白なら
 while(SENSOR_2<gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);//黒なら
 while(SENSOR_2>gray){OnFwd(OUT_AC);}Off(OUT_AC);Wait(100);
 go_ahead;Wait(15);Off(OUT_AC);//wait調整
 SendMessage(signal_release);//  4個完了
 ClearMessage();
 until(Message()==signal_end);
 OnRev(OUT_AC);Wait(100);Off(OUT_AC);
 }


*反省・感想 [#tb6dfd41]


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