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

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

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

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

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

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

            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 - это то, что вы хотите отслеживать); в противном случае вы перепутаете неотъемлемую часть ПИД-регулятора, переключаясь между целями, разнесенными на 360 градусов. - person Brooks Moses; 09.02.2011
comment
@Брукс Моисей, хорошая мысль, исправлено. (Я сделал неверное предположение о желаемом и измеренном) - 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