Коллекция программ для работы с протоколом nmea. Особенности протокола NMEA2000 и его использование. Исходящие сообщения NMEA
Возникла у меня необходимость тестировать приложение, использующее данные 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# )
- зная плоские координаты 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»
- Тангаж
Подключение Fly_nmea
Для эмуляции COM портов пригодится еще Virtual Serial Ports Emulator, потребуется настроить связь двух виртуальных COM портов например: COM1 <-> COM6, и программа Fly_nmea будет отсылать данные на COM6, а на COM1 программа использующая NMEA протокол будет их забирать.Заключение
В целом я больше потратил времени на поиск подобного софта, и не найдя что меня бы полностью удовлетворило быстрее написал его сам. По мимо проекта над которым я работал, так же удалось вполне удачно подключить эмулятор к программам, понимающим NMEA протокол таким как: 2Gis и SAS planet.FlyNMEA и android sensor(проект по передаче данных с сенсоров по UDP)
NMEA 0183 (от «National Marine Electronics Association ») - стандарт определяющий текстовый протокол связи морского (как правило, навигационного) оборудования (или оборудования, используемого в поездах) между собой. Стал особенно популярен в связи с распространением GPS-приёмников , использующих этот стандарт.
Общий вид строк в NMEA 0183
- символ «$» или «!» (hex 24 или hex 21)
- 5-буквенный идентификатор сообщения. Первые две буквы - идентификатор источника сообщения, следующие три буквы - идентификатор формата сообщения, согласно протоколу NMEA 0183 определённой версии.
- список данных (буквы, цифры и точки), разделённых запятыми. Если какие-либо данные отсутствуют внутри строки, запятые всё равно ставятся (например «,»). Некоторые поля в конце строки могут отсутствовать вовсе.
- символ «*».
- восьмибитная XOR -сумма всех символов (включая «,» и «^») в строке между «$» и «*» приведенная к двум ASCII-символам в верхнем регистре для 16-ричного представления байта (0–9, A–F).
(hex 0D, hex 0A).
Максимальная длина сообщения ограничена 82 символами (NMEA 0183 rev 3.0)
Стандарт описывает более 250 идентификаторов NMEA-последовательностей. Стандарт определяет скорости обмена данными в 4800 бод. (Для скоростей в 38400 бод и выше есть расширенный стандарт NMEA-0183-HS).
Стандарт позволяет добавлять собственные идентификаторы последовательностей, что часто используется производителями для передачи дополнительной информации о работе устройства.
RMC-строка (частный пример)
$GPRMC,hhmmss.sss,A,GGMM.MM,P,gggmm.mm,J,v.v, b.b, ddmmyy, x.x, n,m*hh
Значение полей:
- «GP» - идентификатор источника; в приведенном примере это GPS, «GL» - ГЛОНАСС , «GA» - Галилео , «GN» - ГЛОНАСС+GPS и т. п.
- «RMC» - «Recommended Minimum sentence C»
- «hhmmss.sss» - время фиксации местоположения по Всемирному координированному времени UTC : «hh» - часы, «mm» - минуты, «ss.sss» - секунды. Длина дробной части секунд варьируется. Лидирующие нули не опускаются.
- «A» - статус: «A» - данные достоверны, «V» - недостоверны.
- «GGMM.MM» - широта. 2 цифры градусов(«GG»), 2 цифры целых минут, точка и дробная часть минут переменной длины. Лидирующие нули не опускаются.
- «P» - «N» для северной или «S» для южной широты.
- «gggmm.mm» - долгота. 3 цифры градусов(«ggg»), 2 цифры целых минут, точка и дробная часть минут переменной длины. Лидирующие нули не опускаются.
- «J» - «E» для восточной или «W» для западной долготы.
- «v.v» - горизонтальная составляющая скорости относительно земли в узлах . Число с плавающей точкой. Целая и дробная части переменной длины.
- «b.b» - путевой угол (направление скорости) в градусах . Число с плавающей точкой. Целая и дробная части переменной длины. Значение равное 0 соответствует движению на север , 90 - восток , 180 - юг , 270 - запад .
- «ddmmyy» - дата : день месяца, месяц, последние 2 цифры года (ведущие нули обязательны).
- «x.x» - магнитное склонение в градусах (часто отсутствует), рассчитанное по некоторой модели. Число с плавающей точкой. Целая и дробная части переменной длины.
- «n» - направление магнитного склонения: для получения магнитного курса магнитное склонение необходимо «E» - вычесть, «W» - прибавить к истинному курсу.
- «m» - индикатор режима: «A» - автономный, «D» - дифференциальный, «E» - аппроксимация , «N» - недостоверные данные (часто отсутствует, данное поле включая запятую отсутствует в старых версиях NMEA).
- «hh» - контрольная сумма.
- байт равен 0x0D. - байт равен 0x0A.
Примеры RMC-строки
Пример 1
$GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,*17
Значение полей:
- 12 часов 55 минут 4,049 секунд UTC
- «A» - достоверно
- широта 55° 42,2389", северная
- долгота 37° 41,6063", восточная
- скорость 0,06 узлов
Ты наверное сейчас занят решением проблемы взлома очередного мега-супер-гипер сервака, но знаешь ли ты, что такое GPS и как с ним обращаться?! Если нет, то тебе сюда! В этой статье я расскажу тебе о том, как работают GPS приемники, как получить с них информацию, а так же как самому написать простенькую программу для работы с GPS-модулем.
GPS (Global Positioning System, Система Глобального Позиционирования) была введена в действие США в 1994 году. Состоит она из 24 спутников и наземных приемных комплексов, коим может являться и твой GPS-навигатор или GPS-модуль (в дальнейшем навигатор). Для точного определения координат твой навигатор должен видеть минимум 4 спутника. В недалеком прошлом точность определения координат вне территории США (а точнее для потребителей не из США) была искусственно снижена, но не так давно это ограничение было убрано и теперь ты можешь определять свое местоположение даже в тайге с точностью до нескольких метров.
На пальцах все это работает так: твой навигатор получает информацию с каждого из видимых спутников, которые являются для него как бы маяками. Внутри навигатора находится микропроцессор с зашитой в него программой, которая на основе полученных данных и высчитывает твое местоположение.
В настоящее время в продаже имеется огромное количество GPS-навигаторов и GPS-модулей для КПК и ноутбуков. GPS-навигатор это GPS-приемник с экраном, на котором отображается информация о твоем местоположении, а GPS-модуль – это GPS-приемник, который подключается к компьютеру и передает всю навигационную информацию программе, которая с ним работает. Все они в принципе отличаются только форм-фактором и принципиальных различий в работе не имеют. Но нас с тобой больше интересует каким же все таки образом он общается с компьютером и как вытащить из него информацию. Сейчас все расскажу и покажу.
Какого бы форм-фактора (COM, USB, BlueTooth и т.п.) не был GPS-модуль, он будет логически связан с компьютером через COM-порт, т.е. при подключении создается соединение по последовательному порту. Навигационная информация в большинстве случаев передается по протоколу NMEA. Это самый распространенный протокол передачи для GPS-модулей. Хотя есть и другие протоколы, но мы их рассматривать не будем.
Ну а теперь самое время узнать как же сделать софтину для работы со всем этим хозяйством. Скажу сразу, что мне не очень хочется сейчас объяснять как тыкать в кнопки в том же
VB, статья носит больше ознакомительный характер. Для тех кто в танке я объясню подобно процесс создания программы в следующих статьях.
Я освещу лишь наиболее важные моменты и я думаю у тебя все получится. Скажу сразу, что ваять прогу можно в любых языках программирования, лишь бы была возможность работы с последовательным портом и со строками.
Первое с чего нужно начать это с открытия COM-порта. Почти все приемники по умолчанию имеют установки: скорость 9600 бит/с, 8/N/1. Как только ты откроешь порт тебе сразу с интервалом в секунду будет приходить навигационная информация примерно такого вида:
$GPGGA,143345.264, 0936.23,N,06354.15,E, 0,06,0.0,230.6,M,0.0,M,0.0,0345*76
$GPRMC,143345.26, A,0936.23,N,06354.15, E,0.0,0.0,230306,0.0,E,A*45
$GPGSA,A,3,03, 04,05,07,11,12,0.0,0.0,0.0*Е2
$GPGSV,1,1,06,05,67,120,20*34
Теперь приступим к разбору:
Данные передаются в виде предложений. Формат предложений следующий:
$AAAAA[, <данные> ]*hh
$ — символ начала предложения (код 24h);
AAAAA — пятисимвольный адрес (имя) предложения;
[, <данные> ] — список полей данных разделенных запятыми (код 2Сh);
* — признак контрольной суммы (код 2Ah);
hh — контрольная сумма;
Типы полей данных.
Тип поля | Обозначение | Определение |
Специальный формат полей |
||
Статус | A | Поле одного символа. А= да, данные достоверны, предупредительного сигнала нет. V= нет, данные не достоверны, есть сигнал предупреждения. |
Широта | llll.ll | градусы-минуты доли минуты. 2 знака число знаков долей минуты. Если первый знак градусов или минут отсутствует, то его заменяют нулем с тем, чтобы большое разрешение. |
Долгота | yyyyy.yy | Поле постоянной/переменной длины: градусы-минуты и доли минуты. 3 знака градусов, 2 знака минут и переменное число знаков долей минуты. Если первые знаки или первый знак минут отсутствует, то их заменяют нулем для того, чтобы сохранить постоянное число знаков. Децимальная точка и последующие знаки долей минут являются дополнительными и могут не использоваться, если не нужно большое разрешение. |
Время | hhmmss.ss | Поле постоянной/переменной длины: часы/минуты/секунды и доли секунды. 2 знака часов, 2 знака минут, 2 знака секунд и переменное число знаков долей секунд. В качестве первого знака часов, минут, секунд может быть поставлен ноль, для сохранения постоянного числа знаков. Если не требуется высокая точность, то децимальная точка и доли секунд могут быть опущены. |
Определенные поля | Некоторые поля специально предназначаются для размещения заранее определенных постоянных величин, чаще всего буквенных обозначений. Признаком таких полей является наличие одного или нескольких знаков. |
Поля цифровых величин
Информационные поля
Примечания:
1. Пробелы могут быть использованы только в полях текстов изменяемой длины.
2. Отрицательный знак “-” (код 2Dh) является первым знаком поля, если в нем приводятся отрицательные величины. При использовании отрицательного знака в полях фиксированной длины их длина увеличивается на единицу. При положительных величинах знак опускается.
GGA – Данные определения места по GPS
Время место и данные относящиеся к обсервации.
$GPGGA,hhmmss.sss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh
1. hhmmss.sss – время навигационных определений;
2. llll.ll,a – широта, N/S;
3. yyyyy.yy,a – долгота, E/W;
4. x – показатель качества обсервации: 0 = нет данных, 1 = обсервация получена, 2 = обсервация в дифференциальном режиме;
5. xx – число используемых спутников;
6. x.x – величина горизонтального геометрического фактора (HDOP);
7. x.x,M – высота антенны над уровнем моря (геоидом), м;
8. x.x,M – превышение геоида над эллипсоидом WGS84, м;
9. x.x – устаревание дифференциальных поправок, то есть время в секундах с момента получения последней дифференциальной поправки, нулевое поле используется в случае выключения дифференциального режима;
10. xxxx – идентификатор дифференциальной станции 0ё1023.
Время, дата, координаты и курс счисляемые аппаратурой.
$GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxxxx,x.x,a,a*hh
Полями данного предложения являются:
1. hhmmss.ss – время;
2. A – статус (A/V);
3. llll.ll,a – широта, N/S;
4. yyyyy.yy,a – долгота, E/W;
5. x.x – скорость в узлах;
6. x.x – курс в градусах;
7. xxxxxx – дата: dd/mm/yy (день/месяц/год);
8. x.x,a – магнитное склонение в градусах, E/W;
9. a – индикатор режима: A = автономная обсервация, D = дифференциальный режим, N = данные недостоверны.
GSA – Фактор ухудшения точности, используемые для навигации спутники
$GPGSA,a,x,xx, … ,xx,x.x,x.x,x.x*hh
Полями данного предложения являются:
1. a – режим управления количеством определяемых координат: М = ручное, указан режим, А = автоматическое переключение;
2. x – режим работы: 1 = обсервация невозможна, 2 = определяются две координаты, 3 = определяются три координаты;
3. xx…xx – номера спутников используемых для решения навигационной задачи, количество полей равно количеству каналов приемника, для GPS используются номера 1ё32, для WAAS 33ё64, для ГЛОНАСС 65ё96;
4. x.x – общий геометрический фактор ухудшения точности (PDOP);
5. x.x – горизонтальный геометрический фактор ухудшения точности (HDOP);
x.x – вертикальный геометрический фактор ухудшения точности (VDOP).
GSV – Видимые спутники
Число спутников в зоне радиовидимости, номер спутника, угол возвышения, азимут и отношение сигнал/шум. Одно предложение может содержать информацию об 1 до 4 спутников, дополнительные данные о спутниках передаются в следующих предложениях. Номер предложения указывается в первых двух полях данных. Для спутниковых систем зарезервированы следующие номера: для GPS 1-32, для WAAS 33-64, для ГЛОНАСС 65-96.
$GPGSV,x,x,xx,xx,xx,xxx,xx, … ,xx,xx,xxx,xx*hh
Полями данного предложения являются:
1. x – общее число сообщений;
2. x – номер сообщения;
3. xx – общее число спутников в зоне радиовидимости;
4. xx – номер спутника;
5. xx – угол возвышения спутника, градусы 00-90;
6. xxx – азимут истинный, градусы 000-360;
7. xx – отношение сигнал/шум 00-99 дБ, если спутник не сопровождается не передается.
Примечание: поля 4, 5, 7 повторяются для 2, 3 и 4 спутников.
Ну вот теперь, имея описание протокола NMEA и драйвер прямые_руки.sys можешь приступать к построчному разбору пакетов и созданию мега программулины)))).
NMEA 0183 – текстовый протокол связи, используемый в приемных модулях GPS. Этот стандарт был создан для связи морского навигационного оборудования. Протоколом предусмотрена передача текстовых команд и сообщений посредством ASCII символов. Таким образом, для приема сообщений достаточно использовать последовательный интерфейс UART, при этом все сообщения можно передавать непосредственно на компьютер, используя для этого COM-порт, но не забывая о необходимости преобразования уровней сигналов.
Модуль GPS передает сообщения разного формата, содержащие различный набор данных: широта и долгота, скорость, курс, время, количество спутников и т.д. Сообщения передаются последовательно и делятся на несколько видов, формат каждого вида сообщений содержит в своих полях строго определенную информацию. Рассмотрим подробней общую структуру сообщений, которые выдает модуль GPS.
$ - с этого символа начинается каждое сообщение
Далее следует идентификатор из 5 текстовых символов. Первые две буквы обозначают тип навигационной системы, например «GP» - GPS или «GL» - Глонасс и т.д. Следующие 3 символа – это идентификатор формата сообщения, который полностью определяет содержимое последующих переданных данных. Например «RMC» - это рекомендованный минимум данных, в котором содержится информация о времени и дате, широте и долготе, скорости, курсе и магнитном отклонении в градусах (может отсутствовать). Или «GSA» , здесь будут переданы данные о спутниках. Структура основных типов сообщений будет рассмотрена ниже.
Затем следует «,» - запятая, после которой уже непосредственно идет тело сообщения с различными данными, которые отделяются друг от друга такой же запятой. Если передаваемое число не целое, то разделителем между целой и дробной частями служит точка «.» .
Конец тела сообщения обозначается символом «*» . Далее следует контрольная сумма всех символов, содержащихся между «$» и «*», то есть всего тела сообщения, включая и сами данные и идентификаторы в начале сообщения. Контрольная сумма вычисляется как XOR (исключающее ИЛИ) всех шестнадцатеричных кодов ASCII символов сообщения.
И в самом конце каждого сообщения обязательно следуют символы перевода строки
Рассмотрим назначение и структуру различных типов сообщений.
RMC – рекомендованный минимум навигационных данных. Сообщение содержит минимально необходимое количество информации. Это данные о широте и долготе, дате и времени, скорости. Для многих задач большего и не надо, например, в модуле Quectel L50 я отключил передачу всех других типов сообщений, поскольку информация о спутниках и уровне их сигналов мне абсолютно не нужна. А прием излишней информации требует усложнения программы обработки этих данных. Структура сообщения такая:
$GPRMC,
hhmmss.sss
,A,
ddmm.mmmm
,N,
ddmm
.
mmmm
,
E
,v.v,
c
.
c
,
ddmmyyyy
,x.x,n,
m
*hh
Это сообщение содержит следующие данные:
- GPRMC – спутниковая система GPS, идентификатор сообщения RMC
- hhmmss.sss – время (по Гринвичу), где hh – часы, mm – минуты, ss.sss – секунды
- A – данные достоверны или V – данные недостоверны. Символ A в сообщении будет при уверенном приеме сигналов со спутников, необходимом для вычисления данных о местоположении. Символ V будет, когда приемник не увидит спутников или когда количество найденных спутников недостаточно для уверенного расчета координат. Например, если вы включите модуль GPS где-то панельном доме и на удалении от окон, скорее всего вы увидите символ V в принятом сообщении.
- ddmm.mmmm – широта, градусы и минуты
- N или S – север или юг. Полушарие, в котором вы находитесь. Если вы находитесь в Австралии, то покажет S . У меня в Екатеринбурге модуль GPS выдает N .
- ddmm.mmmm – долгота, градусы и минуты
- E или W – западное или восточное полушарие
- v.v – скорость в узлах
- c . c – курс над землей в градусах. При движении строго на север будет 0 градусов.
- ddmmyyyy – дата
- x.x – магнитное склонение
- n – направление магнитного склонения. По этим двум последним параметрам ничего разъяснить не смогу. Например, мой модуль GPS Quectel L50 при приеме в квартире на окне эти данные не показывал вовсе, просто пропускал.
- m – режим навигации: N – недостоверные данные, A – автономный, D – дифференциальный
Вот пример сообщения RMC:
$GPRMC,105954.000,A,3150.6731,N,11711.9399,E,0.00,96.10,250313,A*53
- Время по Гринвичу 10ч 59м 54сек
- A – данные достоверны
- Широта 31 градус и 50.6371 минут
- N – северная
- Долгота 117 градусов 11.9399 минут
- E – восточная
- Скорость 0.00 узлов
- Курс 96.1 градусов
- Дата 25 марта 2013 года
- Данные о магнитном склонении отсутствуют
- Режим – автономный
- Контрольная сумма символов сообщения 0×053
Здесь необходимо отметить один нюанс. Данные о широте и долготе содержат дробную часть минут, которая вовсе не соответствует количеству «секунд», поскольку является десятичной дробью. Те программы для работы с GPS, которые я пробовал, показывают координаты на карте точно. Но если ввести эти числа в строку поиска Google maps, то местоположение на карте получится в нескольких километрах от действительного. При вводе полученных координат в этом случае необходимо поделить дробную часть широты и долготы на 60, чтобы перевести эти числа в «секунды». При первом подключении модуля Quectel L50 и вводе полученных координат широты и долготы в строку поиска Google maps, я получил положение на карте со значительной погрешностью, на карте обозначилось место где-то в районе Уралмаша.
Вот еще некоторые типы сообщений, используемые в данном протоколе:
- VTG - истинное направление курса и скорость относительно земли
- GGA - данные о последнем определении местоположения
- GSA - данные об активных спутниках
- GSV - данные о видимых спутниках, их положении и номерах, а также уровне сигнала
- GLL - данные о широте, долготе и времени
- ZDA - данные о времени и дате
Я не стал подробно разбирать из чего состоит каждое сообщение, ссылка на документ с описанием протокола приведена в конце статьи. Конкретный тип GPS модуля может передавать не все данные из приведенных. Можно отключить или включить передачу различных типов данных, а также настроить период их выдачи. Для настройки модуля существуют специальные команды, которые начинаются с идентификатора $PSRFxxx , где xxx определяет тип и формат команды, точно так же как в исходящих сообщениях.
Например, команда $PSRF100,0,9600,8,1,0*0C
- $PSRF100 – идентификатор команды собственного протокола SIRF
- 0 – бинарный протокол SIRF, 1 – протокол NMEA
- 9600 – скорость бит/сек
- 8 бит данных
- 1 стоп-бит
- 0 – проверка на четность отключена
Команда $PSRF103,00,00,02,01*26
- $PSRF103 – идентификатор команды собственного протокола SIRF
- далее после запятой идут две цифры, которые определяют тип настраиваемого сообщения:00 - GGA
01 - GLL
02 - GSA
03 - GSV
04 - RMC
05 - VTG - следующие две цифры настраивают порядок выдачи сообщений, например:00 - периодически
01 - по запросу - следующие цифры задают период выдачи сообщений в секундах:00 = Off (сообщения отключены)
1-255 – интервал между сообщениями данного типа в секундах - далее включается/отключается передача контрольной суммы в сообщении NMEA, передаваемом модулем:00 – передача контрольной суммы отключена
01 – контрольная сумма передается - после символа “*”, как и в исходящем сообщении NMEA, передаются контрольная сумма и символы перевода строки.
Вот и все, что хотелось вкратце изложить о протоколе NMEA 0183 и командах управления модулем на чипсете SIRF. Более подробно расшифровка всех этих сообщений и команд приведена, например, в описании протокола модуля Quectel L50, который можно загрузить по ссылке ниже.
Описание NMEA протокола. Реализация в приемниках Garmin и GlobalSat
Введение
Национальная Ассоциация Морской Электроники (National Marine Electronics Association - NMEA) разработала специальный протокол для поддержания совместимости морского навигационного оборудования различных производителей. Этот NMEA протокол описывает не только данные, полученные с GPS приемников, но и измерения сонаров, радаров, электронных компасов, барометров и других навигационных устройств, использующихся на морских судах.
Интерфейс обмена данными большинства портативных GPS приемников реализован в соответствии с этой спецификацией. Большинство навигационных программ, которые обеспечивают отображение данных в реальном времени, поддерживают и «понимают» NMEA протокол. Эти данные содержат полные навигационные измерения GPS приемника - позицию, скорость и время. Все NMEA сообщения состоят из последовательного набора данных, разделенных запятыми. Каждое отдельное сообщение не зависит от других и является полностью «завершенным». NMEA cообщение включает заголовок, набор данных, представленных ASCII символами, и поле «чексуммы» для проверки достоверности переданной информации.
Заголовок стандартных NMEA сообщений состоит из 5 символов, из которых два первых определяют тип сообщения, а оставшиеся три - его название. Например, все GPS NMEA сообщения имеют префикс «GP». Сообщения, которые не описаны в спецификации NMEA, но реализованы в GPS приемниках в соответствии с общими правилами, имеют префикс «Р», дополненный тремя символами, уникальными для каждой компании. Например, «собственные» NMEA сообщения Garmin имеют префикс «PGRM», Magellan - «PMGN»
Каждое NMEA сообщение начинается с «$», заканчивается «n» («перевод строки») и не может быть длиннее 80-и символов. Все данные содержаться в одной строке и отделены друг от друга запятыми. Информация представлена в виде ASCII текста и не требует специального декодирования. Если данные не умещаются в выделенные 80 символов, то они «разбиваются» на несколько NMEA сообщений.
Такой формат позволяет не ограничивать точность и количество символов в отдельных полях данных. Например, дробная часть значения координат может быть представлена 3 или 4 знаками после запятой, но это никак не должно повлиять на работу программного обеспечения, которые выделяет нужные данные из сообщения по номеру поля. В конце каждого NMEA сообщения содержится поле «чексуммы», отделенное от данных символом «*». При необходимости оно может использоваться для проверки целостности и достоверности каждого принятого сообщения.
NMEA протокол поддерживает не только исходящие, но и входящие сообщения, с помощью которых, например, можно обновить или добавить путевые точки маршрута. Эти сообщения должны быть сформированы в строгом соответствии с форматом NMEA, в противном случае, они будут просто проигнорированы GPS приемником. Стоит отметить, что не все навигационные программы и модели приемников поддерживают этот режим, так как используют для загрузки точек и маршрутов фирменные протоколы производителей - Garmin, Magellan и т.д.
С момента создания, NMEA протокол претерпел несколько модификаций, связанных с добавлением новых полей и сообщений. Текущей версией, которую поддерживают большинство приемников, является версия 2.3, хотя уже опубликовано описание новой версии 3.0. Полная спецификация NMEA сообщений отсутствует в свободном доступе и ее нельзя официально скачать в электронном виде, Отдельные ее разделы, общее описание NMEA протокола и наиболее популярных сообщений можно найти в Интернете. Официально приобрести NMEA документацию можно на сайте www.nmea.org .
Список сообщений
NMEA протокол описывает большой список различных сообщений, из которых можно выделить два десятка сообщений, активно использующихся в навигационной аппаратуре. В связи с большой популярностью и простой представления данных, NMEA протокол нашел применение не только морской аппаратурой, но и в геодезических, бытовых и авиационных GPS приемниках.
- AAM - Прибытие в путевую точку
- ALM - Данные альманаха
- АPA - Данные автопилота «А»
- APB - Данные автопилота «В»
- BOD - Азимут на пункт назначения
- DTM - Используемый датум
- GGA - Информация о фиксированном решении
- GLL - Данные широты и долготы
- GSA - Общая информация о спутниках
- GSV - Детальная информация о спутниках
- MSK - Передача управлению базовому приемнику
- MSS - Статус базового приемника
- RMA - Рекомендованный набор данных системы «Loran»
- RMB - Рекомендованный набор навигационных GPS данных
- RMC - Рекомендованный минимальный набор GPS данных
- RTE - Маршрутная информация
- VTG - Вектор движения и скорости
- WCV - Данные скорости вблизи путевой точки
- WPL - Данные путевой точки
- XTC - Ошибка отклонения от трека
- XTE - Измеренная ошибка отклонения от трека
- ZTG - UTC время и оставшееся время до прибытия в точку назначения
- ZDA - Дата и время.
Некоторые из NMEA сообщений могут содержать одинаковые поля данных, либо полностью содержать данные других, меньших по размеру, NMEA сообщений.
Содержание
NMEA сообщений
GGA - информация о фиксированном решении.
Самое популярное и наиболее используемое NMEA сообщение с информацией о текущем фиксированном решении - горизонтальные координаты, значение высоты, количество используемых спутников и тип решения.
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,*47
где:
- GGA - Заговолок
- 123519 -UTC время 12:35:19
- 4807.038, N - Широта, 48 градусов 7.038 минуты северной широты
- 01131.000, Е - Долгота, 11 градусов 31.000 минуты восточной долготы
- 1 - тип решение, StandAlone решение
- 0 - нет решения,
- 1 - StandAlone,
- 2 - DGPS,
- 3 - PPS,
- 4 - фиксированный RTK,
- 5 - не фиксированный RTK,
- 6 - использование данных инерциальных систем,
- 7 - ручной режим,
- 8 - режим симуляции
- 08 - количество используемых спутников
- 0.9 - геометрический фактор, HDOP
- 545.4, М - высота над уровнем моря в метрах
- 46.9, М - высота геоида над эллипсоидом WGS 84
- [пустое поле] - время прошедшее с момента получения последней DGPS поправки. Заполняется при активизации DGPS режима
- [пустое поле] - идентификационный номер базовой станции. Заполняется при активизации DGPS режима.
GSA - общая информация о спутниках.
Это NMEA сообщение содержит список спутников, используемых в подсчете позиции и значения геометрических факторов DOPs, определяющих точность подсчете позиции. Параметры DOP определяются геометрическим расположением спутников на небе. Чем лучше «распределены» на небе спутники, тем меньше DOP и тем лучше точность позиции. Минимальное значение PDOP (= 1) соответствует ситуации, когда один спутник находится строго над пользователем, а другие 3 равномерно распределены вокруг на уровне горизонта. Значение PDOP вычисляется, как квадратный корень из суммы квадратов HDOP и VDOP.
$GPGSA,A,3,04,05,09,12,24,2.5,1.3,2.1*39
где:
- GSA - заголовок
- А - тип выбора между 2D и 3D решениями, Автоматический (A-auto, M-manual)
- 3 - тип решения, 3D решение (1 - нет решения, 2 - 2D решение, 3 - 3D решение)
- 04,05… - PRN коды используемых в подсчете позиции спутников (12 полей)
- 2.5 - пространственный геометрический фактор, PDOP
- 1.3 - горизонтальный геометрический фактор, HDOP
- 2.1 - вертикальный геометрический фактор, VDOP
GSV - Детальная информация о спутниках
Это NMEA сообщение содержит детальную информацию для всех отслеживаемых навигатором GPS спутников. Исходя из ограничения в 80 символов в составе одного NMEA сообщения могут передаваться данные только для 4-х спутников. Соответственно для 12 спутников требуется 3 сообщения GSV.
Поле SNR (Signal to Noise Ration) содержит значения уровней, принимаемых со спутников, навигационных сигналов. Теоретически его значение может варьироваться от 0 до 99 и измеряется в dB. Фактически уровень сигнала лежит в диапазоне 25 …35 dB. Здесь стоит отметить, что данный параметр не является абсолютным и не подходит для сравнения чувствительности приемников разных моделей и производителей. В GPS навигаторах могут использоваться различные алгоритмы вычисления уровня принимаемого сигнала, что приводит к разным результатам при равной степени чувствительности приемников.
Для каждого видимого GPS спутника передается набор информации, включающий уровень сигнала, угол возвышения и азимут спутника. Количество этих «наборов» определяется общем количеством видимых спутников, значение которого передается в отдельном поле.
$GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75
где:
- GSV - заголовок
- 2 - количество сообщений GSV в пакете
- 1 - номер сообщения в пакете (от 1 до 3)
- 08 - количество видимых спутников
- 01 - номер спутника
- 40 - угол возвышения, в градусах
- 083 - азимут в градусах
- 46 - SNR, уровень сигнала
RMC - рекомендованный минимальный набор
GPS данных
Это NMEA сообщение содержит весь наборы, так называемых «PVT» данных. «PVT» - общепринятое сокращение от «position, velocity, time» (позиция, скорость, время).
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
- RMC - заголовок
- 123419 - UTC время, 12:34:59
- А - статус (А- активный, V- игнорировать)
- 4807.038,N - Широта, 48 градусов 07.038 минут северной широты
- 01131.000,Е - Долгота, 11 градусов 31.000 минута восточной долготы
- 022.4 - Скорость, в узлах
- 084.4 - Направление движения, в градусах
- 230394 - Дата, 23 марта 1994 года
- 003.1,W - Магнитные вариации
GLL - данные широты и долготы
NMEA сообщение со значением координат широты и долготы, и времени когда было вычислено это решение.
$GPGLL,4916.45,N,12311.12,W,225444,A,*31
- GLL - заголовок
- 4916.46,N - широта, 49 градусов 16.45 минут северной широты
- 12311.12,W-долгота, 123 градуса 11.12 минут западной долготы
- 225444 - Время фиксации в шкале времени UTC, 22:54:44
В
OD - Азимут на пункт назначения
Это NMEA сообщение указывает азимут на точку назначения в режиме навигации.
$GPBOD,045.,T,023.,M,DEST,START*01
- BOD - заголовок
- 045.,T - истинное направление на точку
- 023.,M - магнитное направление на точку
- DEST - идентификационный номер конечной точки
- START - идентификационный номер начальной точки
$GPRMB,A,0.66,L,003,004,4917.24,N,12309.57,W,001.3,052.5,000.5,V*20
- RMB - заголовок
- А - Тип данных, (А - активные, V - игнорировать)
- 0.66,L - отклонение от трека. Параметра определен в морских милях. (L -влево, R-вправо)
- 003 - идентификационный номер начальной точки
- 004 - идентификационный номер конечной точки
- 4917.24,N - значение широты конечной точки, 49 градусов 17.24 минуты северной широты
- 12309.57,W - значение долготы конечной точки, 123 градуса 09.57 минут западной долготы
- 001.3 - расстояние до точки, в морских милях
- 052.5 - направление на точку
- 000.5 - скорость, в узлах
- V - информация о прибытии (А - прибытие, V - точка еще не достигнута)
RTE - Маршрутная информация
NMEA сообщение RTE выводит список путевых точек активного маршрута. Есть два типа сообщений RTE. В первом случае, отображаются все точки маршрута. Во втором, только список оставшихся точек, которые еще предстоит посетить при движении по маршруту. Учитывая, что в NMEA протоколе есть ограничение, по которому длина сообщение не должна превышать 80 символов, сообщение RTE может состоять из нескольких строк.
$GPRTE,2,1,c,0,W3IWI,DRIVWY,32CEDR,32-29,32BKLD,32-I95,32-US1,BW-32,BW-198*69
- RTE - заголовок
- 2 - общее количество сообщений для отображения полного списка данных
- 1 - номер сообщения из общего списка
- с - тип RTE сообщения (с - полный список точек маршрута, w - список точек, которые еще предстоит посетить)
- 0 - идентификатор маршрута
- W3IWI,DRIVWY,.. - список путевых точек
Особенности Garmin
Приемники Garmin поддерживают большинство сообщений NMEA, содержащие GPS измерения, координаты и время - GGA, GLL, GSA, GSV, RMC. А также навигационные сообщения - RMB, BOD
Для вывода этих сообщений необходимо в настройках приемника изменить интерфейс с «Garmin» на «NMEA» и возможно установить нужную скорость. Эту же скорость необходимо установить в навигационной программе в настройках последовательного порта к которому подключается навигатор.
К сожалению, приемники с USB -портом не поддерживают NMEA протокол, ограничивая его настройки только протоколом «Garmin»
Для вывода информации поступающей в последовательный порт компьютера можно воспользоваться терминальной программой Windows, либо одной из навигационных программ поддерживающих такую возможность.
Ниже представлен список NMEA сообщений приемника Garmin eMap, которые содержаться в составе одной эпохи.
$GPRMC,135412,A,5522.8973,N,03710.1401,E,0.0,0.0,190507,9.3,E,A*1F
$GPRMB,A,,A,A*0B
$GPGGA,135412,5522.8973,N,03710.1401,E,1,04,5.4,205.2,M,15.8,M,*4A
$GPGSA,A,3,08,13,23,25,5.7,5.4,1.0*3C
$GPGSV,3,1,11,02,15,267,00,03,11,085,45,04,05,236,00,08,39,233,00*77
$GPGSV,3,2,11,10,32,308,00,13,63,109,43,16,17,037,00,23,31,111,38*77
$GPGSV,3,3,11,24,09,343,00,25,66,077,44,27,69,229,00*46
$GPGLL,5522.8973,N,03710.1401,E,135412,A,A*43
$GPBOD,T,M,*47
$PGRME,19.1,M,15.2,M,25.3,M*15
$ PGRMZ,673, f,3*19
$ PGRMM, WGS 84*06
В дополнение к стандартным NMEA сообщениям, в приемниках Garmin реализован собственный набор сообщений, каждое из которых в заголовке содержит префикс «GRM», идентификатор «М» или «Z», определяющий тип данных, и один символ для названия.
PGRME - оценка ошибки позиционирования
$PGRME,15.0,M,45.0,M,25.0,M*1C
- 15.0,М - оценка горизонтальной ошибки позиционирования, в метрах
- 45.0,М - оценка вертикальной ошибки, в метрах
- 25.0,М - эквивалентная сферическая ошибка позиционирования
PGRMZ - измерения высоты
$PGRMZ,93,f,3*21
- 93,f - значение высоты, в фунтах
- 3 - условия измерения позиции (2 - высота, определенная пользователем, 3 - высота, вычисленная GPS)
PGRMM - текущий датум
$PGRMM,NAD27 Canada*2F
- NAD27 Canada - название текущего горизонтального датума
Особенности Sirf
GPS чипы компании «Sirf» используются в различном навигационном GPS оборудовании, начиная от обычных плат, заканчивая портативными и автомобильными GPS навигаторами. Но в отличие от навигаторов, они поддерживают только NMEA сообщения связанные с GPS измерениями, вычислением позиции и времени - GGA, GLL, GSA, GSV, RMC, VTG, ZDA.
«Sirf» поддерживает также несколько «входящих» NMEA сообщений, предназначенных для конфигурации и настройки различных параметров. В дополнение, в «Sirf» реализован собственный бинарный протокол, который позволяет изменить значительно больше настроек. Эти 5 «входящих» NMEA сообщений в соответствии с правилами начинают с префикса $PSFR. Все сообщения содержат фиксированный набор данных и заканчиваются символом «n» (перевод строки)
Для конфигурации параметров «Sirf» используется специальная программа «SirfTech». Настройка параметров NMEA сообщение осуществляется в отдельном пункте меню.
$GPGGA,100643.000,5522.9036,N,03710.1282,E,1,07,1.6,209.9,M,14.9,M,0000*52
$GPGSA,A,3,31,01,23,20,11,30,14,2.1,1.6,1.4*35
$GPGSV,3,1,12,20,84,187,41,01,49,067,46,23,46,238,45,31,45,073,50*7B
$GPGSV,3,2,12,11,25,194,34,13,16,240,04,15,319,30,17,14,273,21*7A
$GPGSV,3,3,12,30,10,026,33,14,05,063,22,05,04,009,25,25,03,195,*7F
$GPRMC,100643.000,A,5522.9036,N,03710.1282,E,0.16,119.11,200507,*0D
Как видно из приведенного примера, «заводские» установки содержат меньшее количество NMEA сообщений по сравнению с настройками Garmin. При необходимости этот набор можно расширить, установив период в недостающих NMEA сообщений.
$GPGGA,100833.000,5522.9076,N,03710.1270,E,1,07,1.3,222.4,M,14.9,M,0000*53
$GPGLL,5522.9076,N,03710.1270,E,100833.000,A*34
$GPGSA,A,3,31,01,23,20,11,30,17,2.1,1.3,1.6*31
$GPGSV,3,1,12,20,84,180,43,01,49,067,47,23,47,238,45,31,45,072,49*77
$GPGSV,3,2,12,11,24,193,26,13,16,240,26,04,15,319,24,17,13,273,31*78
$GPGSV,3,3,12,30,10,025,26,14,04,064,22,25,04,195,05,04,008,21*7C
$GPRMC,100833.000,A,5522.9076,N,03710.1270,E,0.18,4.86,200507,*00
$GPVTG,4.86,T,M,0.18,N,0.3,K*60
$GPZDA,100834.000,20,05,2007,*5A
PSFR100, PSFR102 - конфигурация последовательных портов
NMEA сообщение под номером 100 служит для установки порта А, сообщение 102 - порта В. Сообщение 100 имеет дополнительное поле, которое позволяет переключить интерфейс в бинарный Sirf протокол.
Соответственно, в бинарном протоколе существует команда, которая переключает порт обратно в NMEA формат. Прежде чем переключится в бинарный протокол, необходимо понять, если ли программа которая в дальнейшем позволит восстановить NMEA протокол.
$PSRF100,0,9600,8,1,0*0C
$PSRF102,9600,8,1,0*3C
- PSRF100 - заголовок
- 0 - параметр, указывающий в каком режиме был изменен протокол (0-Sirf, 1-NMEA)
- 9600 - скорость порта (4800, 9600, 19200, 38400)
- 8 - биты данных (7, 8)
- 1 - стоп-биты (0,1)
- 0 - парность (0 - нет, 1-нечетная, 2-четная)
PSFR101, PSFR104 - инициализация параметров приемника
NMEA сообщения под номерами 101 и 104 предназначены для инициализации параметров, предназначенных для GPS приема. Определение этих параметров может ускорить время захвата GPS спутников. Сообщение 101 устанавливает текущие координаты в формате XYZ, сообщение 104 - в формате BLH (долгота, широта).
$PSRF101,-2686700,-4304200,3851624,95000,497260,921,12,3*22
$PSRF104,37.3875111,-121.97232,0,95000,237759,922,12,3*3A
- PSRF101 - заголовок
- 37.3875111 - широта в градусах
- -121.97232 - долгота в градусах
- 0 - высота, в метрах
- 95000 - сдвиг часов
- 237759 - GPS время, в секундах
- 922 - номер GPS недели
- 12 - количество каналов
- 3 - тип инициализации данных (1 - горячий старт, 2 - теплый старт, 3 - инициализация данных, 4 - холодный старт с полной очисткой данных, 8 - холодный старт с восстановлением заводских настроек)
PSFR103 - конфигурация генерации NMEA сообщений
Это NMEA сообщение позволяет установить или запросить период генерации каждого «исходящего» NMEA сообщения.
$PSRF103,05,00,01,01*20
- PSRF103 - заголовок
- 05 - название сообщения
- 00 - GGA
- 01 - GLL
- 02 - GSA
- 04 - RMS
- 05 - VTG
- 00 - режим (0 - установка периода, 1 - запрос)
- 01 - период, в секундах (0-255)
- 01 - наличие чексуммы (0- да, 1 - нет)
Результаты эксперимента
В условия нормальной видимости спутников, приемник Garmin eMap выдает следующий набор NMEA сообщений:
$GPRMC,104644,A,5522.8965,N,03710.1389,E,0.0,0.0,200507,9.3,E,A*16
$GPRMB,A,,A,A*0B
$GPGGA,104644,5522.8965,N,03710.1389,E,1 ,07 ,1.2,186.6,M,15.8,M,*44
$GPGSA,A,3,01,04,13,16,20,23,31,2.1,1.2,1.7*35
$GPGSV,3,1,10 ,01,34,070,48,04,28,311,40,11,10,190,00,13,32,249,41*7E
$GPGSV,3,2,10 ,16,11,111,40,20,68,142,50,23,64,247,49,25,21,196,00*70
$GPGSV,3,3,10 ,30,05,012,00,31,36,055,52*7D
$GPGLL,5522.8965,N,03710.1389,E,104644,A,A*40
$GPBOD,T,M,*47
$PGRME,6.0 ,M,7.7,M,9.8,M*29
$PGRMZ,612,f,3*1E
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
Из анализа сообщений видно, что в на текущий момент приемником отслеживается 10 (GSV) спутников, из которых 7 (GGA) используются в подсчете позиции. Горизонтальная ошибка позиционирования при этом равняется 6 метрам (RME), а индикатор типа решения - 1 (GGA)
Если создать условиях, при которых GPS сигнал не будет приниматься, то сообщения GGA будут содержать «пустые» поля, а индикатор типа решения примет значение 0 (GGA)
$GPGGA,0 ,00,M,M,*66
$GPGSA,A,1,,*1E
В «нормальном» режиме сообщения RMB и BOD содержат пустые поля. После того, как в качестве конечной точки назначения была выбрана путевая точка «Дорога», эти поля «наполнились» данными. Как следует из анализа сообщение, расстояние до точки - 1.620 миль, азимут движения - 6.3 градуса (BOD). При этом, азимут сообщений BOD и RMB отличается на 0.1 градус.
$GPRMB,A,0.00,R,Дорога ,5524.501,N,03710.445,E,1.620 ,6.4 ,V,A*59
$GPBOD,6.3 ,T,357.0,M,Дорога,*74
После того, как для навигации был выбран маршрут «Home» в списке сообщения RTE отобразился список всех путевых точек маршрута. А в сообщении RMВ - идентификационные номера начальной и конечной (очередной) точек маршрута.
$GPRTE,1,1,c,HOME,SLOBODA,IERUSALIM,INSTITUT*01
$GPRMB,A,9.99,R,SLOBOD,IERUSAL,5555.237,N,03649.976,E,34.346,340.6,V,A*1F
Заключение
В большинстве случаев, пользователю не нужно, да и не интересно знать, какие данные и в каких полях передаются. Большинство навигационных программ «разбирают» данные NMEA сообщений и представляют их в удобном для пользователя виде - графики, схемы, таблицы и т.п.
Особый интерес представляют NMEA сообщения для пользователей, которые хотели бы провести исследования GPS данных, вычислить оценку полученных измерений, либо проанализировать поведения навигационных приемников в различных условиях. Есть целый ряд программ, с помощью которых можно решать эти задачи.
Н о все же, для глубокого анализа GPS данных, формат NMEA не предназначен, так как не содержит так называемые «сырые» измерения - псевдодальности, фазы, допплер. Каждый производитель навигационной аппаратуры имеет свой «открытый» или «закрытый» протокол, который выводит эту информацию
NMEA - это простой и понятный формат, который позволяет не только обеспечить обмен данными между GPS приемниками и навигационными программами, но и дает пользователям некоторое представление о принципах работы спутниковой навигационной аппаратуры