ロボット

はじめに

このコースのAからBをトレースする。

yakushi.shinshu-u.ac.jp.png

黒い線と白いところの間をトレースし、交差点を横断し、ボールを掴み目的地にボールを置くといった動作をするロボットを製作した。動くスピードを遅くすることで正確にトレースすることが出来る様になった。

ロボット本体構造

機体の外観

クワガタのような外観 動力のあるタイヤが2つにクルクルと回転する補助輪が一つである。 アームは下からボールをすくいあげるように掴む構造になっている。 明るさセンサーはタイヤから少し離れた前方についている。コードが多くあるので引っかからないように広がらないようにとめてある。

IMG_2255.JPG

IMG_2256.JPG IMG_2258.JPG IMG_2261.JPG

ボールをつかんで離すための機構

モーターの縦回転を横回転に変えるために4枚歯の歯を4つ使っている。 57.png

アームが大きく開いていて、それが閉じることによって ボールをつかむことが出来る。

IMG_2259.JPG

IMG_2260.JPG

黒い線を辿るための機構

アームの下についたセンサーによって、黒い線、白いところ、その間を認識する。 IMG_2262.JPG

プログラムの説明

赤外線センサーを用い、入射した赤外線の反射強度により、ロボットが黒い線のどの辺を走行しているか判断している。 1)線の外(白) 2)線の境界上(グレー) 3)線の上(黒) の三種類として認識する。進行方向向かって左側の境界上を移動させるので、ロボットの場所によりそれぞれ 1)右にシフト 2)直進 3)左にシフト しながら進んでいく。基本的にはwhileループで1[ms]ごとにセンサーの値を取得、上記の動作を繰り返す。 交差点の判定は、スタートからの経過時間と黒の線上にいる時間[ms]によって判定している。1ループ1[ms]に設定している為、黒の処理に入ったときに黒カウンタnを上げる。nの次元は[ms]となる。交差点に到達する前にも、長時間黒の上に滞在するポイントが存在したので、それらを省くためにCurrentTick()関数を用いてプログラム開始からの時間を条件に補助的に採用している。 ボールキャッチ処理は完全にスタート時からの秒数に依存している。

#define BLACK 36
#define WHITE 48
#define SPEED 25
#define go_forward OnRev(OUT_BC,SPEED);
#define turn_left OnRev(OUT_B,SPEED);Off(OUT_C);
#define turn_right Off(OUT_B);OnRev(OUT_C,SPEED);
#define turn_left2 OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);
#define STEP 1
#define tukamu OnFwd(OUT_A,SPEED);Wait(1000);Off(OUT_A);//ボールを掴む
#define hanasu turn_right;Wait(1000);go_forward;Wait(300);Off(OUT_B);Off(OUT_C);OnRev(OUT_A,SPEED);Wait(1000);Off(OUT_A);//ボールを離す
task main(){
	SetSensorLight(S3);
	int n=0; //黒の上にいる時間を計測するための変数
	int m=0;
	int flg1=0; //交差点通過前=0 交差点通過後=1
	int flg2=0; //ゴール判定用のフラグ
	int flg3=0; //ボールキャッチ前=0 ボールキャッチ後=1
	long t0=CurrentTick();
	while(flg2==0){//ゴール判定用の
		if(CurrentTick()-t0>9000 && flg3==0){ //ボールをつかむ
			tukamu;
			flg3=1;//ボールを掴んだというフラグを立てる
		}else if(SENSOR_3 < BLACK){ //黒の上なら
			turn_left;
			n++;//黒のカウンターを上げる
			if(n>500 && CurrentTick()-t0>10000 && flg1==0){ //黒の上に1秒以上 & スタートから10秒以上経過しているなら
				Off(OUT_BC);
				n=0; //黒のカウンターリセット
				flg1=1; //交差点を通ったというフラグをたてる
				turn_left2;
				Wait(700);
			}
	}else if(n>500 && flg1==1){
				flg2=1;//ゴールを通過したというフラグを立てる
		}else if(SENSOR_3 < WHITE){ //ラインの境界なら
			go_forward;
			n=0;//黒のカウンターをリセットする
		}else{ //それ以外(白)なら
			turn_right;
			n=0;
		}
		Wait(STEP);//1msの間待つ。1サイクル1msに設定する
	}
	hanasu;//ボールを放す
}

感想

交差点を通過する時など、白黒をセンサーに認識させたりと、思っている以上に難しかった。機体の回転方法をコンパスの様に回転させるのでなく、旋回する様にしたら上手くいったりと、細かい所での工夫が難しく楽しくもあった。


添付ファイル: file57.png 491件 [詳細] fileyakushi.shinshu-u.ac.jp.png 390件 [詳細] fileIMG_2260.JPG 564件 [詳細] fileIMG_2266.JPG 116件 [詳細] fileIMG_2265.JPG 112件 [詳細] fileIMG_2264.JPG 118件 [詳細] fileIMG_2263.JPG 124件 [詳細] fileIMG_2262.JPG 384件 [詳細] fileIMG_2261.JPG 348件 [詳細] fileIMG_2259.JPG 394件 [詳細] fileIMG_2258.JPG 372件 [詳細] fileIMG_2257.JPG 125件 [詳細] fileIMG_2256.JPG 360件 [詳細] fileIMG_2255.JPG 290件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-12 (水) 23:31:13