0

コンパスの方向で車両を誘導するアプリケーションがあり、車両が 360 度から 0 度に交差するときに問題が発生しています。

この場合、制御ループには、進行方向に沿って曲がる最も近い方法を計算するためのスマートはありません。

たとえば、車両が 360 度の方向に従うように指示されている場合、車両は必然的に数度、エーテル側にドリフトします。0 度以上にドリフトすると、制御ループが異常になり、再び 360 度になるように車両を完全に操縦しようとします。

これに対処する優雅な方法はありますか?

ナビゲート関数の記述方法では、外部 PID コントローラー クラスを使用し、次のように見出しを計算します。

            lock (steering)
        {
            if (!Engaged)
            {
                return;
            }

            double mv = 90 + Trim + pidController.CalculateCorrection(flyHeading, currentHeading);

            steering.Degree = mv;
        }

ありがとう!

4

3 に答える 3

2

これは非常に単純に聞こえるかもしれませんが、ターゲットベクトルと現在のベクトルの間のデルタを使用して、常に0からの距離を測定し、方位表示が-180と180でラップするようにすることはできませんか?

方位をどのように計算しているかはわかりませんが、Ardupilotをざっと見てみると、方位の計算は次のようになっています。

int calc_bearing(float flat1, float flon1, float flat2, float flon2)
{
  float calc;
  float calc2;
  float bear_calc;
  float diflon;
  //I've to spplit all the calculation in several steps. If i try it to do it in a single line the arduino will explode.
  flat1=radians(flat1);
  flat2=radians(flat2);

  diflon=radians((flon2)-(flon1));

  calc=sin(diflon)*cos(flat2);
  calc2=cos(flat1)*sin(flat2)-sin(flat1)*cos(flat2)*cos(diflon);

  calc=atan2(calc,calc2);

  bear_calc= degrees(calc);

  if(bear_calc<=1){
    bear_calc=360+bear_calc;
  }
  return bear_calc;
}

クランプによるヘッディングエラーの修正:

int heading_error(int PID_set_Point, int PID_current_Point)
{
 float PID_error = PID_set_Point - PID_current_Point;

 if (PID_error > 180) {
   PID_error -= 360;
 }

 if (PID_error < -180) {
   PID_error += 360;
 }

 return PID_error;
}
于 2011-02-07T23:40:58.460 に答える
2

メソッドを変更できない場合はCalculateCorrection、呼び出しの前にこれらの行を追加して、デルタが適切な範囲内にあることを確認してください。

if (flyHeading - currentHeading > 180) currentHeading+=360;
else if (flyHeading - currentHeading< -180) currentHeading-=360;

を修正できる場合はCalculateCorrection、@Greg Buehler の例のようにクランプをそこに置きます。

于 2011-02-08T00:39:07.827 に答える
0

ハックとして、720°のヘディングで送信してみましたか?

それ以外の場合は、さらに意味をなすために、呼び出しているプロパティとメソッドの詳細を確認する必要があります。

于 2011-02-07T23:24:50.363 に答える