課題1で用いたコースを図のようにつなげ6個の箱を移し替えるというものです。
今回も様々な行動を求められていたのでswitch-case文というものを用いました。行動をパターン分岐させやや複雑な動きもできるようになりました。ロボットの調子が少し悪く前進がスムーズにいかなかったので前進のプログラムがやや変わっています。箱の発見は超音波センサーで行うようになっています。
#define SPD 40 #define SPD_H 30 //進むスピード #define SPD_Ah -15 //アームの閉じる速度 #define SPD_Ar 15 //アームの開く速度 #define TIM_W 800 //動作準備のための待機時間 #define trasew1 OnFwdReg(OUT_BC,40,OUT_REGMODE_SYNC);Wait(1); //トレース1という行動 #define trasew2 OnFwd(OUT_C,40);Off(OUT_B);Wait(1); //トレース2という行動 task main () { SetSensorLight(S1); //ライトセンサー定義 SetSensorLowspeed(S2); //超音波センサー定義 SetSensorTouch(S3); //タッチセンサー定義 int pattern = 1; //パターン設置 long t0 = CurrentTick(); //タイマーの設置 int t1 = 0; //カウンターの設置 int count = 0; //カウンターの設置 while(true) { switch(pattern) //"pattern"の開始 { case 1: //箱に至るまでの直進 if(SensorUS(S2) > 8) //超音波センサーでの判断 { if(t1 <= 300) { t1++; //カウンターを増やす OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(1); } else { t1 = 0; trasew2; } break; } pattern = 2; //パターン2へ移行 break; case 2: //箱をつかむ if(count == 1); { OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(550); } Off(OUT_BC); Wait(TIM_W); if(count == 0) { OnFwd(OUT_A,-20); //箱をつかむ Wait(TIM_W); pattern = 5; //パターン5へ移行 break; } OnFwd(OUT_A,-50); //移動中箱を固定する Wait(TIM_W); pattern = 5; break; case 5: //箱をつかんだ状態で目的地の壁へ移動 if(count == 0) { OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退 Wait(3600); OnFwd(OUT_B,30); OnFwd(OUT_C,-30); //旋回 Wait(1600); Off(OUT_BC); Wait(TIM_W); pattern = 3; break; } OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退 Wait(4200); OnFwd(OUT_B,30); OnFwd(OUT_C,-30); //旋回 Wait(1560); Off(OUT_BC); Wait(TIM_W); t0 = CurrentTick(); pattern = 3; break; case 3: //タッチセンサーが接触するまで前進してそこからまた箱に向き直す if(SENSOR_3 == 0) { if(t1 <= 10000000) { t1++; カウンターを増やす OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(1); } else { t1 = 0; trasew2; //トレース2を行う } break; } Off(OUT_BC); OnFwd(OUT_A,30); //箱を離す Wait(TIM_W); Off(OUT_A); if(count == 0) { OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退 Wait(3000); OnFwd(OUT_B,-30); OnFwd(OUT_C,30); //旋回 Wait(1200); count ++ ; //カウンターを増やす Off(OUT_BC); pattern = 1; //パターン1へ移行 break; } OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退 Wait(1550); OnFwd(OUT_B,-30); OnFwd(OUT_C,30); //旋回 Wait(1100); Off(OUT_BC); pattern = 4; //パターン4へ移行 break; case 4: //ゴールに箱を入れる if(SensorUS(S2) > 8) //超音波センサーでの判断 { if(t1 <= 90) { t1++; //カウンターを増やす OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(1); } else { t1 = 0; trasew2; } break; } Wait(TIM_W); OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(TIM_W); Off(OUT_BC); OnFwd(OUT_A,-30); //箱をつかむ Wait(TIM_W); OnFwd(OUT_B,-30); OnFwd(OUT_C,30); //向きの調整 Wait(800); OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進 Wait(880); Off(OUT_BC); Wait(30000); break; } } }
結果として箱はうまく運べませんでした。2台のロボットの連携もうまくできなかったです。原因はプログラムをじっくり考える時間がなく完璧に仕上げられなかったこと、電池の残量に影響されてしまうこと、センサーも使っていたが時間制御も使っていたことだと思います。また機械の調子もすこし悪かったような気がします。基本中の基本である前進ができなくどうしても曲がってしまいました。ブルートゥースでの通信も間に合わなく連携ができませんでした。
ロボコンはとても難しかったです。箱をいかにして壁の向こう側に置くか、そしてそれをいかにしてゴールに置くか。動作を重ねても誤差のなるべく出ないプログラムとは何なのか。またその誤差を修正するにはどうすればよいか、など問題点が山積みでした。解決のためにもっと柔軟な発想が求められている気がします。また、このロボティクス入門ゼミという講義を通してロボットを制御することの難しさを痛感しました。ロボットの挙動は自分の意思とは異なるものばかりでした。それでも思い通りに動いたときの感動がすごかったです。とても限られた時間でしたがこの経験を将来役立てていこうと思いました。