2011-02-07 32 views
0

我有一個應用程序,我正在指導一個車輛指南針標題,當車輛從360度過渡到0度時出現問題。調整指南針環繞在導航應用程序中

在這種情況下,控制環中沒有智能來計算最接近的方式來跟隨標題。

例如,如果指示車輛遵循360度的航向,它將不可避免地向乙醚側漂移幾度。如果它漂移到0度以上,控制迴路將會發生變化,並試圖將車輛轉向至360度。

有沒有一種優雅的方式來處理這個問題?

的導航功能的書寫方式,我使用外部PID控制器類和我計算這樣的標題:

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

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

      steering.Degree = mv; 
     } 

謝謝!

回答

2

假設您不能更改CalculateCorrection方法,請在調用之前添加這些行以確保增量處於合理範圍內。

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

如果你能解決CalculateCorrection,把夾在那裏,就像在@格雷格Buehler的例子。

+1

我的猜測是,您實際上想要調整currentHeading而不是flyHeading(假設flyHeading是您想要跟蹤的)。否則,您將通過在360度分開的目標之間翻轉來混淆PID控制器的組成部分。 – 2011-02-08 21:14:13

0

作爲一個黑客,你有沒有試過在720°標題上發送它?

否則,我不得不看更多的屬性和方法的細節,你打電話進一步的意義。

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; 
} 
+0

是的,我的方位計算與您列出的計算方法非常接近,但是我獲得了0-360度的迴歸。我總是可以將事情切換起來,並將其轉換爲-180至180. – chris12892 2011-02-10 14:38:39