GPS в FLProg
Рассмотрим работу и нюансы, связанные с работой GPS в программе FLProg.
Большинство модулей GPS по деф. передают данные в формате NMEA 0183 через UART.
Мульти блок сделанный и описанный в следующем посте, рассчитан на работу именно с этим форматом.
Поэтому подойдет практически под все модули GPS.
У меня в наличии модуль BN 357. Это ГЛОНАСС+GPS модуль. Примерно как NEO-M8.
Примеры в теме будут рассмотрены для BN 357.
[spoiler title=Передача данные в формате NMEA 0183]
Краткое представление что такое NMEA 0183.
Передача данных с модуля идет текстом в виде строк.
Начало строки $ конец строки *, за ней контрольная сумма.
$GNRMC,073114.00,A,2237.56240,N,11401.59614,E,1.329,21.11,020916,,,A,V*37
Содержимое всех строк пакета данных, надо смотреть в даташите производителя
на конкретную модель модуля GPS.
Описание BN357.pdf
Каждая строка состоит из 5-буквенного идентификатора сообщения, пример: GNRMC.
Идентификатор понадобится для блока FLProg
Первые две буквы — идентификатор источника сообщения,
это «GP» — GPS, «GL» — ГЛОНАСС, «GA» — Галилео, «GN» — ГЛОНАСС+GPS и т. п.
Следующие три буквы — идентификатор формата сообщения. Список их большой.
Рассмотрим один из них. RMC – Рекомендованный минимальный набор GPS данных.
Примерно этот набор данных есть во всех модулях.
Данные, количество, вид, последовательность в строке – стандартизирована (зависит от версии NMEA).
Если какие-то данные отсутствуют (зависит от модели и режима gps), на их месте стоят запятые.
По запятым определяем номер позиции данных в строке.
Это понадобится для блока FLProg.
Рассмотрим строку из модуля BN 357.
GNRMC,073114.00,A,2237.56240,N,11401.59768,E,1.329,21.11,020916,,,A,V
Значение позиций строки:
0. GNRMC, - идентификатор
1. 7 часов 31 минут 14 секунд 00 Санти секунд, - время UTC
2. «A» достоверно, («V» предупреждение) - статус
3. 22° 37.56240', - широта
4. N, - северная
5. 114° 01.59768', - долгота
6. Е, - восточная
7. 1.329 узлов, - скорость (морских миль 1852 м/ч)
8. 21.11 градуса, - курс движения
9. 2 сентября (20)16 года
10. магнитное склонение не указано
11. направление магнитного склонения не указано
12. A, - индикатор режима
13. V, - Индикатор состояния навигации
Эта строка, а также другие строки, разбираются, и приводятся к нужному типу (виду) данных, с помощью библиотеки TinyGPSPlus.
Которая используется в мульти блоке GPS.
Больше информации NMEA 0183 можно посмотреть
на wiki
[/spoiler]
[spoiler title=Нюансы при создании проекта GPS в FLProg.]
Первое с чем столкнется начинающий пользователь при создании проекта с GPS навигацией,
Это добиться точности определения позиции. К примеру модуль BN 357 должен рассчитывать
координаты с точностью +-2м. Но по факту мы в нее не попадаем. Что же мешает этому?
Рассмотрим модуль BN 357,
он выдает координаты вида 114 градусов 1 минута 59768 с 5-ю десятичными знаками от минуты, (пример долготы).
Преобразовываем это в чистые градусы с десятичными долями.
ddd mm.mmmmm=(ddd + mm.mmmmm/60)=ddd.dddddd
Получаем 114.026628
Примерную точность этой координаты можно судить по десятичной части из расчета:
градусы дистанция
1 = 100 км
0.1 = 10 км
0.01 = 1 км
0.001 = 100 м
0.0001 = 10 м
0.00001 = 1 м
0.000001 = 1 дм
Теоретически мы можем добиться точности +-10 см, но практически без, удачного расположения спутников,
хорошего модуля GPS, хорошем состоянии атмосферы, и возможно дополнительных корректирующих наземных станций,
добиться таких результатов не получится.
Но чтобы быть уверенным на 100% в метровой точности,
математические расчеты должны быть с запасом до дециметров (т.е градусы с 6-ю знаками после запятой).
Теперь рассмотрим простой пример проекта навигации на ардуино Уно/Мега в FLProg.
У нас есть сохраненные координаты местности точным поверенным навигатором,
допустим та же долгота 114.026602 градуса. Здесь надо учесть еще одну тонкость.
ДАТУМы (взятых с других модулей или топо-карт) должны быть одинаковые с вашим модулем GPS. Иначе мы даже в сотку не попадем.
В примерах для этого будем использовать координаты, сохраненные этим же модулем.
Но и здесь есть нюансы. Не факт, что состояние атмосферы и расположение спутников в момент снятия данных было наилучшее.
Поэтому для более точных координат точки, надо снимать данные несколько раз, в разное время.
Или оставить на сутки изделие, снимая регулярно показания расстояния и курса, чтобы вычислить среднее значение,
во круг которого будет дрейфовать позиция.
И так, нам надо ввести долготу в проект, что бы ардуина привела нас точно на нее. И вот здесь
первые грабли )
FLProg округляет float до третьего знака. Как бы мы не старались, через константу, переменную, массив,
получаем 114.027 что в данном случае не допустимо.
Остается вариант передавать данные долготы текстом, и конвертировать в float непосредственно перед расчетными блоками.
Но и здесь невезуха точность повысилась всего на один разряд 4 знака.
Тех, кто живет на долготе с однозначным числом градусов, повезет больше,
т.к точность float на 8-ми битных контроллерах ардуино, находится в пределах 7-8ми знаков
(114.0266, считается все число и точка тоже).
Получается мы не можем надеяться на высокую точность навигатора сделанного на Унке.
Возьмем для этих целей ESP32. Все же 32 бита контроллер это не 8.
Проверим что будет получаться на ней. И опять невезуха.
Нужен тип Double, но его нет в FLProg. Придется сделать свой блок конвертора в Double.
Проверяем.
Точность float_Double в esp32.png
Точность float_Double в esp32.flp
И вот оно счастье… теперь можно делать расчеты, не боясь вводить астрономические константы ))
Главное здесь знать, какие блоки, ПБ, и их библиотеки в FLProg могут работать с типом Double,
не то переконвертят опять на float.
Теперь есть с чем сравнивать. Можно вернутся к Унке, и попробовать добиться той же точности.
Возьмем координаты, отделим целую часть от дробной, рассчитаем каждую, и сложим.
Конечно этим мы увеличим и без того нагрузку на проц, но здесь интересна сама возможность этого,
нежели практическое применение. Оказалось, и Унка может с этим справляться. Не так, как esp, но все же.
(пример проекта ниже постом)
Правда говоря при испытаниях результат касаемо точности не был ярко выражен, (те же +-2м как и на esp)
но шаг позиции стал все же мельче, по сравнению с не делимым числом.
Здесь бы сравнить на более точных модулях, но у меня нет таковых.
Вся эта вводная информация – мой путь при создании алгоритма этого блока.
Расписано что бы было понятно почему именно так сделан блок.
Возможно мое видение всего этого в чем-то и ошибочно.
[/spoiler]
Необходимые блоки для примеров можно найти
Здесь
У вас нет необходимых прав для просмотра вложений в этом сообщении.