半径1m以内にある空き缶を探し、25cmの距離からボールを空き缶に当てるロボットを作成せよ。
ただし最初に空き缶が25cm以内の距離にある場合は、30cmまで離れてボールを当てよ。
これが今回私たちのチームが制作したロボットである。
アームでボールを囲み、空き缶の前まで運ぶ。
本体の下部にあり、ボールが外に出ないようにする役割をもつ。
本体の上部にある。
ボールを囲み、空き缶の手前まで運ぶためのもの。
空き缶にボールを当てるときに開く。
まず超音波センサーで周囲360°をサーチし、最短距離にあるものの場所を記録しておく。
サーチ終了後最短距離にあるものの方向を向き、距離に応じて移動する。
最後にシュートして終了する。
プログラムは以下の通りである。
今回は配布資料と課題2を参考に、少し手を加えた。
#define speed 50 #define speed_slow 30 #define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(300);//アーム2を下げる #define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300); //アーム2を上げる #define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500);\ up;OnFwd(OUT_BC,80);Wait(300);Off(OUT_BC); //ボールを発射する
const float diameter = 5.45;//タイヤの直径 const float track = 12.35; //タイヤ間の距離 const float pi = 3.1415;//π void fwdDist(float d){//引数dの分だけ前進 long angle; angle = d/(diameter*pi)*360.0;//d進むために必要な数angleを計算 RotateMotorEx(OUT_BC,speed_slow,angle,0,true,true);//左右のタイヤを同期させてより正確に前進 } int searchDirection(long ang) [//最も近い物体を探す long angle,tacho_min=0; int d_min; d_min=300;//仮の最小値を設定 angle = (track/diameter)*ang; //引数からモーターの回転角度を計算 ResetTachoCount(OUT_BC); //角度のカウントをリセット while(MotorTachoCount(OUT_B)<=angle){//angの範囲内での最小値の探索 RotateMotorEx(OUT_BC,speed_slow,1,-100,true,true);//1°左旋回 if(SensorUS(S1)<d_min){//それまでの最小値より近いなら d_min=SensorUS(S1);//最小値を更新 tacho_min=MotorTachoCount(OUT_B);//最小値を記録した位置を記憶しておく } } RotateMotorEx(OUT_BC,speed_slow,angle-tacho_min,100,true,true);//最も近い物体の方を向く return d_min;//最小値を返す }
task main(){ SetSensorLowspeed(S1);//超音波センサ int d=searchDirection(360); if(d>25){//物体が25cmより離れた距離にある場合 fwdDist(d-25.0);//25cm手前まで移動; } if(d<=25){//物体が25cm以内の距離にある場合 fwdDist(d-30.0);//30cm手前まで移動; } goal; }
無事に空き缶にボールを当てることができた。
配布資料に書いていないものが使われていたため、サンプルプログラムの理解に苦労した。
今回はサンプルプログラムが配布されたため、プログラミングにはそこまで苦労はなかった。
またロボットについても課題2のものを流用しているため、特に苦労はなかった。
ロボットの重心がかなり前にあるのだが、時間に追われて改善できなかった。
プログラミングについては、サンプルプログラムをベースにしているためほとんど個性が出せなかった。