#author("2019-12-28T17:23:38+09:00","yamaji","yamaji")
目次
#contents
*課題2[#w03aca39]
[[2019b/Mission2]]を参照

私は課題2の1人目のコースを行った。
*ロボットの説明 [#x10c8e95]
**ロボットの全体像 [#v09c0663]
 まず全体像を下に示す。

&ref(2019b/Member/yamaji/Mission2/全体像1.jpg,60%,全体像);
&ref(2019b/Member/yamaji/Mission2/センサ1.jpg,60%,センサ);

 NXT本体とセンサをなるべく低い位置につけ、とにかく重心を低くし、安定性を上げた。しかし、センサを低く設置したことで、ロボットの前にスペースがなくなり、ボールを回収する機構は後ろに付けることになった。超音波センサはボールにうまく反応しなかったため、設置場所に悩んだが、ボールの高さに合わせるのが一番反応しやすいと考えたため、ボールの高さで床と水平になるように設置することにした。
**ボールを回収する機構 [#e67a7e82]
#ref(2019b/Member/yamaji/Mission2/持ち手1.jpg,70%,アーム)
 ボールの回収は、上の写真のようにアームを作り、モータによるアームの上げ下げでボールを囲い、そのまま引っ張っていく行くことにした。
*プログラムの説明 [#i318ebb8]
**定義 [#a29f6d82]
 #define spd 30  //スピード
 #define go_right() OnFwd(OUT_A,spd);
 #define turn_right() OnFwdSync(OUT_AC,spd,-100);
 #define go_left() OnFwd(OUT_C,spd);
 #define turn_left() OnFwdSync(OUT_AC,spd,100);
 #define go() OnFwdSync(OUT_AC,spd,0);
 #define up OnFwd(OUT_B, -30);Wait(500) //ボールキャッチャー上げる
 #define down OnFwd(OUT_B, 30);Wait(700) //ボールキャッチャー下げる
 const float diameter = 5.45;  //タイヤの直径
 const float track = 11.05;    //タイヤ間の幅
 const float pi = 3.1415;      //円周率
 この定義は主に、後に順次説明する関数の中で使う。
**指定した距離・角度動くプログラム [#f0bb5b20]
 void fwd(float d)  //距離dcm前進する関数
 {
     long angle;
     angle = d/(diameter*pi)*360.0;
     RotateMotorEx(OUT_AC,spd,angle,0,true,true);
 }
 void turnAng(long ang)  //ang度(指定した角度)旋回する関数
 {
     long angle;
     angle = (track/diameter)*ang;
     RotateMotorEx(OUT_AC,spd,angle,100*sign(ang),true,true);
 }
 下から2行目のRotateMotorExの中に「sign(ang)」とあるが、これを付けることでマイナスの角度を指定すると逆回りに旋回するようになる。
**ボールを指定した角度の範囲で探し、その距離を返すプログラム [#f6693352]
 float search_ball(long ang)  //現在の方向を中心にang度の範囲で探し障害物までの距離を返す
 {
     SetSensorLowspeed(S2);
 
     long tacho_min;
     float d_min;
 
     d_min = 100000;  //仮の最小値
 
     turnAng(ang/2);              //指定された角度の半分だけ旋回
     ResetTachoCount(OUT_AC);     //角度計測をリセット
 
     int kakudo;
     float Sens;
     Wait(900);
     kakudo = 0;
     while(kakudo <= ang){    //ang/20度ずつ旋回し、ボールまでの距離を測る
         turnAng(-ang/20);
         Wait(900);
         Sens = SensorUS(S2);
         if(Sens < d_min){
            d_min = Sens;   //仮の最小値を更新
            tacho_min = MotorTachoCount(OUT_A);
          }
         kakudo = kakudo + ang/20;
     }
     Wait(1000);
     turnAng( - (MotorTachoCount(OUT_A) - tacho_min + 50));//ボールの向きを向く *50は補正値
     Off(OUT_AC);
     Wait(100);
     return d_min;
 }
 tacho_minはモータの回転角で、d_minは指定された角度の範囲中で最短距離にある障害物までの距離を表す。初めは連続でやった
*反省・感想 [#jc56cccd]
 ボールを回収する機構をロボットの後ろに付けたことで、ボールを回収するために旋回する時、ボールにロボットが当たらないように気をつけないといけなかったり、旋回した後にアームがボールを回収できる範囲にいなければならなかったりなど、ボールを回収する際に考慮するべきことが多くなってしまった。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS