Регулировка компаса в навигационном приложении - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть приложение, в котором я направляю транспортное средство по компасу, и у меня возникает проблема, когда транспортное средство пересекает угол от 360 градусов до 0 градусов.

В этом случае в контуре управления отсутствуют смарты для вычисления ближайшего поворота, следующего за курсом.

Например, если транспортное средство проинструктировано следовать курсу 360 градусов, оно неизбежно сместится на несколько градусов в сторону эфира. Если он дойдет до 0+ градусов, контур управления сойдет с ума и попытается полностью повернуть автомобиль, чтобы снова разогнать его до 360 градусов.

Есть ли изящный способ справиться с этим?

При написании функции навигации я использую класс внешнего контроллера PID и вычисляю заголовок следующим образом:

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

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

            steering.Degree = mv;
        }

Спасибо!

Ответы [ 3 ]

2 голосов
/ 08 февраля 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;
}
2 голосов
/ 08 февраля 2011

Если вы не можете изменить метод CalculateCorrection, добавьте эти строки перед вызовом, чтобы убедиться, что дельта находится в разумных пределах.зажим там, как в примере @Greg Buehler.

0 голосов
/ 08 февраля 2011

Как хак, пытались ли вы отправить его с заголовком 720 °?

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

...