Компонент · Датчик
Модуль GPS NEO-6M
NEO-6M передаёт абсолютное положение уличного робота по последовательному порту. Как читать NMEA, почему HDOP важнее точности и для чего модуль не подходит.
Что это такое
Приёмник GNSS — микросхема, принимающая сигналы времени от группировки спутников и определяющая собственное положение по разности времени их прихода. NEO-6M — модуль, с которым большинство хобби-роботов сталкивается первым: приёмник u-blox, керамическая планчатая антенна и последовательный порт.
Это единственный датчик робота, сообщающий абсолютное положение. Все остальные устройства на сайте — энкодеры, IMU, массив датчиков отражения — измеряют изменение или локальную особенность. GPS ограничивает накопление погрешности одометрии, поэтому уличному роботу можно задать цель за километр.
Как это работает
С модулем не нужно вести диалог: он сам передаёт данные со скоростью 9600 baud в виде предложений NMEA 0183 — по одной строке через запятую на сообщение, несколько раз в секунду.
Два из них содержат всё необходимое роботу:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,... fix quality, sats, HDOP
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,... validity, position, speed, course
Считайте координаты, затем проверяйте их пригодность. Поле состояния RMC содержит A для активного решения или V для недействительного, а качество решения в GGA равно 0 при его отсутствии: в обоих случаях строка всё равно содержит правдоподобные координаты. Поле HDOP выявляет более тонкий отказ: оно описывает геометрию спутников, и при плохой геометрии уверенный ответ может отличаться на десятки метров.
Широта приходит в градусах и десятичных минутах (4807.038 — это 48° 07.038′), а не в градусах. Преобразуйте один раз, а затем ещё раз в метры относительно фиксированного начала отсчёта — расчёт приведён здесь — и весь последующий код будет работать в единицах, понятных контроллеру.
Когда его следует использовать
Используйте модуль, когда робот работает на улице на расстояниях больше, чем допускает накопление ошибки одометрии: робот с опорными точками, газонокосилка, геодезическая платформа, сельскохозяйственный робот. Грубо говоря, после тридцати m пути только счисление уже накапливает больше ошибки, чем содержит решение GPS.
Не используйте его в помещении. И не используйте для точности: 2.5 m — большое расстояние для робота шириной 30 cm. GPS сообщает, в какой части поля вы находитесь; энкодер колеса — где находитесь вы в пределах метра от неё. Используйте оба источника с объединением данных.
Путь улучшения по соотношению ценности: сначала более высокая частота обновления (5 или 10 Hz устраняет большую часть устаревания), затем мультиконстелляционный модуль (GPS вместе с GLONASS или Galileo улучшает геометрию, а значит HDOP), и только потом RTK, обеспечивающий сантиметровую точность, но требующий базовой станции, канала данных и другого бюджета.
Распространённые ошибки
- Холодный старт занимает минуты, а не секунды. Без альманаха приёмник загружает его со спутников со скоростью 50 бит в секунду. Робот, который при первом включении на улице выглядит неработающим, обычно просто ждёт.
- У него нет курса. Только положение. Сочетайте его с магнитометром или гироскопом; курс по земле не имеет смысла примерно ниже 1 m/s.
- 5 V на RX убивает модули 3.3 V. Проверьте, преобразует ли уровни ваша плата расширения. TX модуля на плату 5 V подходит.
- Антенне нужно не просто поле зрения, а небо. Металл над ней, включая собственную платформу робота, ухудшает видимость спутников. Установите её сверху, горизонтально, направленной вверх.
- Никогда не следуйте непосредственно по сырым решениям. Считайте путь между ними и корректируйте по каждому; прямое следование увеличивает ошибку отслеживания на порядок и учетверяет усилие рулевого управления.
- Шесть знаков после запятой соответствуют 11 cm — и это больше, чем может хранить
float. Преобразуйте координаты в метры относительно начала задания, а не выполняйте арифметику над сырыми градусами.
Расположение выводов и подключение
| Вывод | Название | Назначение |
|---|---|---|
| 1 | VCC | 3.3–5 V. Проверьте, регулирует ли напряжение ваша плата расширения — многие NEO-6M это делают |
| 2 | RX | Модуль принимает конфигурацию. На исходном модуле логика 3.3 V |
| 3 | TX | Модуль передаёт NMEA. Безопасен для входа 5 V |
| 4 | GND | Земля |
| 5 | PPS | Один импульс в секунду, синхронизированный со временем GPS. Большинство проектов игнорирует |
| GPS | Arduino Uno | Примечание |
|---|---|---|
| VCC | 5 V | Если на плате есть регулятор; иначе 3.3 V |
| GND | GND | |
| TX | Вывод 4 (SoftwareSerial RX) | Модуль говорит, плата слушает |
| RX | Вывод 3 через делитель | Нужен только для настройки модуля |
Вывод RX можно полностью оставить неподключённым. В состоянии по умолчанию GPS-модуль сам передаёт NMEA со скоростью 9600 baud, и роботу, который читает только положение, этого достаточно. Подключайте RX, лишь когда требуется повысить частоту обновления или отключить неиспользуемые сообщения.
Чтение без библиотеки
#include <SoftwareSerial.h>
SoftwareSerial gps(4, 3); // RX from module TX, TX to module RX
char line[100];
uint8_t len = 0;
void setup() {
Serial.begin(115200);
gps.begin(9600);
}
void loop() {
while (gps.available()) {
char c = gps.read();
if (c == '\n') {
line[len] = '\0';
if (strncmp(line, "$GPRMC", 6) == 0) handleRmc(line);
len = 0;
} else if (len < sizeof(line) - 1) {
line[len++] = c;
}
}
}
void handleRmc(char *s) {
// $GPRMC,time,status,lat,N/S,lon,E/W,speed,course,date,...
char *field[13] = {nullptr};
uint8_t n = 0;
for (char *tok = strtok(s, ","); tok && n < 13; tok = strtok(nullptr, ",")) field[n++] = tok;
if (n < 7 || field[2][0] != 'A') return; // 'V' = void. Coordinates are still present
// and still meaningless. Gate on this.
Serial.print(toDegrees(field[3], field[4][0]), 6);
Serial.print(' ');
Serial.println(toDegrees(field[5], field[6][0]), 6);
}
// NMEA gives ddmm.mmmm — degrees and DECIMAL MINUTES, not decimal degrees.
double toDegrees(const char *ddmm, char hemisphere) {
double raw = atof(ddmm);
int deg = (int)(raw / 100);
double minutes = raw - deg * 100;
double result = deg + minutes / 60.0;
return (hemisphere == 'S' || hemisphere == 'W') ? -result : result;
}
Две важнейшие строки — те, которые обычно пропускают.
field[2][0] != 'A' проверяет пригодность решения. Приёмник без решения продолжает выдавать полностью сформированные строки RMC с координатами — обычно последнее известное положение или нули. Код без проверки флага уверенно направит робот в середину Атлантики, то есть в точку 0°N 0°E.
toDegrees существует потому, что 4807.038 — это не 4807.038 градуса и даже не 48.07038 градуса. Это 48° 07.038′, то есть 48.1173°. Обработка координат NMEA как десятичных градусов — самая распространённая ошибка GPS; она настолько велика, что её сразу видно, и это единственное её преимущество.
Для реальных проектов используйте TinyGPS++: он обрабатывает все типы сообщений, контрольные суммы и пограничные случаи. Ручную реализацию выше стоит один раз запустить, чтобы понимать её работу.
Точность: что на самом деле означают числа
| Показатель | Типичный NEO-6M | Что означает |
|---|---|---|
| Горизонтальная точность | ~2.5 m CEP | Половина решений попадает в радиус 2.5 m, половина — нет |
| Частота обновления | По умолчанию 1 Hz, настраивается до 5 Hz | При 1 m/s решение с частотой 1 Hz к моменту чтения устаревает до метра |
| Холодный старт | ~27 s, минуты без альманаха | Ничего не сломано; идёт загрузка со скоростью 50 бит в секунду |
| Горячий старт | ~1 s | Резервное питание сохраняет альманах |
| Точность скорости | ~0.1 m/s | Действительно хорошее значение — лучше, чем для положения |
CEP — медиана, а не верхняя граница. Половина решений хуже 2.5 m, а возле зданий длинный хвост распределения. Для робота шириной 30 cm «где-то в пределах нескольких m» — это не положение, а район.
HDOP — поле, за которым стоит следить. Оно описывает геометрию спутников, а не качество сигнала, и именно оно даёт уверенный ответ с ошибкой в десятки метров:
| HDOP | Качество | Использовать? |
|---|---|---|
| < 1 | Идеальное | Да |
| 1–2 | Отличное | Да |
| 2–5 | Хорошее | Да, с осторожностью |
| 5–10 | Среднее | Только как медленная коррекция |
| > 10 | Плохое | Отклонить решение |
Проверяйте HDOP так же, как флаг пригодности. Решение с HDOP 12 не является решением; это догадка с десятичной точкой.
Статический дрейф и почему он важен
Оставьте GPS-модуль неподвижным на десять минут и записывайте каждое решение. Получится облако размером в несколько m, хотя ничего не двигалось.
Это самое важное, что стоит увидеть самостоятельно до написания кода навигации, потому что это объясняет, почему следование непосредственно по сырым решениям бесполезно. Регулятор, получающий такое облако, пытается его догнать, и робот непрерывно колеблется, почти не продвигаясь. Если счислять путь по энкодерам между решениями, а каждое решение использовать только для коррекции медленного дрейфа, тот же регулятор ведёт ровно — числа приведены в руководстве по навигации по опорным точкам.
Настройка модуля
Повышение частоты обновления — самое полезное изменение, и его стоит выполнить до всего остального. Модули u-blox принимают двоичные команды UBX:
// UBX-CFG-RATE: 200 ms measurement period -> 5 Hz
const uint8_t setRate5Hz[] = {
0xB5, 0x62, 0x06, 0x08, 0x06, 0x00,
0xC8, 0x00, // 200 ms
0x01, 0x00, // one measurement per solution
0x01, 0x00, // align to GPS time
0xDE, 0x6A // checksum
};
void setup() {
gps.begin(9600);
delay(100);
gps.write(setRate5Hz, sizeof(setRate5Hz));
}
При 5 Hz ограничением становится 9600 baud: полный набор предложений NMEA не помещается в 200 ms. Либо повысьте baud до 38400, либо отключите неиспользуемые сообщения, особенно GSV, которое наиболее объёмно и сообщает детали спутников, не нужные роботу.
Обратите внимание: на NEO-6M конфигурация не сохраняется без резервного питания модуля. Отправляйте её при каждом запуске.
Диагностика
| Симптом | Вероятная причина | Исправление |
|---|---|---|
| Данных нет вообще | TX/RX не пересечены или неверная скорость в бодах | TX модуля → RX платы; сначала попробовать 9600 |
| Данные приходят, но решения нет | Помещение | GPS нужно небо. Окна обычно недостаточно |
| Первое решение занимает минуты | Холодный старт без альманаха | Обычно; подождать на улице с открытым небом |
| Положение 0, 0 | Используется недействительное решение | Проверять флаг состояния RMC A |
| Положение сильно неверно | ddmm.mmmm обрабатывается как градусы | Преобразовать: deg + minutes/60 |
| Положение скачет на несколько m | Обычный шум приёмника | Ожидаемо; объединить с одометрией и не следовать непосредственно по сырым решениям |
| Решение уверенное, но сильно смещено | Плохая геометрия спутников | Отклонять решения с HDOP выше ~5 |
| Спутников меньше ожидаемого | Антенна перекрыта | Установить сверху, направленной вверх и вдали от платформы |
| Модуль нагрелся и вышел из строя | 5 V на вывод RX 3.3 V | До подключения проверить преобразование уровней на плате |
| Работает на 5 Hz, затем останавливается | 9600 baud не передаёт все сообщения | Повысить скорость в бодах или отключить GSV |
Выбор модуля
| Модуль | Констелляции | Частота | Примечание |
|---|---|---|---|
| NEO-6M | GPS | 1–5 Hz | Дешёвый вариант по умолчанию. Стареет, но встречается повсеместно |
| NEO-M8N | GPS + GLONASS + Galileo | до 10 Hz | Лучше геометрия и HDOP — разумное улучшение |
| NEO-M9N | Возможность работы в нескольких диапазонах | до 25 Hz | Заметно лучше в городских условиях |
| ZED-F9P (RTK) | Несколько диапазонов | 20 Hz | Сантиметровая точность с базовой станцией и каналом данных |
Путь улучшения стоит проходить по порядку. Более высокая частота обновления устраняет большую часть устаревания и ничего не стоит. Мультиконстелляционный приёмник видит больше спутников, улучшая геометрию и, следовательно, HDOP; это большее реальное улучшение, чем предполагает значение точности, особенно возле зданий. RTK обеспечивает сантиметровую точность и меняет возможности робота, который должен следовать по линии в поле, но требует базовой станции, канала поправок и примерно в десять раз большего бюджета.
Одна вещь недоступна GPS-модулю по любой цене: курс в неподвижном состоянии. Курс по земле выводится из последовательных положений, поэтому примерно ниже 1 m/s он является шумом, а при нулевой скорости лишён смысла. Роботу, которому нужно знать направление взгляда, нужен магнитометр или гироскоп независимо от качества GPS.
Исследуйте граф
Используется в этих сборках
Проекты, учебные пути и симуляторы, в которых используется Модуль GPS NEO-6M.
Вопросы
Модуль GPS NEO-6M: частые вопросы
Насколько на самом деле точен NEO-6M?
Около 2.5 метра в половине случаев при открытом небе и хорошей геометрии спутников. Это значение из технического описания и оптимистичное для робота возле здания или под деревьями. Важно, что вместо явного отказа он выдаёт уверенные неверные ответы, поэтому принимайте каждое решение по координатам только при хорошем качестве решения и допустимом HDOP, а не потому, что сообщение успешно разобрано.
Что такое HDOP и почему это важнее значения точности?
Горизонтальное размытие точности описывает геометрию видимых спутников. Разнесённые по небу спутники дают решение с хорошей обусловленностью; сгруппированные — с плохой, хотя приёмник всё равно сообщает положение с полной уверенностью. HDOP ниже 2 — хороший, выше примерно 2.5 — основание отклонить решение. Это самое полезное поле в предложении GGA, но его почти никто не проверяет.
Может ли модуль GPS указать, в какую сторону смотрит робот?
Нет. Решение определяет положение, и неподвижный робот, направленный на север, получает такое же решение, как направленный на юг. Курс по земле вычисляется по последовательным положениям, поэтому имеет смысл только при действительном движении: примерно ниже 1 метра в секунду он в основном является шумом. Уличные роботы сочетают GPS с магнитометром для абсолютного курса, гироскопом для кратковременного курса или с обоими датчиками.
Почему мой робот колеблется при следовании к точкам GPS?
Потому что решение с частотой 1 Hz одновременно устаревшее и шумное, а алгоритм следования по пути, получающий необработанные решения, делает рывок к каждой новой точке. При измерениях на одном маршруте с одним регулятором шум масштаба метра при частоте 1 Hz увеличивает среднеквадратичную (RMS) поперечную ошибку с 0.09 m до 1.25 m и в четыре с половиной раза повышает усилие рулевого управления. Исправление — вести счисление пройденного пути между решениями, а каждое новое решение использовать для коррекции оценки, а не для её замены.
Работает ли он в помещении?
Практически никогда, и это не дефект. Сигнал GPS-спутника приходит слабее теплового шумового порога и требует открытого неба; крыша его блокирует. Модули на подоконнике иногда захватывают сигнал и сообщают большие ошибки из-за многопутового распространения. Проверяйте на улице на открытом пространстве и закладывайте минуту на холодный старт, прежде чем считать что-то неисправным.
5 V или 3.3 V?
У большинства плат расширения есть регулятор, и VCC принимает 5 V, но логика самого модуля рассчитана на 3.3 V. Подача 5 V на RX платы без преобразования уровней — обычный способ вывести модуль из строя. Проверьте свою плату и при необходимости подключите RX через делитель: выход TX модуля на микроконтроллер 5 V допустим, поскольку 3.3 V превышает порог логического уровня AVR.
Дополнительные материалы