- 追加された行はこの色です。
- 削除された行はこの色です。
[[2008b]]
*課題 ライントレースロボットの作成 [#a7cd55b7]
**内容 [#v4633c8e]
チームで作成したコースに沿って動くロボットを作成
**注意点 [#j6efedd9]
- 速さと正確さを追求すること
- 交差点で優先側を走っていない場合には、一時停止すること
- 前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
- コースを2周したら自動的に止まること
*目次 [#g44cdeb3]
#contents
*コース [#e6826e93]
コースは変則的にカーブを織り交ぜ、交差点が4つあるコースを作った。
#ref(2008b/A8/課題2左/IMGP0145.JPG,20%,コース)
特に考えずに書いてみたら交差点のうち3つが一か所に集中してしまったので難易度が高くなった。
*ロボット製作 [#u15ec97c]
#ref(2008b/A8/課題2左/IMGP0155.JPG,20%,)
#ref(2008b/A8/課題2右/全景.JPG,20%,)
**コンセプト [#hcaa1a4b]
今回の課題では、二台のロボットが入り組んだコースを走るため、次のようなコンセプトのロボットを制作した。
・素早い
・シンプル
**ベース [#c98b8d27]
今回のベースはドライブベースをもとに製作した。
前回の課題で、四輪タイヤではカーブでの摩擦が大きいことを学んだため、今回の課題も二輪+キャスターによる機構に決定した。
#ref(2008b/A8/課題2左/IMGP0154.JPG,20%)
#ref(2008b/A8/課題2右/ベース.JPG,20%)
**センサー[#u0e6c304]
今回の課題では、二台のライントレースロボットを同時に走らせるので、光センサーとタッチセンサーを使用した。
#ref(2008b/A8/課題2右/ダブルバンパー.JPG,20%)
***光センサー [#t5ab022d]
当初このロボットは、コースの黒線に光センサーが入るように作成した。
しかし、もう一つのグループのロボットがコースの黒線を光センサーが挟むように作られており、コースもそのロボット用に作られていたので我々のロボットもそのような仕様に変更した。
つまり、下図のようになる。
ず
#ref(2008b/A8/課題2右/ライントレース.gif,20%)
**タッチセンサー [#u0892d86]
タッチセンサーは、前回の授業で作りかけだったダブルバンパーに設置し、車体前方に取り付けた。
タッチセンサー自体は二個使用したが、コードは一か所に接続し機能的にはシングルバンパーとして使用した。
#ref(2008b/A8/課題2左/IMGP0153.JPG,20%,)
*プログラム [#vc43ed1c]
光センサーが黒線を挟んでいるため、プログラムは黒線を感知したら方向修正を加えるように作った。
具体的には、右のセンサーが黒を感知したら右へ、左なら左へ方向修正できるようにした。
**今回のプログラム [#ab3fc642]
#define THRESHOLD 50
int move_count;
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_TOUCH);
SetPower(OUT_A,4);
SetPower(OUT_C,7);
move_count = 0;
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1は光センサー
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3は光センサー
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2はタッチセンサー
SetPower(OUT_A,4); //モーターAの出力を4に
SetPower(OUT_C,7); //モーターCの出力を7に
move_count = 0; //move_countの値を0に
while (move_count <= 8) {
if(SENSOR_2==0){
if (SENSOR_1 > THRESHOLD) {
if (SENSOR_3 > THRESHOLD) {
OnFwd(OUT_A+OUT_C);
} else {
Off(OUT_A);
while (move_count <= 8) { //move_countが8以下の時下を繰り返す
if(SENSOR_2==0){ //タッチセンサーが働いていない時
if (SENSOR_1 > THRESHOLD) { //右の光センサーが白のとき
if (SENSOR_3 > THRESHOLD) { //左の光センサーが白の時
OnFwd(OUT_A+OUT_C); //前進
} else { //左の光センサーが黒の時
Off(OUT_A); //左に方向転換
OnFwd(OUT_C);
}
} else {
if(SENSOR_3 > THRESHOLD) {
Off(OUT_C);
} else { //右の光センサーが黒の時
if(SENSOR_3 > THRESHOLD) { //左の光センサーが白の時
Off(OUT_C); //右に方向転換
OnFwd(OUT_A);
} else {
Off(OUT_A+OUT_C);
} else { //左の光センサーが黒の時
Off(OUT_A+OUT_C); //停止
Wait(100);
OnFwd(OUT_A+OUT_C);
Wait(70);
OnFwd(OUT_A+OUT_C); //前進
Wait(70); //交差点を超える
Off(OUT_A+OUT_C);
(move_count);
move_count = move_count +1;
move_count = move_count +1; //move_countに1を足す
}
}
}
if(SENSOR_2==1){
OnRev(OUT_A+OUT_C); Wait(80);
Off(OUT_A+OUT_C);
if(SENSOR_2==1){ //タッチセンサーが押されたとき
OnRev(OUT_A+OUT_C); Wait(80); //後退
Off(OUT_A+OUT_C); //停止
Wait(20);
OnFwd(OUT_C);
OnFwd(OUT_C); //90°方向転換
OnRev(OUT_A);
Wait(50);
OnRev(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C); //後退
Wait(100);
Off(OUT_A+OUT_C); Wait(400);
Off(OUT_A+OUT_C); Wait(400); //停止しもう一台のロボが通過するを
待つ
OnFwd(OUT_A+OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
Wait(35);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
Wait(50); //元の位置へ戻る
}
}Off(OUT_A+OUT_C); }
}
}Off(OUT_A+OUT_C); } //停止
**プログラムの工夫点 [#q44ab613]
ロボットを二周で止めるのには変数を使用した。交差点で一時停止するように黒線を横に引いた。ロボが二つのセンサーで黒を感知、つまり黒の横線の上に着いたら、変数の値を+1して、値が8を超えると停止するように設定した。
二台のロボットをお互いに逆方向を向いてライントレースさせるために、もう一台のロボットをよけるプログラムを作った。
簡単なコースではうまくいったが我々のチームのコースのように交差点が集まっている複雑なコースでは成功率は低かった。
*発表を終えて [#hf93795f]
最初は何度ロボを走らせても必ず失敗していて、全く完走しなかった。しかし、コースを逆に走らせてみると、とてもすんなりと完走することができた。発表の時はうまく相手のロボをよけてくれるかが心配だったが、なんとか成功することができた。しかしその後、別のことを試しているときにロボが机から落ちて大破するという事件が起こってしまった。しかし基本的には大きなミスもなく、グループのロボが二台とも完走できたのでよかった。
発表前に何度もリハーサルしたので、発表では一発で成功した。
衝突した時の動きがあまりうまくいかなかったのが残念だった。
A8右はひとりで制作したため、バンパーを無意味なダブルバンパーのままでやるなど、少し雑になってしまった。また、プログラムももう少し工夫すればよかったと思う。
*コメントをどうぞ [#k6619f8c]
- 書くべきことをきちんと押さえていて良いと思います。 -- [[FI]] &new{2009-02-14 (土) 17:30:53};
#comment