2015a/Member

課題

半径1m以内にある空き缶を探し出し、25cmの距離からボールを転がしてその空き缶に当てる。もし、25cm以内に空き缶がある場合には、30cmまで離れる。

ロボット

全体

全体はこうなっている。

image2 (2).JPG
image1 (3).JPG

構造

ボールはアームを上下させてつかむ。

image4.JPG
image3 (2).JPG

空き缶にボールを当てるときはアームを上に上げた状態から、全体を前進させてボールを転がす。

プログラム

プログラムの説明

空き缶に対してロボットの角度を計測することで空き缶を探し出した。

プログラム

#define speed1 45
#define speed2 30
#define shoot OnRev(OUT_BC,40);Wait(1000);OnRev(OUT_A,30);Wait(500);Off(OUT_A);OnFwd(OUT_BC,80);Wait(300) //ボールを転がす定義
const float diameter =5.45; //タイヤの直径
const float track= 10.35;  //タイヤの幅
const float pi =3.1415;  //円周率
void fwdDist(float d) //d 兪或
{
long angle;
angle = d/(diameter*pi)*360.0; //角度を計算
RotateMotorEx(OUT_BC,speed2,angle,0,true,true); //モーターを45%のスピードで同期させangle度まで回転
}
void turnAng(long ang) //角度ang度時計回りに旋回
{
long angle;
angle=track/diameter*ang;  
RotateMotorEx(OUT_BC,speed2,angle,100,true,true);
}
int searchDirection(long ang) //今の方向を中心にang度の範囲で探し、缶までの距離を返す。
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; 仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの回転を計算
turnAng(ang/2); //指定した角度の半分を旋回
ResetTachoCount(OUT_BC); //角度計測をリセット
OnFwdSync(OUT_BC,speed2,-100); //30%のスピードで反時計回りに旋回
while(MotorTachoCount(OUT_B)<=angle) 
{
if(SensorUS(S1)<d_min){
d_min=SensorUS(S1);
tacho_min=MotorTachoCount(OUT_B); //最小値を更新
} 
}
OnFwdSyncEx(OUT_BC,speed2,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d_min); //缶のところまで旋回
Wait(14);
Off(OUT_BC);Wait(500);
return d_min;
}
task main() //缶を探し出して25僂把篁漾▲棔璽襪鯏召す
{
SetSensorLowspeed(S1);
int d =searchDirection(500);
if (d>25.0){
fwdDist(d-25.0);
shoot;
}
}

感想

感想

サンプルプログラムを参考にして角度使った。理解するのが難しかったが、とても面白かった。今まで使ってなかった角度使ってロボットを動かすことが新鮮で面白かった。これを使えば課題1、2のプログラムをもっとより良いものにできると思った。


添付ファイル: fileimage3 (2).JPG 122件 [詳細] fileimage4.JPG 101件 [詳細] fileimage2 (2).JPG 109件 [詳細] fileimage1 (3).JPG 101件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-07-30 (木) 23:35:37