2010a

目次

メンバー紹介

K.H           工学部  電気電子工学科

D.Y           工学部  情報工学科

てらすぃー       教育学部  芸術学科

第2回課題の内容

各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

  ゞき缶をコース上に戻して再びコースに戻って進む(担当K.H)

  空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む(担当D.Y)

  4饋回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む(担当てらすぃー)

ただし、

  ・速さと正確さを追求すること

  ・コースを1周したら自動的に止まること

  ・交差点では一時停止すること

第2回課題用コースの紹介

CA3A0012.JPG

見てわかるとおり3つの交差点と1つのループそして大量の直角コーナーでできています。正直なところ直角コーナーを曲がらせるのにかなり苦労しました。

ロボットの紹介

ロボットの外観

■横から見た様子です。アームを上方に上げています。

CA3A0007.JPG

■前方から見た様子です。アームは缶をつかむための位置に来ています。

CA3A0008.JPG

■後方から見た様子です。コードが少し目立っていますが駆動に問題はありません。

CA3A0009.JPG

各センサー紹介

■タッチセンサー

CA3A0010X.jpg

前方についていて、今回はこれが缶に接触するとロボが色々な動作をします。

■光センサー

CA3A0011X.jpg

ロボの下部中央付近についていて、今回はこれにコースとなるラインを感知させます。

工夫した点

1.前後の重量バランスを崩さないように前に飛び出している缶を操作するためのアームの構造をできるだけ簡素にした点。

2.やはり重量のバランスをとりやすくするために、ベースとなる車体部分の面積を元となった説明書に載っているローヴァーボットより1回り大きくし、また前輪と後輪の間の距離もだいぶ広げました。

3.光センサーは各種センサー紹介項目の写真では前方の黒いブロックと後方の緑のブロックで完全に固定されているように見えますが、実は黒いブロックとの間に薄いレゴブロック1つ分の隙間があり、車輪変更などをした場合の高さの調節が容易にできるようになっています。また、横幅の調節も可能です。(写真では幅最大、高さ中に調節されています。)

4.アームの構造が単純であるためアームの取替えが容易である点。

5.長いコードが地面に接触して走行の邪魔にならないようにコードをある程度固定するためのパーツを作った点。

問題点とその改善

1.[問題点]後輪の動力をはじめはゴムコンベアで前輪に伝えていたが、ゴムの特性が左右で完全には一致しないため、空転の起こる率の違いから直進するべき時に曲がってしまった。

[改善点]前輪への動力の伝達をあきらめゴムコンベアを取り払った。

2.[問題点]1.の後今度はカーブで十分に曲がれないという問題が起きた。

[改善点]前輪と後輪の間に3枚のギアを挟むことで基本構造はそのままに解決すること に成功しました。

3.[問題点]タッチセンサーが車体前面から飛び出していないのたまに反応しないことがあった。

[改善点]タッチセンサーを1ブロック分前に出すことで解決しました。

問題点の改善後の様子

■横から見た様子。大量のギアが見えます。アームを後ろにしたときにタイヤと接触しないように後輪を少し車体外側方向に移動させた点もポイント。

CA3A0013.JPG

■後ろから見た様子。コードをコードを押さえていたパーツにコードを巻き付けることで後ろがさっぱりしました。

CA3A0014.JPG

■前方から見た様子。タッチセンサーが以前より前方に飛び出しているのがわかると思います。

CA3A0015.JPG

それぞれのプログラム

ゞき缶をコース上に戻して再びコースに戻って進む(K.H)

#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t); Off(OUT_A+OUT_C);     //t秒前進
#define turn_right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//t秒右に旋回
#define turn_left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //t秒左に旋回
#define fleeze_there(t) Off(OUT_A+OUT_C);Wait(t);                        //t秒静止
#define limit 40                                                         //閾値
#define away_can OnFwd(OUT_B);Wait(50);Off(OUT_B);OnFwd(OUT_A+OUT_C);Wait(50);OnRev(OUT_A);OnFwd(OUT_C);Wait(180);OnRev(OUT_B);Wait(50);Off(OUT_B);
                                                                         //缶を自分後方のコース上に置く
#define return OnRev(OUT_A+OUT_C);Wait(50);OnFwd(OUT_A);OnRev(OUT_C);Wait(180);OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C);
                                                                         //缶を置いた後進行方向に向き直る
 int i=0;                                                               //変数iを交差点を感知した回数と定義しその初期値を0とする
task main()
{
 SetSensor(SENSOR_2,SENSOR_TOUCH);                                       //センサー2はタッチセンサーです
   start follow_line;                                                    //コース移動プログラム開始
   until (SENSOR_2 == 1);                                                //タッチセンサーが反応したら
   stop follow_line;                                                     //コース移動プログラム停止
   fleeze_there(100);                                                    //1秒静止
   away_can;                                    //1つ目の缶を自分後方のコース上に置く
   return;                                                               //進行方向に向き直る
   start follow_line;                                                    //再びコース移動プログラム開始
   until (SENSOR_2 == 1);                                                //タッチセンサーが反応したら
   stop follow_line;                                                     //コース移動プログラム停止
   fleeze_there(100);                                                    //1秒静止
   away_can;                                    //2つ目の缶を自分後方のコース上に置く
   return;                                                              //進行方向に向き直る
   start follow_line;                                                    //再びコース移動プログラム開始
}
task follow_line()
{
 SetSensor(SENSOR_1, SENSOR_LIGHT);                                      //センサー1は光センサーです
 SetSensor(SENSOR_3, SENSOR_LIGHT);                                     //センサー3は光センサーです
   while (i<9){                                                          //iが9未満のとき以下の行動をする
         if ((SENSOR_1 < limit) && (SENSOR_3 < limit))                   //両方のセンサーがラインを感知したら交差点なので
          {fleeze_there(200);                                            //2秒停止
           i++;                                                          //iに+1する
           go_straight(10);}                                             //交差点を前進し越える
              }
    else if ((SENSOR_1 > limit) && (SENSOR_3 > limit))                   //もしどちらのセンサーも無反応なら
          {go_straight(5);}                                             //直進
    else if ((SENSOR_1 > limit) && (SENSOR_3 < limit))                   //右のセンサーがラインを感知したら
          {turn_right(5);}                                               //右に旋回
    else if ((SENSOR_1 < limit) && (SENSOR_3 > limit))                   //左のセンサーがラインを感知したら
          {turn_left(5);}                                                //左に旋回
              }
Off(OUT_A+OUT_B+OUT_C);                                                  //モーターABCを停止
}

空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む(D.Y)

#define THRESHOLD 40
#define FRONT OnFwd(OUT_A);OnFwd(OUT_C);		//前進
#define BACK OnRev(OUT_A);OnRev(OUT_C);		//後進
#define RIGHT Off(OUT_A);OnFwd(OUT_C);			//右修正
#define LEFT OnFwd(OUT_A);Off(OUT_C);			//左修正
#define STOP Off(OUT_A+OUT_C);				//停止
#define ARMDOWN OnRev(OUT_B);Wait(100);		//アーム下降
#define ARMUP OnFwd(OUT_B);Wait(100);			//アーム上昇
#define ARMSTOP Off(OUT_B);				//アーム停止
#define TURN OnFwd(OUT_A);OnRev(OUT_C);Wait(180);	//180°旋回
#define RUN_TIME 1200					//起動時間


task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT); 
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
 
	ClearTimer(0);

	while(Timer(0) <= RUN_TIME ){					//タイマー0がRUN_TIME以下の時に繰り返す
	start line_trace;
	until(SENSOR_2==1);
	stop line_trace;
	start can_carry;}
} 

task can_carry()
{
	while(true)
{	if(SENSOR_1<THRESHOLD)
		if(SENSOR_3<THRESHOLD)
{			FRONT;Wait(20);					//前進
			TURN;							//180°旋回(後方を向く)
			ARMUP;							//アーム上昇
			FRONT;Wait(20);					//前進
			TURN;							//180°旋回(前方を向く)

}
		else{RIGHT;}							//左が白、右が黒を感知したとき、右修正。
	else{if(SENSOR_3<THRESHOLD){LEFT;}				//左が黒、右が白を感知したとき、左修正。
		else{FRONT;}}						//左右のセンサーが白を感知したとき、前進。
}
}

task line_trace()
{
	while(true)
{	if(SENSOR_1<THRESHOLD)
		if(SENSOR_3<THRESHOLD){STOP;Wait(15);FRONT;}		//左右のセンサーが黒を感知したとき、一時停止のち前進。
		else{RIGHT;}							//左が白、右が黒を感知したとき、右修正。
	else{if(SENSOR_3<THRESHOLD){LEFT;}				//左が黒、右が白を感知したとき、左修正。
		else{FRONT;}}						//左右のセンサーが白を感知したとき、前進。
}
}


4饋回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む(てらすぃー)

#define straight OnFwd(OUT_A+OUT_C);					//前進
#define back OnRev(OUT_A+OUT_C);					//後進
#define turn_left OnRev(OUT_A);OnFwd(OUT_C); 				//左折
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);				//右折
#define stay Off(OUT_A+OUT_C);						//止まる
#define THRESHOLD 40							//閾値
#define armdown OnRev(OUT_B);Wait(100);Off(OUT_B);			//アーム下降
#define armup OnFwd(OUT_B);Wait(100);Off(OUT_B);			//アーム上昇
#define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(180);			//180°旋回

int cross_count=0;							//交差点の数を数える変数
int can_count=0;							//缶の数を数える変数

sub can()								//缶と遭遇
{
	if(can_count == 1,3,5,7,9){					//奇数回目のとき
		turn;							//反転
		stay;
	} else {							//遇数回目のとき
		armdown;						//押しのける
		straight; Wait(400);
		armup;
		back; Wait(400);
		stay;
	}
}
 
task main()								//メインタスク
{
SetSensor(SENSOR_1,SENSOR_LIGHT);  					//センサー1を光センサー
SetSensor(SENSOR_2,SENSOR_TOUCH);					//センサー2をタッチセンサー
SetSensor(SENSOR_3,SENSOR_LIGHT);					//センサー3を光センサー

	while(true){
		start linetrace;					//はじめ
		until(SENSOR_2 == 1 || cross_count > 10);		//センサーが反応したり、11番目の交差点まで
		stop linetrace;
		if(SENSOR_2 == 1){
			can();
		} else {
		 	break;
		}
	}
stay;
}

task linetrace()							//ライントレースタスク
{	  
	while (true) {
		if ((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) { //直進
			straight;
		} else if ((SENSOR_1 >= THRESHOLD) && (SENSOR_3 <= THRESHOLD)) { //右
			turn_right;
		} else if ((SENSOR_1 <= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) { //左
			turn_left;
		} else {						//交差点
			stay; Wait(100);
			straight; Wait(100);  				
			cross_count++;					//数を数える
		}
		Wait(2);
	}
}

感想

K.H

前回の似顔絵ロボットよりさらに難易度が上がり、今回のライントレースロボットはNQC入門に載っていることのほぼすべてを使わなければまともに動かないのでかなり大変でした。また、メンバーで集まる時間を作れずなかなか最終調整が行えなかったことも厳しかったと思いました。次回があれば個々のプログラムは授業外の時間に早めに完成させ授業時間は全員での最終調整に回せたらいいなと思いました。

D.Y

各行動ごとのプログラムは比較的よくできたが、それをつなぐのが難しい。プログラムの移行についてもう少し考える必要がある。

てらすぃー

前回よりはるかに難度が上がって、nqc入門のページを何度も読み直しても上手くいかず、結局班員には多大な迷惑をかけました。 次回までに勉強してきます。 また、今回はあまり皆であつまれなかったので、次回もっと皆で集まれれば効率が上がるだろうと思いました。

コメント

  • 工夫した点が簡潔に述べられていて良いと思います。問題点と改善策もあげてみてください -- TAKA? 2010-07-02 (金) 17:04:50
  • プログラムの説明もきちんと書きましょう。例えば、コメント文で『nの値を定義』のような説明ではなく n が何のための変数なのか、わかりやすく説明しましょう。nを定義していることは見れば明らかです。 -- 松本 2010-07-09 (金) 14:15:48
  • 最終的にここに載せたプログラムでちゃんと動くかどうか確認してみてください。 -- 松本 2010-07-09 (金) 14:17:47
  • ロボットの説明や工夫はわかりやすかったので良かったです。プログラムの方は、文法事項をもう一度確認したうえで、3人とも改良してみてください。大きく分けて、(1)taskやsubの使い分け、whileが適切でないため、缶に一度ぶつかるとの動作が行われなくなったり、(2)同じロボットを使っているはずなのに、例えば右が黒のとき、人によって左折したり右折したり、(3)細かいミス(タッチセンサをセンサ2にしたのにセンサ1になっていたり、マクロは一行で書いていない)の3つの問題点が挙げられます。 -- FI? 2010-07-12 (月) 08:48:02
  • 右や左が違うのはもしかすると、各機能部分ごとに分解可能な構造なので、コードのつなぎ方が人によって違っていたのかもしれません。 -- K.H? 2010-07-16 (金) 16:14:47
  • 書くべきことは書いていると思うので、あとはプログラムを改良してください。主な疑問点は、以下の通りです。一人目は一回缶を処理したあとにもう一回缶を処理できないのではないかという点、taskを止める方法を用いているのでset priorityはいるのかという点です。2人目に関しては、task mainの9行目でcan_carryというtaskに移行しているので、制御はうまくいっているでしょうか?3人目に関しては、やりたいことはなんとなくわかったのですが、もう少し整理できるかもしれません。例えば、最初にwhile(true)としていますが、while(turn_count<10)としてその中に、ライントレースと缶の処理のパーツを組み込めばよいのではないでしょうか。また、缶の処理もまずif(SENSOR_2==1)として、さらにその中でnの奇偶でわけた方がすっきりすると思います -- FI? 2010-07-29 (木) 09:43:13


添付ファイル: fileCA3A0015.JPG 218件 [詳細] fileCA3A0014.JPG 186件 [詳細] fileCA3A0013.JPG 196件 [詳細] fileCA3A0012.JPG 210件 [詳細] fileCA3A0011X.jpg 216件 [詳細] fileCA3A0010X.jpg 206件 [詳細] fileCA3A0011.JPG 124件 [詳細] fileCA3A0010.JPG 121件 [詳細] fileCA3A0009.JPG 204件 [詳細] fileCA3A0008.JPG 204件 [詳細] fileCA3A0007.JPG 206件 [詳細]

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