ライントレースロボット

目次

課題

 黒い線に沿って走るロボットの製作、ただし以下の事に注意する

1 速さと正確さの追求

2 交差点で優先道路を走ってない場合には、一時停止をする

い.jpg

3 前方にあるロボットと衝突した場合、相手のロボットが離れるのを待つこと

ロボット紹介

まずキャスターをつけ3輪駆動にする事にした。この方が曲がりやすく回転も容易にできると思ったからだ。

バンパーはシングルバンパーにしてマシンのよけいな部分を剥ぎ落とした。

車輪.jpg  071204_165731.jpg 全体.jpg

前輪駆動にすることでセンサの反応が後輪駆動にするより早い。よって小回りを利かせた走行が可能となった。

はね.jpg

マシンの形状としては3輪で走る意外はノーマルなタイプとなった。

光センサーの取り付け

せんさ.jpg            光2.jpg

2つの光センサーで黒い線を挟むような『挟み型』を採用。 右の光センサが反応することで右に曲がり、左センサが反応することで左に進みます。両方白を感知するときはまっすぐ進むのです。

メリットとして黒線からはみ出たときに反応が早い。比較的楽に曲がる事ができます

デメリットとしては交差点に止まれの線がないと 光センサが認識しないという欠点があります。つまり全てのコースに対応するという訳でないということです。

問題

今回の課題で以下の問題が発生した

1 急なカーブに対応できるか?
2 交差点を通るためのプログラムはどうするか?
3 まっすぐに進まないマシン

1の問題は我々の無計画なコース作りに問題があった。マシンの性能を知らずにコースを作ったので急なカーブ多く、交差点前でもカーブがある。急カーブでマシンが脱線してしまった。

2交差点を通るプログラムは両方のセンサーが同時に白を感知した回数を数え、3数えると元のループに戻るものだったが、交差点の前にカーブがあり停止線に曲がって止まるようになってしまった。そのまま進むと渡った後元のループに戻らなかった。

3我々のマシンはなぜか左に曲がってしまう。

1の問題解決

まず急カーブの問題を解決するためにモータを密着させマシンの幅を限界まで狭くした。 こうする事で小回りを利かすようにしたのである。   

また前方に駆動輪を設置することによって後方に設置するよりも早く反応し小回りの良さが上がった。

そしてカーブするときに片方のモーターを止める事で急カーブにも対応できるようにした。    

もーた2.jpg

2の問題 解決

2の問題は白を2回感知した後、ずれていたら修正するようにプログラムを直した。

交差点を渡るプログラム

x=0;
			while(x<3){
			if(SENSOR_2==1){         //タッチセンサーが感知したらループから抜け出します
				break;
				}
				if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){     //黒を感知するまで進みます
	 			until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD)||(SENSOR_2==1));
				x++;                            //白を感知した回数を数えます
				}else if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){      //白を感知するまで進みます
				if(x<2){
				until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
				}else{
				until((SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)||(SENSOR_2==1));
				x++;
				}

片方が交差点の黒線から外れたときの修正プログラム

else if((SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD)&&(x==2)){                    //左が感知したら左に曲がります
	 			

 Off(OUT_A);

	 			

 OnFwd(OUT_C);

until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){      //両方が白を感知するまで進みます
	 	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
	 	x=3;
	 	}else if((SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD)&&(x==2)){ //右が感知したら右に曲がります。
		OnFwd(OUT_A);
		Off(OUT_C);
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
		 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){ //両方が白を感知するまで進みます
	 	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
			  x=3;

こうすることでもし黒線を片方だけ感知しても修正してくれます

3の問題解決

3の問題は直進できるようにするためにSetPowarをつかいモーターの速度の微調整をする事で解決した。 しかしそれでも完全に直進しない

task main(){
     SetPower(OUT_A,7); //左のモータ出力7
     SetPower(OUT_C,4);   //右のモータ出力4

コース紹介

コースは全体的にカーブが多く2つの交差点を設けてある(直線がほとんどない)

全体写真

こーす.jpg

交差点前に急カーブがある。おかげでマシンの性能が問われるようなコースにした

交差点写真

こうさ.jpg

プログラム

アームセンサが反応した時に以下の3種類の対応を見せる

①3秒間停止して待つ

Off(OUT_A+OUT_C);
	Wait(300);    //3秒停止

これは衝突後3秒間停止するプログラムの抜粋です。

②その場で1回転だけ360度旋回する

OnFwd(OUT_A);         //左モータ正回転
	OnRev(OUT_C);       //右モータ逆回転
	if(SENSOR_3<THRESHOLD){                                                    //もしセンサ3が白を感知していたら
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);//両方が黒を感知するまで
		}
	until(SENSOR_3<THRESHOLD);
	until(SENSOR_3>THRESHOLD);
	until(SENSOR_3<THRESHOLD);

衝突後1回転します。

③180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る

OnFwd(OUT_A);
	OnRev(OUT_C);
	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
		}
	hurimuki();
		OnFwd(OUT_A);
	 	OnRev(OUT_C);
		until (SENSOR_3<THRESHOLD);
	}

衝突後180度回転し5秒間逆走後元に戻ります。

①②③の複合とプログラムの全体

#define THRESHOLD 40     //光感知のための数値です
#define return_time 50     //5秒戻るための数値です
int x,y=0;
sub hurimuki(){                              //5秒戻るときのサブルーチンです
	until (SENSOR_3<THRESHOLD);
	ClearTimer(0);
	while(Timer(0)<return_time){
	OnFwd(OUT_A);
	OnFwd(OUT_C);
	until(SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD );
	if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
	Off(OUT_A);
	OnFwd(OUT_C);
                                                                                      
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
	 OnFwd(OUT_A);
	 Off(OUT_C);
                                                                                       
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
	Off(OUT_A+OUT_C);
	Wait(200);
	OnFwd(OUT_A+OUT_C);
	x=0;
	while(x<3){
	if(SENSOR_2==1){
	break;
	}
	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
       until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD));
	          x++;
	}else if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){
         until((SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	}else if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
           Off(OUT_A);
	OnFwd(OUT_C); 
           
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	 	x--;
		}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
		OnFwd(OUT_A);
		Off(OUT_C);
           until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
		x--;
			}
			}
		}
	}
 }
void atattara(){   //バンパーにあたったら何をするかです。一周ごとに仕事が違います。
	if(y<=2){
	Off(OUT_A+OUT_C);
	Wait(300);
	}else if(y>2&&y<=4){
	OnFwd(OUT_A);
	OnRev(OUT_C);
	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
		}
	until(SENSOR_3<THRESHOLD);
	until(SENSOR_3>THRESHOLD);
	until(SENSOR_3<THRESHOLD);
	}else {
	OnFwd(OUT_A);
	OnRev(OUT_C);
	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
		}
	hurimuki();
		OnFwd(OUT_A);
	 	OnRev(OUT_C);
		until (SENSOR_3<THRESHOLD);
	}
 }
task main(){
     SetPower(OUT_A,7);
     SetPower(OUT_C,4);
	SetSensor (SENSOR_1,SENSOR_LIGHT);
	SetSensor (SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
while(true){
		if(SENSOR_2==1){   //バンパーが感知すると作動します。いつでも作動します
		atattara();
		}
	 	OnFwd(OUT_A);
	        OnFwd(OUT_C);
 until((SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD )||(SENSOR_2==1));//どちらかのセンサーが黒を感知するまで走ります
	 if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
	 Off(OUT_A);
        OnFwd(OUT_C);
               
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 }else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
	 OnFwd(OUT_A);
	 Off(OUT_C);
                
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
		}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
	Off(OUT_A+OUT_C);
	Wait(200);
	OnFwd(OUT_A+OUT_C);
	x=0;
	while(x<3){
	if(SENSOR_2==1){          //タッチセンサーが感知したらループから抜け出します
	break;
	}
 if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){         //黒を感知するまで進みます
       until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	x++;                        //白を感知した回数を数えます
 }else if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){  //白を感知するまで進みます
	if(x<2){
	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	}else{
	until((SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	x++;
	}
	}else if((SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD)&&(x==2)){  //左が感知したら左に曲がります
	Off(OUT_A);
	OnFwd(OUT_C);
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));//両方が白を感知するまで進みます
	 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
			}
	x=3;
	 }else if((SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD)&&(x==2)){ 
	 OnFwd(OUT_A);
	 Off(OUT_C);
until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));              //両方が感知するまで進みます
		}
	x=3;
	}
 if(x==2){
	y++;
	 }
        }
	}
 }
}

このプログラムは1週するごとにアームセンサの反応する内容が違います。1週目は3秒止まる。2週目は1回転。3週目は180度回転後、5秒間逆走し再び元に戻ります。①②③を掛け合わせた走りをします

結果

071210_2351~01.jpg 071210_2351~02.jpg 071210_2352~01.jpg

他班のロボットと走行させたところバンパーが高すぎ、横の範囲が狭すぎた。これだと相手のバンパーが低すぎると反応できず衝突し、横にも反応できず飛ばされてしまい、コースからはずれてしまう。そこでバンパーの範囲を広くし、バンパーの高さを低くした。

ほーす.jpg

バンパー自体の位置を低くし、下にホースをたらす事で下の範囲を拡大。横にもバンパーの範囲を広くする事で衝突時に飛ばされる事を防いだ。

まとめ

工夫したところ

三輪駆動にすることで曲がりやすくしたところ

小回りのきく幅にしたところ

交差点で曲がっても戻るようにしたところ

衝突時の反応が1週ごとに異なること

バンパーの範囲を広くし、かつ横を限りなくスリムにする事で走行中、無駄に他のロボと衝突しなくなった。

苦労したところ

交差点でずれても修正するプログラムを考えるのがつらかった

コースがカーブだらけなので調整が大変でした

今後の課題

交差点とS路カーブで衝突してしまうと、修正プログラムを駆使してもコースアウトしてしまう。その確率100%。この問題をクリアできたら完璧な交通ルールを守るロボットになるだろう。

感想

コース作りのときもっと計画的に作ればよかったと深く反省する。おかげでプログラム製作が大変だった。 バンパーの反応が1週ごとに異なる動作をする。ここが1番の他班のとの違いだと自負する。それと課題発表後新たな問題が発生した。他のロボットと衝突したときにコースアウトしてしまう。僕らの班は、他の班と違いロボットが2台もない。当初完璧だと思っていたこのロボットも問題だらけだという事がわかった。教訓として実際に動かしてみるまで、わからない、何事も過信してはならないという事を学んだ。おかげでマシンの完成度も上がることもできた。次の課題は過信する事なく、貪欲に良いものを創るという気持ちを忘れないでいきたい。 

コメントをどうぞ

  • 交差点をどのように渡ろうとしているのか、2の問題解決だけからはわかりづらい。白の感知回数を元にしているようですが…なぜそれで交差点を通過できるのかを、きちんと解説してください。 次に、アームセンサが反応したときのプログラムについて書かれていますが、まずアームセンサ(タッチセンサ?)について、どのようにどこに取り付けられているのかが事前に述べられておらず、わかりづらいです。また、プログラム△鉢がどのような動作をするのかがよくわからないのですが、もう少し解説を付け加えてください。 -- まいける(TA) 2007-12-14 (金) 08:12:18
  • 初めて見た人にもわかるように、そのバンパーの機構でどのように接触センサーを押しているかの説明がほしいです。 -- クノ? 2007-12-15 (土) 20:27:15


添付ファイル: fileほーす.jpg 212件 [詳細] file071210_2342~01.jpg 113件 [詳細] file071210_2351~02.jpg 218件 [詳細] file071210_2352~01.jpg 213件 [詳細] file071210_2351~01.jpg 274件 [詳細] fileZT[Q.png 103件 [詳細] fileはね.jpg 195件 [詳細] fileもーた2.jpg 210件 [詳細] fileもーた.jpg 106件 [詳細] fileい.jpg 294件 [詳細] fileこうさ.jpg 216件 [詳細] fileこーす.jpg 191件 [詳細] file光2.jpg 201件 [詳細] file光.jpg 100件 [詳細] file全体.jpg 184件 [詳細] file071204_182819.jpg 104件 [詳細] file071204_165731.jpg 200件 [詳細] file071204_161858.jpg 98件 [詳細] fileせんさ.jpg 209件 [詳細] file交差点.psd 97件 [詳細] file車輪.jpg 210件 [詳細] file交差点.jpg 107件 [詳細] filerob.ait 164件 [詳細] filerob.pdf 146件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-12-15 (土) 20:27:16