- 追加された行はこの色です。
- 削除された行はこの色です。
[[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]