[[2013a/Member]] *空き缶運びレース[#ha7f4abf] *ロボットの紹介 [#q20e8f2b] 僕達が作ったロボットはシンプルに仕上げました。 ロボットはセンサーが機体に近くするためよりコンパクトに設計し余計なものをはぶき、缶を運ぶのも掴まない機構なのでプログラムもコンパクトになりました。缶を運ぶ機構は、左右から棒が伸びておりその間に缶が入るように空間を作り、動いている間に倒れないように横を棒で支える形となっています。 #ref(2013a/Member/BK201/Mission1/IMG_0685.JPG,20%,ろぼっと写真) *コースの攻略法 [#k9096768] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission1&openfile=robotics-2013a-mission1.jpg +最初に右に曲がること +交差点を上手くわたる +缶を指定の位置に置く +最後は右に曲がって終了 *プログラムの説明 [#ub6b4419] プラグラムの定義に関して #define BLACK 31 //黒線の明るさ #define WHITE 62 //白紙の明るさ #define SPEED_H 30 //タイヤの出力 #define SPEED_L 25 #define OnRL(speedR,speedL)\ //かっこの中に上記の定義を適した形で入れることにより様々な動きが可能になる OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go OnRL(SPEED_H,SPEED_H); //前に進む #define left1 OnRL(SPEED_L,-SPEED_L); //ロボットの中心を軸に左旋回 以降左1 #define left0 OnRL(SPEED_L,0); //左タイヤを軸に左旋回 以降左0 #define right0 OnRL(0,SPEED_L); //右タイヤを軸に右旋回 以降右0 #define right1 OnRL(-SPEED_L,SPEED_L); //ロボットの中心を軸に右旋回 以降右1 #define STEP 10 //動作時間0.01秒 #define nMAX 15 //nの回数最高15回 #define short_break Off(OUT_BC);Wait(500); //休憩時間0.5秒 #define CROSS_TIME 350 //交差点を渡る時間0.35秒 #define cross_line OnRL(SPEED_L,SPEED_L);\ //交差点を渡る Wait(CROSS_TIME);short_break; task main() { SetSensorLight(S1); //センサーライト int nOnline=0; // nOnlineの初期値 int n=0; // nの初期値 int m=0; // mの初期値 long t0=CurrentTick(); // ここでt0での時間の測定が始まる 最初に右に曲がる while(CurrentTick()-t0<=5000){ //時間制限5秒以内で下記のことをする if (SENSOR_1<37) 明るさ37未満なら右1 { right1;} 明るさ37以上42未満なら右0 else { if (SENSOR_1<42) 明るさ42以上50未満なら進む { right0; } それ以外なら左1 else if (SENSOR_1<50) { go;} else { left1;} } } 交差点を4回渡るまでライントレース while(true){ //カッコ内を繰り返す 《缶を置くまで〜》の所最後のカッコまで繰り返す while(m<4){ // mが4カウントされたらカッコ内の行動終了 while(nOnline<nMAX){ // nOnlineのカウントが連続で nMAX(15)より小さいとき以下のことをする if (SENSOR_1<37) 明るさが37未満なら右1そして nOnlineが1カウント { right1; nOnline++;} 明るさが37以上42未満なら右0 else { if (SENSOR_1<42) 明るさが42以上50未満なら進む { right0; } 明るさが50以上56未満なら左0 else if (SENSOR_1<50) そのほかは左1 それぞれ時間はSTEPの0.01秒 { go;} 以上の行動を行った後 nOnlineのカウントを0にする else if (SENSOR_1<56) { left0; } else nOnlineのカウントが連続で nMAX(15)以上のとき【つまり交差点】は左1をし、交差点を渡る。 { left1;} そしてmが1カウントされる。この左1は軌道修正のためである nOnline=0;} Wait(STEP); }left1;cross_line;m++; } 缶を置く時間の変数の定義 long t1=CurrentTick(); //ここでt1での時間の測定が始まる 缶を置く場所までのライントレース while(CurrentTick()-t1<=12800){ //時間制限12.8秒以内で下記のことをする。 if (SENSOR_1<37) 明るさが37未満なら右1 { right1; } 明るさが37以上42未満なら右0 else { if (SENSOR_1<42) 明るさが42以上50未満なら進む { right0; } 明るさが50以上56未満なら左0 else if (SENSOR_1<50) それら以外は左1 { go;} else if (SENSOR_1<56) { left0; } else { left1; } } } 缶をその場所に置く Off(OUT_BC); //時間制限を過ぎると半回転してバックの勢いで缶をはなし、また半回転する OnFwd(OUT_B,20);OnRev(OUT_C,20);Wait(2600); OnRev(OUT_BC,35);Wait(1000); OnFwd(OUT_B,20);OnRev(OUT_C,20);Wait(2600); ラインどうりに進みゴールに向かう while(true){ //カッコ内で繰り返す 最後から2番目のかっこ if (SENSOR_1<35) //明るさが35未満で右1 { right1; } 明るさが35以上42未満で右0 else { if (SENSOR_1<42) 明るさが42以上50未満で進む { right0; } 明るさが50以上56未満で左0 else if (SENSOR_1<50) それ以外は左1 { go;} else if (SENSOR_1<56) { left0; } else { left1;} Wait(STEP); } } } } *まとめ [#bc730b07] 今回の課題は缶を指定の場所に持っていくことでしたが、私たちが作ったロボットは掴んだりはせず、どちらかと言うと倒れないようはさんでもっていく形でした。そのため、プログラムは簡単に作れると思いきや最初に右に曲がらせたりうまく缶を置かせるためにどうすれば良いのかと大変悩まされました。パートナーにアドバイスをもらいながら何とか形にできたものの時間指定などにも手こずりました。一応は掴む機構も作ったもののつけると重くなってしまい動かなくなって取り付けるのを断念した。次回はより良いロボットを作っていきたいです。