Как найти правильный курс навигации по 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 отовсюду по путевым точкам
1 ответ
Лучший ответ:
Вычисления несложные. Поскольку ваш дрон вряд ли будет путешествовать на тысячи километров можно считать, что Земля локально плоская, а широта и долгота являются ортогональной системой координат. Сначала вычислите вектор к следующей путевой точке в декартовых координатах. (дх, ды, дз):
// Определяется в глобальном масштабе.
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
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Как извлечь широту и долготу из GPS
- Не получение данных от GPS
- NEO GPS 6M подключение к Lilypad Arduino
- Arduino Mega не получает данные от Neo-6M
- GPS показывает неверную скорость
- GPS Ublox neo-6mv2
Трек (курс относительно земли) обычно рассчитывается приемником GPS и включается в отправляемые им данные. Так что ничего там рассчитывать не надо., @PMF
Однако «навигационная» часть вашего вопроса сложна. В частности, поскольку у вашего самолета нет 6 степеней свободы (как у дрона), расчет пути к путевой точке включает кривую., @PMF
очень хороший вопрос, однако он касается навигации, а не Arduino, так что здесь он не по теме ... downvote, @jsotola