Как стать автором
Обновить

Эмулятор данных с GNSS приемника по протоколу NMEA

Время на прочтение 2 мин
Количество просмотров 16K

Введение



Возникла у меня необходимость тестировать приложение, использующее данные GNSS по протоколу NMEA. Связано было с тем, что работал над проектом программы навигации самолета, тестировать в воздухе дорого естественно, на земле ездить на машине с GNSS приемником не особо удобно, вот и хотелось сидя за столом иметь на виртуальном параллельном порту данные протокола NMEA с якобы перемещающегося оборудования. Сначала искал разный софт думал, найду что то подходящее, но большинство платное и управление эмуляции данных не совсем удобное, хотя и эмулируют практически все параметры стандарта NMEA. Но мне надо было что-то простенькое эмулирующее координаты, скорость, в принципе не более того и требовалось достаточно удобное и логичное управление. Вот и пришлось написать приложение подобного рода на C#.

Fly_nmea



NMEA («National Marine Electronics Association») — полное название «NMEA 0183» — текстовый протокол связи морского (как правило, навигационного) оборудования между собой.
Данные передаются в виде предложений. Формат предложений следующий:
$AAAAA[, <данные> ]*hh, где:
$ — символ начала предложения (код 24h);
AAAAA — Пяти-символьный адрес (имя) предложения;
[, <данные> ] — список полей данных разделенных запятыми (код 2Сh);
* — признак контрольной суммы (код 2Ah);
hh — контрольная сумма.

Пример предложения:
GGA – Данные определения места по GPS
Время место и данные относящиеся к обсервации.
$GPGGA,hhmmss.sss,llll.ll,a,yyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxx*hh

Мне требовалось эмулировать четыре строки:
  • GLL – Координаты места
  • GSV – Видимые спутники
  • RMC – Рекомендуемый минимальный набор данных по GPS и ГЛОНАСС
  • GSA – Фактор ухудшения точности, используемые для навигации спутники

Эмуляция организована в следующем порядке:
  • мы задаем начальные координаты в системе WGS-84
  • далее переходим в плоскую проекцию, например Меркатора(для преобразования координат использовал готовую библиотеку на C# GeoUtility.dll)
  • зная плоские координаты x, y, h реализуем физику движения самолета по изменяемым параметрам через графический интерфейс, таких как: крен, тангаж, скорость
  • конвертируем плоские координаты в координаты B, L, H системы WGS-84
  • формируем пакет сообщений стандарта NMEA из требуемых четырех строк
  • отправляем их на виртуальный параллельный порт

Fly_nmea + Android Sensor

Для более удобного тестирования я еще наладил прием данных с Android сенсоров (углы наклона). Android по UDP отсылает две строки типа:
  • «Angle:\t236.04152\t-1.0\t-3.0»
  • «Acc:\t-0.46309182\t-0.14982383\t-10.56939»

На приложении эмуляции я их принимаю и исходя из углов наклона меняю параметры:
  • Крен
  • Тангаж

В приложении эмуляции можно переключится с управления через интерфейс программы на Android Sensor.

Подключение Fly_nmea

Для эмуляции COM портов пригодится еще Virtual Serial Ports Emulator, потребуется настроить связь двух виртуальных COM портов например: COM1 <-> COM6, и программа Fly_nmea будет отсылать данные на COM6, а на COM1 программа использующая NMEA протокол будет их забирать.

Заключение


В целом я больше потратил времени на поиск подобного софта, и не найдя что меня бы полностью удовлетворило быстрее написал его сам. По мимо проекта над которым я работал, так же удалось вполне удачно подключить эмулятор к программам, понимающим NMEA протокол таким как: 2Gis и SAS planet.




FlyNMEA и android sensor(проект по передаче данных с сенсоров по UDP) тут
VSPE для эмуляции портов тут

upd: частота эмулируемых данных 5 Гц
Теги:
Хабы:
+23
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн