Регулиране за обвиване на компаса в навигационно приложение

Имам приложение, в което насочвам превозно средство по посока на компаса и имам проблем, когато превозното средство преминава от 360 градуса на 0 градуса.

В този случай няма интелигентност в контролната верига, която да изчисли най-близкия начин да завиете, за да следвате посока.

Например, ако превозното средство е инструктирано да следва посока от 360 градуса, то неизбежно ще се отклони с няколко градуса към етерната страна. Ако се отклони до 0+ градуса, контролната верига ще се побърка и ще се опита да насочи превозното средство докрай, за да го върне отново на 360 градуса.

Има ли грациозен начин да се справите с това?

Начинът, по който е написана функцията за навигация, използвам външен клас PID контролер и изчислявам заглавието по следния начин:

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

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

            steering.Degree = mv;
        }

Благодаря!


person chris12892    schedule 07.02.2011    source източник


Отговори (3)


Ако приемем, че не можете да промените метода CalculateCorrection, добавете тези редове преди извикването, за да сте сигурни, че делтата е в разумен диапазон.

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

Ако можете да поправите CalculateCorrection, поставете скобата там, както в примера на @Greg Buehler.

person AShelly    schedule 08.02.2011
comment
Предполагам, че всъщност искате да коригирате currentHeading, а не flyHeading там (ако приемем, че flyHeading е това, което искате да проследите); в противен случай ще объркате интегралната част на PID контролера, като прелиствате между 360-градусови цели. - person Brooks Moses; 09.02.2011
comment
@Brooks Moses, добра гледна точка, коригирана. (Направих лошо предположение за това кое е желано спрямо измерено) - person AShelly; 09.02.2011
comment
Освен това flyHeading е заглавието, което искам да проследя. currentHeading е този, на който съм в момента (известен още като: четене на живо от компаса). Съжалявам за объркващата схема за именуване... - person chris12892; 10.02.2011

Това може да звучи прекалено просто, но не можете ли просто да използвате делтата между целевия вектор и текущия вектор, така че винаги да измервате разстоянието от 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;
}
person Greg Buehler    schedule 07.02.2011
comment
Да, моето изчисление на пеленга е доста близко до това, което изброихте, но получавам обратно градуси 0-360. Винаги бих могъл да променя нещо и да го конвертирам надолу от -180 до 180. - person chris12892; 10.02.2011

Като хак, опитахте ли да го изпратите на курс от 720°?

В противен случай ще трябва да видя повече подробности за свойствата и методите, които извиквате, за да има някакъв по-нататъшен смисъл.

person Paul Ruane    schedule 07.02.2011