Сравнительная таблица протоколов
| Параметр | NMEA 0183 | UBX (u-blox) | PAIR/PQTM (Quectel) | Unicore (NovAtel) |
|---|---|---|---|---|
| Тип протокола | ASCII-текст | Бинарный | ASCII-текст | ASCII + бинарный (UNCB) |
| Человекочитаемость | Да | Нет (требует декодер) | Да | Смешанный |
| Размер пакета | Большой (200-500 байт) | Компактный (50-100 байт) | Средний (100-200 байт) | Средний/Большой |
| Скорость передачи | Ограничена объемом | Высокая | Средняя | Высокая (при бинарном) |
| Поддержка в ArduPilot | Полная | Полная + расширенные функции | Через NMEA | Через NMEA (ограниченно) |
| Конфигурация модуля | Ограничена | Полная | Зависит от версии | Полная (через утилиты) |
| Диагностика | Базовая | Расширенная | Средняя | Расширенная |
| Антиджамминг | Нет | AIC (автоматический) | Зависит от модели | Adaptive AIC + CRPA |
| RTK поддержка | Через RTCM | Нативная | Через RTCM | Нативная + многоконстелляционная |
| GPS Blending | Нет | Да | Нет | Через внешнюю логику |
| Совместимость | Универсальная | Только u-blox | Только Quectel/MTK | Только Unicore |
| LC29HAA | ✅ Да | ❌ Нет | ✅ Да | ❌ Нет |
| UM980 | ✅ Да | ❌ Нет | Нет | ✅ Да |
| u-blox F9P | ✅ Да | ✅ Да | ❌ Нет | Нет |
Поддерживаемые команды по модулям
| Команда | Назначение | LC29HAA | UM980 | u-blox F9P |
|---|---|---|---|---|
$PQTMCFGRA,W,N*XX | Частота обновления | ✅ 1/2/4 Гц | ❌ | ❌ |
$PAIR050,N*XX | Частота (расширенная) | ❌ | ❌ | ❌ |
$PAIR066,N*XX | Выбор созвездий | ❌ | ❌ | ❌ |
$PAIR074,N*XX | Антиджамминг | ❌ | ❌ | ❌ |
$PQTMSAVEPAR*5A | Сохранение в NVM | ✅ | ❌ | ❌ |
CONFIG GNSS | Выбор созвездий | ❌ | ✅ | ❌ |
CONFIG ANTJAM | Настройка антиджамминга | ❌ | ✅ | ❌ |
UBX-CFG-RATE | Частота обновления | ❌ | ❌ | ✅ |
UBX-CFG-MSG | Управление сообщениями | ❌ | ❌ | ✅ |
SAVECONFIG | Сохранение настроек | ❌ | ✅ | ❌ |
Что выбрать для европейской части РФ (без RTK)
| Задача | Рекомендуемый модуль | Протокол | Причина |
|---|---|---|---|
| Бюджетный квадрокоптер | LC29HAA | NMEA + PQTM | Достаточно 2 Гц, низкая цена, простая интеграция |
| Дальнобойный/картографический | UM980 | NMEA + Unicore | Многодиапазонный прием, лучше работа в условиях городской застройки |
| Помехозащищенный | UM982 + CRPA | Unicore | Адаптивный антиджамминг, работа в условиях РЭБ |
| Максимальная совместимость | u-blox F9P/F10 | UBX | Полная поддержка ArduPilot, UBX-протокол, документация |
| Гоночный дрон | UM980 или F9P | Unicore/UBX | Высокая частота обновления (10-50 Гц) |
⚠️ Важно: При использовании Quectel или Unicore с GPS_AUTO_CONFIG=0 убедитесь, что SERIALx_BAUD точно совпадает с настройками модуля — иначе ArduPilot не получит данные.
Содержание
- NMEA 0183
- UBX Protocol (u-blox)
- PAIR/PQTM (Quectel)
- Unicore Commands
- Практические примеры для ArduPilot
1. NMEA 0183
Структура сообщения
$<TalkerID><Sentence>,<Data1>,<Data2>,...*<Checksum><CR><LF>
Поля:
- $ — начало сообщения
- TalkerID (2 символа):
GP— GPSGL— GLONASSGN— Mixed (все системы)GB— BeiDouGA— Galileo- Sentence (3 символа) — тип сообщения
- Data — данные через запятую
- *XX — контрольная сумма (XOR)
- — конец строки (0x0D 0x0A)
Основные сообщения
GGA — GPS Fix Data (основные данные)
Пример:
$GNGGA,123519.000,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*6C
Расшифровка:
| Поле | Значение | Описание |
|---|---|---|
| 1 | 123519.000 | Время UTC (12:35:19) |
| 2 | 4807.038 | Широта (48°07.038′) |
| 3 | N | Северная (N/S) |
| 4 | 01131.000 | Долгота (11°31.000′) |
| 5 | E | Восточная (E/W) |
| 6 | 1 | Качество: 1=GPS, 2=DGPS, 0=No Fix |
| 7 | 08 | Количество спутников |
| 8 | 0.9 | HDOP (горизонтальное ухудшение) |
| 9 | 545.4 | Высота над уровнем моря (м) |
| 10 | M | Единицы: метры |
| 11 | 46.9 | Высота геоида |
| 12 | M | Единицы геоида |
Парсинг в Python:
def parse_gga(sentence):
parts = sentence.split(',')
return {
'time': parts[1],
'latitude': float(parts[2][:2]) + float(parts[2][2:])/60,
'lat_dir': parts[3],
'longitude': float(parts[4][:3]) + float(parts[4][3:])/60,
'lon_dir': parts[5],
'quality': int(parts[6]),
'satellites': int(parts[7]),
'hdop': float(parts[8]),
'altitude': float(parts[9])
}
RMC — Recommended Minimum Data
Пример:
$GNRMC,123519.000,A,4807.038,N,01131.000,E,0.00,237.6,140122,,,A*6B
Расшифровка:
| Поле | Значение | Описание |
|---|---|---|
| 1 | 123519.000 | Время UTC |
| 2 | A | Статус: A=Active, V=Void |
| 3 | 4807.038 | Широта |
| 4 | N | Направление широты |
| 5 | 01131.000 | Долгота |
| 6 | E | Направление долготы |
| 7 | 0.00 | Скорость (узлы) |
| 8 | 237.6 | Курс (градусы) |
| 9 | 140122 | Дата (14.01.2022) |
| 10 | Магнитное склонение | |
| 11 | Направление склонения | |
| 12 | A | Режим: A=Autonomous, D=DGPS |
GSV — Satellites in View (спутники в поле зрения)
Пример (4 сообщения):
$GPGSV,3,1,09,11,23,43,191,32,16,40,288,17,29,37,133,22,26,35,130,13*67
$GPGSV,3,2,09,12,54,321,25,15,67,089,31,18,12,045,28,21,78,234,19*65
$GPGSV,3,3,09,24,45,156,22*4D
Расшифровка:
| Поле | Значение |
|---|---|
| 1 | 3 — всего сообщений |
| 2 | 1 — номер текущего |
| 3 | 09 — всего спутников |
| 4 | 11 — PRN спутника 1 |
| 5 | 23 — угол места (elevation) |
| 6 | 43 — азимут |
| 7 | 191 — SNR (сигнал/шум) |
GSA — Active Satellites и DOP
Пример:
$GNGSA,A,3,04,05,06,16,18,22,24,10,12,14,15,,1.8,1.1,1.4*3E
Расшифровка:
| Поле | Значение |
|---|---|
| 1 | A — Auto selection |
| 2 | 3 — 3D fix |
| 3-14 | PRN активных спутников |
| 15 | 1.8 — PDOP |
| 16 | 1.1 — HDOP |
| 17 | 1.4 — VDOP |
Расчет контрольной суммы
def calculate_checksum(sentence):
"""Рассчитать XOR checksum для NMEA"""
# Убрать $ и *XX
if sentence.startswith('$'):
sentence = sentence[1:]
if '*' in sentence:
sentence = sentence.split('*')[0]
checksum = 0
for char in sentence:
checksum ^= ord(char)
return f"{checksum:02X}"
# Пример
msg = "GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M"
print(f"${msg}*{calculate_checksum(msg)}")
# Результат: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M*XX
2. UBX Protocol (u-blox)
Структура пакета UBX

Поля заголовка:
- Sync Char 1:
0xB5(181) - Sync Char 2:
0x62(98) - Class: Класс сообщения (1 байт)
- ID: Идентификатор сообщения (1 байт)
- Length: Длина payload (2 байта, Little Endian)
- Payload: Данные (переменная длина)
- CK_A, CK_B: Checksum (2 байта)
Классы сообщений
| Class | Hex | Описание |
|---|---|---|
| UBX-CFG | 0x06 | Configuration |
| UBX-NAV | 0x01 | Navigation |
| UBX-ACK | 0x05 | Acknowledge |
| UBX-MON | 0x0A | Monitoring |
| UBX-RXM | 0x02 | Receiver Manager |
Примеры сообщений
UBX-NAV-PVT — Position Velocity Time
Структура:
B5 62 01 07 58 00 ...payload 88 байт... CK_A CK_B
Payload (первые поля):
typedef struct {
uint32_t iTOW; // Time of week (ms)
uint16_t year; // Year
uint8_t month; // Month
uint8_t day; // Day
uint8_t hour; // Hour
uint8_t min; // Minute
uint8_t sec; // Second
uint8_t valid; // Validity flags
uint32_t tAcc; // Time accuracy estimate
int32_t nano; // Fraction of second
// ... еще поля
} UBX_NAV_PVT;
Полный пример (hex):
B5 62 01 07 58 00
14 1A 01 00 // iTOW = 69604 ms
E4 07 // year = 2020
01 // month = January
01 // day = 1
00 // hour = 0
00 // min = 0
10 // sec = 16
... // остальные поля
CK_A CK_B // checksum
UBX-CFG-MSG — Configure Message Rate
Команда для включения NAV-PVT на 1 Гц:
Отправка:
B5 62 06 01 08 00 01 07 01 00 01 00 00 00 18 99
Расшифровка:
B5 62— Sync06— Class CFG01— ID MSG08 00— Length = 8 bytes01 07— msgClass=0x01 (NAV), msgID=0x07 (PVT)01— rate on UART1 = 1 Hz00 00 00— rates on other ports = 018 99— Checksum
Python для расчета checksum UBX:
def ubx_checksum(payload):
"""Рассчитать checksum для UBX"""
ck_a = 0
ck_b = 0
for byte in payload:
ck_a = (ck_a + byte) & 0xFF
ck_b = (ck_b + ck_a) & 0xFF
return ck_a, ck_b
# Пример
msg = bytes([0x06, 0x01, 0x08, 0x00, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00])
ck_a, ck_b = ubx_checksum(msg)
print(f"Checksum: {ck_a:02X} {ck_b:02X}") # 18 99
UBX-CFG-RATE — Configure Update Rate
Установить 5 Гц (200 мс):
B5 62 06 08 06 00 C8 00 01 00 01 00 DE 6A
Расшифровка:
C8 00— measRate = 200 ms (0x00C8)01 00— navRate = 1 (каждое измерение)01 00— timeRef = 1 (UTC)
3. PAIR/PQTM (Quectel)
PAIR команды (MTK chipset)
Структура:
$PAIR<ID>,<param1>,<param2>,...*<Checksum>
$PAIR050 — Update Rate
Примеры:
$PAIR050,1*26 // 1 Hz (по умолчанию)
$PAIR050,5*23 // 5 Hz
$PAIR050,10*28 // 10 Hz
⚠️ Важно: На LC29HAA эта команда НЕ РАБОТАЕТ! Используйте $PQTMCFGRA.
$PAIR066 — GNSS Constellation
$PAIR066,0*26 // GPS only
$PAIR066,1*25 // GPS + GLONASS
$PAIR066,3*27 // GPS + GLONASS + Galileo + BeiDou
⚠️ Важно: На LC29HAA НЕ РАБОТАЕТ!
$PAIR074 — Anti-Jamming
$PAIR074,0*24 // Disable
$PAIR074,1*25 // Enable
PQTM команды (Quectel proprietary)
$PQTMCFGRA — Configure Rate
Примеры для LC29HAA:
$PQTMCFGRA,W,1*2D // 1 Hz
$PQTMCFGRA,W,2*2C // 2 Hz ✅ РАБОТАЕТ
$PQTMCFGRA,W,4*2E // 4 Hz
Структура:
$PQTMCFGRA— командаW— WriteN— частота (1/2/4)*XX— checksum
$PQTMSAVEPAR — Save Parameters
$PQTMSAVEPAR*5A
Сохраняет текущие настройки в NVM (неvolatile memory).
$PQTMSRR — Soft Reset
$PQTMSRR*4B
Перезагружает модуль.
Расчет checksum для PAIR/PQTM
def pair_checksum(sentence):
"""Рассчитать checksum для PAIR/PQTM команд"""
# Убрать $ и *
if sentence.startswith('$'):
sentence = sentence[1:]
checksum = 0
for char in sentence:
checksum ^= ord(char)
return f"{checksum:02X}"
# Примеры
print(f"$PAIR050,1*{pair_checksum('PAIR050,1')}") // $PAIR050,1*26
print(f"$PQTMCFGRA,W,2*{pair_checksum('PQTMCFGRA,W,2')}") // $PQTMCFGRA,W,2*2C
4. Unicore Commands
Структура команд Unicore
Unicore использует два формата:
- NMEA-like (ASCII):
$<CMD>,<params>*<checksum> - UNCB (Binary): бинарный протокол
Основные команды
CONFIG GNSS — Выбор созвездий
CONFIG GNSS GPS GLONASS
CONFIG GNSS GPS GLONASS GALILEO BEIDOU
SAVECONFIG
CONFIG ANTJAM — Anti-Jamming
CONFIG ANTJAM MODE AUTO // Адаптивный режим
CONFIG ANTJAM THRESHOLD -30 // Порог -30 dBm
CONFIG ANTJAM ENABLE
SAVECONFIG
LOG — Включение логирования
LOG GPGGA ONTIME 0.1 // GGA каждые 100 мс (10 Hz)
LOG GPRMC ONTIME 0.1
LOG RAWEPHEM ONCE // Эфемериды один раз
SAVECONFIG — Сохранение
SAVECONFIG
Сохраняет все настройки в энергонезависимую память.
Примеры Unicore UM980
Настройка на 10 Hz с GPS+GLONASS:
# Через терминал (115200 8N1)
UNLOGALL // Отключить все логи
LOG GPGGA ONTIME 0.1 // 10 Hz
LOG GPGLL ONTIME 0.1
LOG GPRMC ONTIME 0.1
CONFIG GNSS GPS GLONASS
SAVECONFIG
RESET // Перезагрузка
5. Практические примеры для ArduPilot
Настройка LC29HAA для квадрокоптера
1. Подключение:
LC29HAA Flight Controller
TX ----------- RX (Serial5)
RX ----------- TX (Serial5)
GND ----------- GND
5V ----------- 5V (или отдельное питание)
2. Отправка команд через QGNSS:
$PQTMCFGRA,W,2*2C // 2 Hz (достаточно для стабилизации)
$PQTMSAVEPAR*5A // Сохранить
$PQTMSRR*4B // Перезагрузка
3. Параметры ArduPilot:
# В Mission Planner (Full Parameter List)
GPS_TYPE = 2 # NMEA
GPS_AUTO_CONFIG = 0 # ⚠️ Обязательно отключить!
SERIAL5_PROTOCOL = 5 # GPS
SERIAL5_BAUD = 115200 # Скорость
GPS_RATE_MS = 500 # 2 Гц (500 мс)
GPS_GNSS_MODE = 0 # Использовать настройки модуля
GPS_SAVE_CFG = 0 # Не сохранять через ArduPilot
Настройка u-blox F9P (UBX protocol)
1. Через u-center:
- Откройте u-center
- View → Configuration View
- Message Rates:
- NAV-PVT: 1 Hz (или выше)
- NAV-HPPOSLLH: 1 Hz (для RTK)
- GNSS: выбрать GPS+GLONASS
- Save to flash
2. Параметры ArduPilot:
GPS_TYPE = 5 # UBX
GPS_AUTO_CONFIG = 1 # ✅ Можно включить (ArduPilot сам настроит)
SERIAL5_PROTOCOL = 5
SERIAL5_BAUD = 115200
GPS_RATE_MS = 100 # 10 Гц для RTK
GPS_GNSS_MODE = 0
Настройка Unicore UM980
1. Через терминал:
UNLOGALL
LOG GPGGA ONTIME 0.1 # 10 Hz
LOG GPRMC ONTIME 0.1
LOG GPGSA ONTIME 1 # 1 Hz
CONFIG GNSS GPS GLONASS
CONFIG ANTJAM MODE AUTO
SAVECONFIG
RESET
2. Параметры ArduPilot:
GPS_TYPE = 2 # NMEA
GPS_AUTO_CONFIG = 0 # ⚠️ Отключить
SERIAL5_PROTOCOL = 5
SERIAL5_BAUD = 115200 # Или 230400 для высоких частот
GPS_RATE_MS = 100 # 10 Гц
Скрипт для автоматической настройки LC29HAA
Python скрипт:
import serial
import time
def configure_lc29h(port='COM5', baud=115200):
ser = serial.Serial(port, baud, timeout=1)
time.sleep(2)
commands = [
b'$PQTMCFGRA,W,2*2C\r\n', # 2 Hz
b'$PQTMSAVEPAR*5A\r\n', # Сохранить
]
for cmd in commands:
print(f"Sending: {cmd.decode().strip()}")
ser.write(cmd)
time.sleep(0.5)
response = ser.readline()
print(f"Response: {response.decode().strip()}")
time.sleep(0.5)
# Перезагрузка
ser.write(b'$PQTMSRR*4B\r\n')
print("Module rebooting...")
ser.close()
# Использование
configure_lc29h('COM5')
Отладка и диагностика
1. Проверка связи:
$PAIR000*32 # Версия прошивки (LC29H)
2. Мониторинг в реальном времени:
- Откройте Mission Planner
- Status → HUD
- Смотрите GPS status:
GPS: OK— все хорошоGPS: No GPS— проверьте подключениеGPS: 3D Fix— есть фикс
3. Логирование:
LOG_BITMASK = 65535 # Включить все логи
После полета: DataFlash Log → Download
Анализ: смотрите GPS статус и HDOP
📚 Источники
- Quectel LC29H Protocol Specification
- u-blox UBX Protocol
- ArduPilot GPS Parameters
- NMEA 0183 Standard
- Unicore Documentation
⚠️ Важно:
- Всегда сохраняйте настройки командой сохранения (
$PQTMSAVEPAR,SAVECONFIG, etc.) - После сохранения делайте перезагрузку модуля
- При использовании с ArduPilot устанавливайте
GPS_AUTO_CONFIG=0для модулей Quectel и Unicore - Проверяйте контрольную сумму перед отправкой команд

