2009a☆ロボコン

ロボコンについて

紙パックを収集して色ごとに別の目的地まで運ぶ

フィールドの説明

robocon2009a-1.png

◦フィールドは約160cm×110cm
◦運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
◦紙パックはすべての面に白あるいは緑色の画用紙がはられている
◦スタート地点の壁、中央の壁、ゴール近くの障害壁の断面は約89mm x 38mm
◦目的地の正方形の3辺は19mm×19mmの角材で仕切られている
◦黒い線の太さは約25mm

基本ルール
◦紙パックを所定の場所に運ぶ。
◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまでとする。
◦スタート時は上空も含め「スタート地点」からはみ出さないこと。
◦スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
◦開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。
◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
◦途中でうまく動かなくなった場合、1回限り再スタートすることができる。
◦競技終了時点で、運んだ紙パックにロボットの一部が触れていてはならない。触れている場合は、その紙パックは加算しない。
◦ゴール内のフィールドに接地している紙パックだけを得点の対象とする。

基本得点の計算方法
◦紙パックを一個運んで積み上げると、白パックの場合
◦それぞれの色につき、1個目は2点、2個目は4点、3個目は8点とする。
◦間違った色の紙パックが1個混入されている場合は、その色の紙パックの合計点を半分にする。2個混入されている場合は、1/4の得点にする。

技術点の計算方法
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(12チーム)が20点満点で採点し、その平均点を求める。

得点の目安
◦紙パックを集める動作 (5点)
◦紙パックを運ぶ動作 (3点)
◦紙パックをゴールに入れる動作 (3点)
◦2台以上のロボット、あるいは単体のロボットの場合は2台のRCXの連携の良さ(3点)
◦自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
◦その他 (3点)



『2009a/ロボコン』より

設計

(とりあえずの)役割分担
.蹈椒奪硲院鈴
▲蹈椒奪硲押В觧
ロボット1のプログラム:竹
ぅ蹈椒奪硲欧離廛蹈哀薀燹中立な稲妻

最初の予定

 案としてはまず一つの機体で壁を超えるものと、二つの機体で片方がもう片方を運搬して壁を超えさせ、そのもう片方が壁の向こうで作業するものの二つが出た。しかし、一つの機体に機能を詰め込むと大きく、重くなりすぎ壁の二十センチの隙間を超えることができないとして二つの機体でいくこととなった。

 次に二つ機体のどちらにどの機能を担当させるかについて、一つの案は片方はもう片方を運搬するだけでもう片方がパックをつかみ、運搬し、ゴールさせるというもの、もう一つは片方はもう片方を運搬した後、パックををもう片方がいる側に落とし、もう片方はそれを下でキャッチし、運搬してゴールさせるというものだった。しかし二つ目の案はかべごしではRCX同士でのやり取りができないため、二つの機体での連携が難しいとして一つ目の案でいくことなり、その他個々の細かい構造などの工夫はその担当者に任された。 以後、もう片方の機体を運搬する機体をロボット1、運搬され、壁の向こうで作業をする機体をロボット2と言っている。  

最終的に・・・

機体

ロボット1
全体

11 029.JPG
11 030.JPG

 ロボット2を乗せるために低く平らな機体にし、そこにスロープを付けた。

スロープ部分のストッパー

11 028.JPG

 ロボット2が降りやすくするためなだらかに長めのスロープにしたところ、車体が回転する際の遠心力でスロープが勝手に降りてしまうようになったため取り付けた。ポイントはゴムの力でスロープが一定以上の位置にあるときは降りないようにするが、ある一定の位置まで降ろすと逆にスロープを下に抑えつけるように力が働くところ。これにより移動中はスロープを抑えることでロボット2が落ちないようにし、降りる際はいち早くスロープを安定させることでロボット2が安全に降りられるようにした。

タッチセンサー、光センサーと後輪

11 032.jpg

 ,タッチセンサーで△光センサー。タッチセンサーは中央の壁に着いたかどうかを判断させるつもりでつけたため、壁と機体のスペースを空けないようにできる限り小さくした。そのまま取り付けなかったのは多少機体が斜めっても反応するようにするため。  3輪タイプにしたのはタイヤの摩擦をできる限り減らし、移動の際に発生する誤差を減らすため。タイヤを機体から少し伸ばしたのは回転する際に機体をタイヤが追うようにしてよりスムーズに回転できるようにするため。

ロボット2
全体

016.JPG
017.JPG

 全長を短くするなど、なるべく小回りが利くように工夫した。

牛乳パックの運び方

0018.jpg

 四角を牛乳パックとすると矢印の方向にアームを動かして牛乳パックを上の写真の状態に乗せて運ぶ形にしました。 牛乳パックの落とし方

0019.jpg

 今度は、逆方向にアームを回転させ矢印の方向にアームが動き牛乳パックを落とします。

プログラム

ロボット1
大まかな動きとしてはページの最初のコース図で言うとスタートから下に降り、ラインに沿って壁まで生きそこから上へ行き、二十センチの低くなるところへたどりつく形。ただプログラムはラインをまたぐ点、壁に触る点をチェックポイントとして進むようになっていてラインをトレースするようにはなっていない。これは中央付近のラインが十字やT字に交わっているため、ラインをトレースする方法だと光センサー2つでは見分けるのが難しいと思ったためである。

 #define THRESHOLD 46 //閾値
 #define ahead OnFwd(OUT_A+OUT_C); //前進
 #define back OnRev(OUT_A+OUT_C);Wait(200); //後退  
 #define left OnFwd(OUT_A); OnRev(OUT_C); Wait(90); //右に90度曲がる
 #define right OnFwd(OUT_C); OnRev(OUT_A); Wait(90); //左に90度曲がる

 
 task main()
 {
 SetSensor(SENSOR_1, SENSOR_LIGHT);//SENSOR_1を光センサーに設定
 SetSensor(SENSOR_2, SENSOR_TOUCH);//SENSOR_2をタッチセンサーに設定
 SetSensor(SENSOR_3, SENSOR_LIGHT);//SENSOR_3を光センサーに設定
 Wait(200);//上の機体をセットする待ち時間
 ahead
 until (SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD); //ラインをまたぐまで前進
 left
 ahead
 until (SENSOR_2==1);//左へ曲がったのち中央の壁に触るまで前進
 back
 Wait(50);//左へ曲がるために少し下がる
 left
 ahead
 until (SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD);//左に曲がったのちラインをまたぐまで前進
 ahead
 Wait(30);//位置を少し調節
 right
 ahead
 until (SENSOR_2==1);//右へ曲がり壁に触るまで前進
 SendMessage(11);//壁に触ったらロボット1に合図を送る 「頑張ってこいよ」(^o^)ノシ
 Wait(800);ロボット1が降りるまで待つ
 back//邪魔にならないよう下がる

 }

ロボット2

線路3.jpg

機体は普通と違い、後ろ向きで作られたので、プログラムもすべて反対にする。

第一級定義

 #define THRESHOLD 40 //閾値
 #define ahead OnRev(OUT_A+OUT_C); //もともとは後退だけど、ここは前進
 #define back OnFwd(OUT_A+OUT_C); //もともとは前進だけど、ここは後退
 #define right OnFwd(OUT_A); OnRev(OUT_C); //右に曲がる
 #define left OnFwd(OUT_C); OnRev(OUT_A); //左に曲がる
 #define SIGNALON 11 //通信機能応用の方案で使うもの
 int CC //交差点を数えるための変数

第二級定義

 #define right90 OnFwd(OUT_A); OnRev(OUT_C); Wait(90); //右に90度曲がる
 #define left90 OnFwd(OUT_C); OnRev(OUT_A); Wait(90); //左に90度曲がる
 #define no_line (SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD) //光センサー両方とも反応しない
 #define left_line (SENSOR_1>=THRESHOLD)&&(SENSOR_3<THRESHOLD) //左の光センサーしか反応しない
 #define right_line (SENSOR_1<THRESHOLD)&&(SENSOR_3>=THRESHOLD) //右の光センサーしか反応しない
 #define touch_line (SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD) //光センサー両方反応する、つまり線/交差点にタッチすること
 #define touch SENSOR_2=1 //タッチセンサ反応する

第三級定義

 #define 0_0 if(no_line){ahead} //光センサー両方とも反応しないとき、前進
 #define 1_0 if(left_line){left} //左の光センサーしか反応しないとき、左に曲がる
 #define 0_1 if(right_line){right} //右の光センサーしか反応しないとき、右に曲がる
 #define 1_0_2 if(left_line){right} //左の光センサーしか反応しないとき、右に曲がる
 #define 0_1_2 if(right_line){left} //右の光センサーしか反応しないとき、左に曲がる
 #define co1 if(touch){Off(OUT_A+OUT_C); OnFwd(OUT_B); Wait(50); start keep;} //回収作業1
 #define co2 if(touch){Off(OUT_A+OUT_C); stop keep; OnRev(OUT_B); Wait(80);} //回収作業2

第四級定義

 #define go_ahead 0_0; 1_0; 0_1; //線に沿って前進
 #define go_back 0_0; 1_0_2; 0_1_2; //線に沿って後退

複数タスク、牛乳パックを落とさないようにするための命令

 task keep()
 {
 repeat(1000)
 OnFwd(OUT_B); Wait(5);
 Off(OUT_B); Wait(5);
 }

メインタスク

 task main()
 {
 CC=0;
 SetSensor(SENSOR_1, SENSOR_LIGHT);
 SetSensor(SENSOR_2, SENSOR_TOUCH);
 SetSensor(SENSOR_3, SENSOR_LIGHT);
 ClearMessage(); //ここまでは基本セット
 
 while (true) {
 until (Message() == SIGNALON); //信号を受けるまで待つ
 ahead; //ここからは赤い線路
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 co1; //牛乳パック回収
 go_back;
 if(touch_line){Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(180);}
 go_ahead;
 co2; //回収完了・赤い線の部分完了
 go_back; //青い線の部分開始
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 co1;
 go_back;
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=2) //「二番目の交差点まで」の意味
 CC=0;
 Off(OUT_A+OUT_C); left90;
 go_ahead;
 co2; //青い線の部分完了
 go_back; //緑の線の部分開始
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=3)
 CC=0;
 Off(OUT_A+OUT_C); left90;
 go_ahead;
 co1;
 go_back;
 if(touch_line){Off(OUT_A+OUT_C); left90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=2)
 CC=0;
 Off(OUT_A+OUT_C); left90;
 go_ahead;
 co2; //緑の線の部分完了
 go_back; //紫の線の部分開始
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 co1;
 go_back;
 if(touch_line){Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(180);}
 go_ahead;
 co2; //紫の線部分完了
 go_back; //黄色の線の部分開始
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 co1;
 go_back;
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=2)
 CC=0;
 Off(OUT_A+OUT_C); right90;
 go_ahead;
 co2; //黄色の線の部分完了
 go_back; //黒い線の部分開始
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=3)
 CC=0;
 Off(OUT_A+OUT_C); right90;
 go_ahead;
 co1;
 if(touch_line){Off(OUT_A+OUT_C); right90;}
 go_ahead;
 if(touch_line){ahead; Wait(20); CC=CC+1; go_ahead}
 until(CC=2)
 CC=0;
 Off(OUT_A+OUT_C); right90;
 go_ahead;
 co2; //黒い線の部分完了・すべて完了
 }
 }

ロボコン本番&反省点

 本番では上手くロボット2をうまく運べなかった。 全員で集まれる機会が少なかったのでほとんどの作業を各で進めることになり、全体の動作や機体プログラムの確認が十分でなかったのが問題だった。個々の動作では成功していたが、実際二つの機体で試すと上の機体の重さで回転にかかる時間が変わったりしていた。また機体作成とプログラムの作成を別個に行っていたため、本番に近くに二つが合わずにまた作り直すことになってしまった。もう少し計画的に作成を進める必要があったと思う。

感想

鈴:今までのどの課題よりも精密な動きが要求されたのでとても難しかった。ロボットが壁すら越えられなかったのは残念だが、正確にプログラムを組むことや正確に動くロボットを作ることがいかに大変で難しいことかがよくわかった。

竹: 集中講義と重なったために最初の立案くらいしかちゃんと参加することができず申し訳なかったです。 私は主にロボット1のプログラムを考えたのですが、フィールドがうまく想像できず難しかったです。ロボットとのバランスも考えなければいけなかったので 難しかったです。 全体の授業を通して大変なことの方が多かったけど、プログラムやロボット作りなんてする機会はなったと思うから、良い経験になりました。

中立な稲妻: 全く反対方向のプログラムを作るのは非常に大きな挑戦である。 徹夜の作業はやはり大変...

k山: 牛乳パックをつかんで運ぶという作業をさせるロボットはやはりロボットの作成やプログラムも難しかった。

コメント

 お願いします♪



添付ファイル: file0019.jpg 263件 [詳細] file0018.jpg 260件 [詳細] file017.JPG 273件 [詳細] file016.JPG 256件 [詳細] file線路3.jpg 254件 [詳細] file11 032.jpg 247件 [詳細] file11 028.JPG 250件 [詳細] file11 030.JPG 279件 [詳細] file11 029.JPG 265件 [詳細] filerobocon2009a-1.png 251件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-08 (土) 18:45:37