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

GPS*

Введение



Возникла у меня необходимость тестировать приложение, использующее данные 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
28 сентября 2011, 11:42
32
2m0nd 28,2

комментарии (12)

+1
DnAp #
Я использовал GpsGate
0
tony_ru #
а где же рысканье?
0
2m0nd #
рыскание меняется в зависимости от крена и скорости :)
+1
tony_ru #
оригинально
0
Valery35 #
Немного непонятно. Вроде угол независимый. Вы его вычисляете?
0
2m0nd #
По сути угол рыскания (имеется ввиду что выдает GNSS) — это просто вектор путевой скорости самолета, вычисляется по двум координатам предыдущей и реальной. А вот координаты вычисляются исходя из параметров: скорости и крена.
0
tronix286 #
Сорри за офтопик, но не подскажите, как по NMEA время со спутника узнать? Нужно ли парсить все пакеты или достаточно дождаться первого найденного спутника и от него определенного пакета?
+1
2m0nd #
тут вроде бы что то об этом говорили habrahabr.ru/blogs/personal/79701/
0
tronix286 #
Спасибо, пропустил топик.
+1
2m0nd #
NMEA — не что уже обработанное в приемнике, который начинает посылать строки только когда инициализируется минимальное количество спутников.
0
Korogodin #
Зависит от настроек приемника, он может отсылать строки и при отсутствии навигационного решения.

Очень интересная задумка и реализация! Вопрос: почему 5 Гц? Можно ли разогнать, малой кровью, до 10 или снизить до 1?
0
2m0nd #
конечно можно, мне просто требовалось тестировать в такой конфигурации навигационное ПО над которым я работал. Сообщения выдаются по таймеру, можете сами посмотреть docs.google.com/leaf?id=0B6mJa-Qxp8MYZWQ2N2I1M2YtMmNiNi00YTdiLWE3YjktYmMxODBhYzk1Mjcx&hl=ru

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.