Как найти правильный курс навигации по GPS-навигации с помощью Arduino?

У меня возникла проблема несколько дней назад, и вот она:

У меня есть радиоуправляемый самолет, и я хочу сделать его автономным с помощью GPS-навигации с помощью Arduino

У меня есть встроенная плата Arduino Mage 2560, подключенная к GPS Ublox-Neo-M8N (модуль GPS), и возникает проблема

Я хочу, чтобы мой RC-Plane считывал свое положение и шел к путевым точкам

Координаты двух путевых точек определены ранее в матричной переменной, как в этом примере:

a [1] [3] =
{
    {38.884675, -116.671035, 
     245}
};

b [1] [3] =
{
    {38.725019, -116.580951, 
     1180}
};

( 1st is Latitude, 2nd is Longitude and 3rd is height)

Поэтому я хочу, чтобы мой Arduino считывал свое текущее положение из данных модуля GPS и вычислял правильный азимут (правильный горизонтальный угол) и правильный угол наклона (вертикальный угол), чтобы направлять мой самолет к путевым точкам

и помните, когда он достигнет путевой точки "a" с небольшой ошибкой (расстояние промаха = 4 метра) он должен иметь возможность игнорировать навигацию к путевой точке переменной "a" а затем перейдите к путевой точке "b"

МНЕ НУЖНА ТОЧНАЯ КОМАНДА ИЗ ЛЮБОЙ БИБЛИОТЕКИ, ЧТОБЫ ВЫЧИСЛИТЬ ЭТИ ДВА УГЛА ДЛЯ НАВИГАЦИИ (угол азимутального направления и угол тангажа для навигации RC-Plane отовсюду по путевым точкам

, 👍-2

Обсуждение

Трек (курс относительно земли) обычно рассчитывается приемником GPS и включается в отправляемые им данные. Так что ничего там рассчитывать не надо., @PMF

Однако «навигационная» часть вашего вопроса сложна. В частности, поскольку у вашего самолета нет 6 степеней свободы (как у дрона), расчет пути к путевой точке включает кривую., @PMF

очень хороший вопрос, однако он касается навигации, а не Arduino, так что здесь он не по теме ... downvote, @jsotola


1 ответ


Лучший ответ:

5

Вычисления несложные. Поскольку ваш дрон вряд ли будет путешествовать на тысячи километров можно считать, что Земля локально плоская, а широта и долгота являются ортогональной системой координат. Сначала вычислите вектор к следующей путевой точке в декартовых координатах. (дх, ды, дз):

// Определяется в глобальном масштабе.
const float radians_per_degree = M_PI / 180;
const float degrees_per_radians = 180 / M_PI;
const float meters_per_degree = 1e7 / 90;

// Для каждого показания GPS:
float dx = (waypoint.longitude - current.longitude) * meters_per_degree
         * cos(current.latitude * radians_per_degree);
float dy = (waypoint.latitude - current.latitude) * meters_per_degree;
float dz = waypoint.height - current.height;

Затем из этого вектора можно получить требуемые углы:

float azimuth = atan2(dx, dy) * degrees_per_radians;
float pitch_angle = atan(dz/sqrt(dx*dx + dy*dy)) * degrees_per_radians;

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

Обновление: timemage опубликовал очень интересный комментарий, и я хотел бы для дальнейшего расширения вопроса точности. Поддержка плавающей запятой AVR действительно ограничен одинарной точностью. Для широт и долгот в диапазон, указанный в вопросе, числовое разрешение (формально единица измерения на последнем месте) равна (3,81×10−6)° для широты и (7,63 × 10−6) ° для долготы. Это переводится примерно 42 см и 66 см соответственно на поверхности Земли. Это может быть достаточно, чтобы попасть в путевую точку с точностью до 4 м.

Вы можете увеличить разрешение, сохранив широту и долготу в микроградусах, как 32-битные целые числа. Это должно быть легко, если GPS всегда дает 6 цифр после запятой: просто игнорируйте это десятичная точка. Затем, как только количества waypoint.longitude - current.longitude и waypoint.latitude - current.latitude вычисляются, вы можете безопасно используйте плавающую точку для остальных вычислений.

,

Я был на 80% пути по написанию чего-то подобного только с TinyGPSPlus, когда зазвонил телефон, после чего это было опубликовано. Итак, я просто упомяну здесь, что если они буквально хотят иметь библиотеку, то она будет выполнять курс и дистанционную часть (которая, вероятно, основана на гаверсинусе). Шаг, который я синтезировал почти таким же образом, как этот. Единственное другое отличие, которое я заметил в моем, заключается в том, что пользователь говорит, что он использует Mega, поэтому AVR, поэтому доступно только число с одинарной точностью с точностью до 6 знаков после запятой, поэтому они должны ожидать ошибок на близком расстоянии. ., @timemage

@timemage: Спасибо за очень важный комментарий. Я отредактировал свой ответ, чтобы решить проблему точности., @Edgar Bonet

Если я правильно понимаю ОП, у него радиоуправляемый самолет крылатого типа, а не беспилотник. Это не может просто двигаться в определенном направлении., @PMF

@PMF, Они спросили, как правильно рассчитать азимут и угол тангажа от одной координаты к другой. Это правда, что они не использовали слово «дрон». Я просто предполагаю, что это используется в ответе, потому что «дрон» может означать (полу-) автономный (что имеет смысл, учитывая вопрос), а не «мультиротор» (подразумевающий способность легко менять направление). похоже, не придавал особого значения тому, что это самолет с неподвижным крылом, и необходимости планировать движение в связи с тем, что он является «самолетом с радиоуправлением»., @timemage

Спасибо за ответ, главный вопрос: есть ли какая-нибудь библиотека Arduino (упомяните библиотеку), которая может это вычислить?, @Hamid 'Smith' Salehi

Вы упомянули в ответе, что точность 44 см и 66 см. Можете ли вы описать это больше? Например это точность на каждый километр? Если нет, то сколько точность на 5 километров?, @Hamid 'Smith' Salehi

@Hamid'Smith'Salehi: может быть библиотека, которая делает это, но я ничего не знаю. Также я не понимаю, что вы подразумеваете под «точность на каждый километр». Вы читали статью в Википедии _Единица на последнем месте_?, @Edgar Bonet

Я имею в виду, что использование этого расчета имеет некоторую ошибку, потому что мы предполагали, что Земля плоская, так какова же ошибка на каждый километр расстояния?, @Hamid 'Smith' Salehi

А что такое M_PI?, @Hamid 'Smith' Salehi

@Hamid'Smith'Salehi: ошибку аппроксимации будет довольно сложно вычислить, и она будет зависеть от точной начальной и конечной точек пути. Не что-то такое простое, как «ошибка на километр». Если вы периодически получаете обновления GPS, ошибка приближения сделает путь лишь слегка изогнутым, а не прямой линией (или, скорее, большим кругом). Ошибка, создаваемая ветром, вероятно, будет на много порядков больше. M_PI равно π (пи)., @Edgar Bonet

M_PI = π =3,14259.... Вы можете разделить разрешение 44 и 66 см каждой конечной точки на количество километров расстояния между двумя точками, если хотите. Неточность использования приближения плоской Земли по сравнению с вычислением большого круга заключается в том, что курс большого круга не имеет постоянного азимута, который был бы в приближении плоской Земли. Как далеко ваши путевые точки друг от друга?, @Dave X

Спасибо за ответ.Максимальное расстояние 5 километров., @Hamid 'Smith' Salehi

Я проверил это на примере: начальная точка 52.70594, высота 13.37933 = 67 метров, а путевая точка: 52.71957, высота 1338046 64, и результат: азимут = 87.124287071904 и угол тангажа = -0.113355534...... Угол наклона кажется верным, но я знаю, что путевая точка находится к северу от начальной точки, поэтому азимут должен быть примерно равен 0 (меньше или больше). В чем проблема?, @Hamid 'Smith' Salehi

Я заменил широту на долготу, а также долготу на широту в формуле, и, похоже, она работает правильно. Можете ли вы проверить это, пожалуйста?, @Hamid 'Smith' Salehi

@Hamid'Smith'Salehi: Вы правы. Для того, чтобы север находился на 0°, азимут должен быть рассчитан как atan2(dx, dy). Я отредактировал код в своем ответе., @Edgar Bonet