目標

  • 黒い線に沿って動くロボットを作る
  • A地点からB地点へ (P三叉路およびQ交差点はともに直進)
  • 途中においたボールを目的地まで運んで、ゴールに入れる
  • その途中、三叉路および交差点では2秒間停止する
  • 最後、B地点に入る三叉路付近からボールをシュートする

無題.png (画像はロボティクス入門ゼミ2015年課題2のページから頂き、書き加えた)

ロボット

全体像。オーソドックスな4輪ロボットの前面にアームのはさみとライントレーサーを取り付けた。

new_IMG_0555.jpg

new_IMG_0556.jpg

ライントレーサーは、読み取りが正確になるように地面の近くに設置。 前輪の前に置く事により曲がるべき場所で行き過ぎる前に曲がる事ができた。

new_IMG_0557.jpg

一番前のアームのはさみでボールをキャッチ&リリースできる。モーターで開閉する。

new_IMG_0558.jpg new_IMG_0559.jpg

プログラム

定義

確実にライントレースできるように、右左折だけでなく旋回も書いた。

#define go_forward OnFwd(OUT_AC); // 直進
#define turn_left1 OnFwd(OUT_C);OnRev(OUT_A)// 左旋回
#define turn_left0 OnFwd(OUT_C); // 左折
#define turn_right0 OnFwd(OUT_A); // 右折
#define turn_right1 OnFwd(OUT_A);OnRev(OUT_C)// 右旋回

プログラム

ライントレースの値は、4段階に設定した。黒線の左側をライントレースする。線上なら左へ、線から外れれば右へ動く。 交差点や三叉路までは時間を設定し、通常のライントレースを行い 交差点や三叉路では専用のライントレースを行う。 交差点で2秒間停止したあとにボールをはさむ。 最後は前進と後退をしてボールをシュートする。

task main()
{
	 SetSensor(SENSOR_3,SENSOR_LIGHT);

	 ClearTimer(0);        // タイマーをリセット
	 while (FastTimer(0)<800) {        // 8秒間通常のライントレース
	 if (SENSOR_3 < 35) {        // 線上なら左へ
		 turn_left1;
	} else if (SENSOR_3 < 40) {        // 黒に近い境界付近で左折
		turn_left0;
		Wait(3);
	} else if (SENSOR_3 < 45) {        // 中間で直進
		go_forward;
	} else if (SENSOR_3 < 50) {        // 白に近い境界付近で右折
		turn_right0;
	} else {
		turn_right1;        // 完全に白なら右旋回で線上へ
	}
	}

	ClearTimer(0);
	while (FastTimer(0)< 20) {        //交差点判定用ライントレース
	if (SENSOR_3 < 35) {
		turn_left1;
	} else if(SENSOR_3 < 40) {
		turn_left0;
	} else { if (SENSOR_3 < 45) {
		go_forward;
	} else if (SENSOR_3 < 50) {
		turn_right0;
	} else {
		turn_right1;
	}
	ClearTimer(0);
	}
	}
	
	Off(OUT_AC);Wait(200);        // 2秒間停止
	OnFwd(OUT_B); Wait(120);        // アームを閉じる
	Off(OUT_B);
	turn_right1; Wait(25);        // 進行方向修正
	OnFwd(OUT_AC);Wait(20);        // 交差点を渡る
	ClearTimer(0);

	while (FastTimer(0)<850) {        // 8.5秒間通常のライントレース
	if (SENSOR_3 < 35) {
		turn_left1;
	} else if (SENSOR_3 < 40) {
		turn_left0;
	} else if (SENSOR_3 < 46) {
		go_forward;
	} else if (SENSOR_3 < 50) {
		turn_right0;
		Wait(2);
	} else {
		turn_right1;
	}
	}

	ClearTimer(0);
	while (FastTimer(0)< 23) {        // 三叉路用ライントレース
	if (SENSOR_3 < 35) {
		turn_left1;
	} else if(SENSOR_3 < 40) {
		turn_left0;
	} else { if (SENSOR_3 < 45) {
		go_forward;
	} else if (SENSOR_3 < 50) {
		turn_right0;
	} else {
		turn_right1;
	}
	ClearTimer(0);
	}
	}
	
	Off(OUT_AC);Wait(200);        // 2秒間停止
	turn_right1; Wait(25);        // 進行方向修正
	OnFwd(OUT_AC);Wait(30);        // 交差点を渡る
	ClearTimer(0);

	while (FastTimer(0)< 30) {        // 通常のライントレース
	if (SENSOR_3 < 35) {
		turn_left1;
	} else if(SENSOR_3 < 40) {
		turn_left0;
	} else { if (SENSOR_3 < 45) {
		go_forward;
	} else if (SENSOR_3 < 50) {
		turn_right0;
	} else {
		turn_right1;
	}
	ClearTimer(0);
	}
	}
	
	Off(OUT_AC);
	OnRev(OUT_C); Wait(30);        // 方向修正
	Off(OUT_C);
	OnRev(OUT_B); Wait(90);        // アームを開く
	Off(OUT_B);
	OnFwd(OUT_AC); Wait(50);        // ボールをシュート
	OnRev(OUT_AC); Wait(50);
	Off(OUT_AC);

}

考察・感想

課題1に比べて慣れてきたがプログラミングが難しかった。長いプログラムになってしまった。 今回のプログラムは100%成功するプログラムでは無かった。通常のライントレースのときに、三叉路や交差点まで設定した秒数よりも早かったり遅かったりすると曲がれなかったり通り過ぎたりした。次はもっと安定するプログラムを書きたいと思う。電池にも左右された。ボールをはさむアイディアは良かったと思う。こちらは安定してボールをはさめた。(ボールの位置の微調整は必要なのだが)今回は授業外に集まる事が多く、非常にためになった。仲間と協力できてよかった。


添付ファイル: file無題.png 109件 [詳細] filenew_IMG_0559.jpg 127件 [詳細] filenew_IMG_0558.jpg 122件 [詳細] filenew_IMG_0557.jpg 120件 [詳細] filenew_IMG_0556.jpg 117件 [詳細] filenew_IMG_0555.jpg 133件 [詳細]

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