リタイアしました(泣)
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 コースの詳細については授業中説明する(下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。
1.スタート地点から出発し、黒い線にそって動く。
2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。
3.さらに黒線に沿って動いてゴール地点を目指す。
4.ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。また二人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。
さらに以下のような動作に挑戦することが望ましい。 •ゴールエリア外からピンポン玉をシュートする。 •曲線部中央の障害物に接触しないようにすること。
全体図です。 画面中央のモーターの回転が輪ゴムを通じてチューブ状のパーツを動かす。
正面図。左右の黒いブロックのおかげで、ボールを掴んだあとの移動中のボールのズレを軽減した。
ボールをキャッチするシステムのアップ図。 ボールをつかむ仕組みは、チューブ状のパーツをボールに被せるといった形である。
今回の課題では次のようなことが主な関門となってくると思われた。
1.ライントレースをしゴールまでたどり着く。
2.交差点を見分ける。
3.ピンポン玉をキャッチする。
4.シュート!
…どーしよ
まずは1について。これは前回の課題もラインとレースだったので、割と簡単にクリアすることができた。強いて言うなら、せいぜいしきい値を変えたり光センサーの高さ、位置を変えたりしたことぐらいである。
次は2について。これも前回の課題にあったので1と同じような感じで対処できた。
問題は3。これに一番苦労した。ボールをキャッチするためには、車体を動かすモーター以外にもう一つモーターを使わなければならず、車体が重量化してしまった。ちなみに今回作ったロボットはキャッチするというよりは自分の方にボールを持ってくるようになっている。この形が一番シンプルで安定した。 仕組みは、ボールがある位置(3つ目の交差点)に来るとモーターが作動し、チューブが降りて車体とチューブの間にボールを挟むといった感じだ。だいぶ簡略化したが、大体の仕組みはこんな感じである。
最後に4。過去の映像を見ると、チューブを上げる⇒車体バック⇒勢いよく前進⇒ゴール!!といった感じだったが、今回は、チューブを上げる……だけ!(笑)いちいちバックしなくても、チューブを上げるだけでボールの慣性で進んでくれたのでチューブを挙げるだけで十分だった。
#define set_power_AL SetPower(OUT_A,2);//右の車輪の力(弱) #define set_power_CL SetPower(OUT_C,2);//左の車輪の力(弱) #define set_power_AH SetPower(OUT_A,4);//右の車輪の力(強) #define set_power_CH SetPower(OUT_C,4);//左の車輪の力(強) #define go_forward set_power_AH;set_power_CH;OnFwd(OUT_AC);//前進(強) #define turn_right0 set_power_AL;set_power_CL;OnFwd(OUT_A);OnRev(OUT_C);//右へ急カーブ #define turn_right1 set_power_AL;OnFwd(OUT_A);Off(OUT_C);//右へカーブ #define turn_left0 set_power_CL;Off(OUT_A);OnFwd(OUT_C);//左へカーブ #define turn_left1 set_power_CL;OnFwd(OUT_C);OnRev(OUT_A);//左へ急カーブ #define nMax 7//ライントレースから他の動作に切り替える条件となる値 #define short_break Off(OUT_AC);Wait(10);//0.1秒運動停止 #define CROSS_TIME 15//交差点通過にかかる時間 #define cross_line set_power_AL;set_power_CL;OnFwd(OUT_AC);Wait(CROSS_TIME);short_brake;//交差点時の動作 #define STEP 1//一動作にかかる時間 #define THRESHOLD 45//しきい値
task main{} { SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサーを定義 int nOnline=0;//交差点判別に使用するカウンタ int kousa=0;//交差点判別に使用するカウンタ(2つ目)
↓一度交差点に差し掛かるまでライントレースし、さしかかったらボールをキャッチするプログラム
while(kousa < 1){//一つ目の交差点に差し掛かるまで、以下の動作をする while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-13){//定義した明るさの値より13低かったら turn_left1;左に急カーブ nOnline++;//カウントする }else{ if(SENSOR_2<TFRESHOLD-10){
//定義した明るさの値より10低かったら
turn_left0; //左にカーブ }else if(SENSOR_2<THRESHOLD-6){
//定義した明るさの値より6低かったら
go_forward; //前進する }else if(SENSOR_2<THRESHOLD){
//定義した明るさの値より低かったら
turn_right0; //右に急カーブ }else{
//その他なら
turn_right1; //右にカーブ } nOnline=0;//ライントレース } Wait(STEP); //STEP間待つ } short_break; //小休憩 turn_right0;Wait(50*STEP);50だけ右に急カーブ if(SENSOR_2<33){//光のしきい値が33より小さかったら PlaySound(SOUND_UP);//音を鳴らす turn_left0;Wait(30*STEP);//30だけ左にカーブ cross_line;//交差点をこえる OnFwd(OUT_B);Wait(50);Off(OUT_B);//ボールをつかむ kousa++;//交差点のカウント }else{ turn_left0;Wait(85*STEP);//85だけ左に急カーブ } nOnline=0;カウント数を0に }//交差点を見分ける
↓ライントレースし、4つ目の交差点(ゴール)でシュートするプログラム
while(kousa < 4){//4つ目の交差点に到達するまで以下のプログラムを行う while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-13){ turn_left1; nOnline++; }else{ if(SENSOR_2<THRESHOLD-10){ turn_left0; }else if(SENSOR_2<THRESHOLD-6){ go_forward; }else if(SENSOR_2<THRESHOLD){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right0;Wait(50*STEP); if(SENSOR_2<33){ PlaySound(SOUND_UP); turn_left0;Wait(30*STEP); cross_line; kousa++;//交差点のカウント }else{ turn_left0;Wait(85*STEP); } nOnline=0;//ここまでは一回目の交差点に差し掛かるまでのと同じプログラム }//交差点を見分ける OnRev(OUT_B);Wait(50);Off(OUT_B);//シュート!! }//停止。お前はよく頑張った!ゆっくり休みなさい(笑)
今回では、しきい値の調整が難しかったため後輪をつけない形になってしまったため後ろの方のパーツに負荷がかかってしまった。また、しきい値の調整が甘かったのか全然違うところで勝手に交差点だと判断してしまったりした。そのため、何度かトライしないとうまくいかないという結果になってしまった。