Урок 3. NMEA: градусы, минуты и почему нельзя делить на 100
Урок 3. NMEA: градусы, минуты и почему нельзя делить на 100
Паспорт урока
| Параметр | Значение |
|---|---|
| Место в модуле | BeaconRadio, модуль 2 «Физика и данные», урок 3 из 7 |
| Длительность | 45 мин |
| Возраст | 12–16 |
| Оборудование | GPS-модуль + монитор порта (либо распечатки строк NMEA), карта |
| Предварительные знания | Уроки 1–2; десятичные дроби |
| Предмет | Математика (единицы измерения), география, информатика |
Образовательные цели
| № | Цель | Блум | Миллер | Чем доказывается |
|---|---|---|---|---|
| 3.1 | Переводить координаты NMEA в десятичные градусы | применять | показывает как | Перевод с проверкой по карте |
| 3.2 | Определять созвездие по талкеру строки NMEA | понимать | знает | Разбор $GP/$GL/$GA/$GN |
| 3.3 | Оценивать цену ошибки в единицах измерения | оценивать | знает как | Расчёт сдвига в километрах |
| 3.4 | Читать поле качества фикса и понимать его ограничения | анализировать | знает как | Разбор значения «6 = экстраполяция» |
Сценарий занятия (45 минут)
| Время | Блок | Что делает педагог | Что делают ученики |
|---|---|---|---|
| 0–5 | Retrieval | Мини-квиз по урокам 1–2 | Пишут, разбор |
| 5–12 | Живые данные | Показывает поток NMEA с модуля | Читают строки, находят координату |
| 12–20 | Ловушка | «Переведите 5537.838 в градусы» | Большинство делит на 100 — ошибка |
| 20–30 | Теория | Градусы-минуты, талкеры, качество фикса | Разбирают формат |
| 30–40 | Практика | Переводы, проверка по карте | Решают задачи |
| 40–45 | Итог и ДЗ | Фиксация | Записывают |
Блок 1. Живые данные (5–12 мин)
Демонстрация
Подключить GPS-модуль и показать поток строк в мониторе порта:
$GPGGA,123519.00,5537.838,N,03736.200,E,1,08,1.1,150.4,M,,,,*47
$GPRMC,123519.00,A,5537.838,N,03736.200,E,0.02,,120726,,,A*62
$GLGSV,2,1,06,65,45,120,38,66,30,200,35*6A«Модуль каждую секунду выдаёт такие строки. Это язык NMEA — стандарт, на котором все GPS-приёмники мира разговаривают с устройствами. Найдите здесь координаты.»
Ученики находят 5537.838,N и 03736.200,E.
Постановка задачи
«Отлично. Мы в Москве, широта примерно 55,7°. В строке — 5537.838. Переведите это в градусы.»
Блок 2. Ловушка (12–20 мин)
Что произойдёт
Подавляющее большинство разделит на 100 и получит 55,37°. Число выглядит правдоподобно — рядом с ожидаемым 55,7.
Не поправлять сразу. Дать проверить по карте.
Проверка по карте
«Откройте карту и найдите точку 55,37° и 37,36°. Где вы оказались?»
Точка окажется примерно в 30 км южнее нужного места — в другом населённом пункте.
Разбор ошибки
«Число выглядело правильным. Формула казалась очевидной. Результат — промах на 30 километров. Для маячка человека с деменцией это означает, что помощь поедет не туда. Почему деление на 100 неверно?»
Блок 3. Теория (20–30 мин)
3.1. Базовый уровень (12–14 лет)
Градусы и минуты — как часы.
Время мы пишем не десятичной дробью: 1 час 30 минут — это не «1,30 часа», а 1,5 часа. Потому что в часе 60 минут, а не 100.
С углами то же самое: в одном градусе 60 минут. Запись
5537.838означает 55 градусов и 37,838 минуты. Чтобы получить десятичные градусы, минуты делят на 60, а не на 100.
Формула:
Сравнение с ошибочным ответом:
| Способ | Результат | Ошибка |
|---|---|---|
| Правильно (÷ 60) | 55,6306° | — |
| Ошибочно (÷ 100) | 55,3784° | 28,9 км |
3.2. Углублённый уровень (14–16 лет)
Шаг 1. Структура записи NMEA.
Формат координаты: ГГММ.МММ для широты и ГГГММ.МММ для долготы.
| Часть | Пример (широта) | Значение |
|---|---|---|
| Градусы | 55 | целые градусы (2 цифры) |
| Минуты | 37.838 | минуты с дробью |
Долгота имеет три цифры градусов (03736.200 = 037° 36,200′), потому что долгота изменяется от 0 до 180°.
Общая формула:
Шаг 2. Расчёт цены ошибки.
Один градус широты ≈ 111 км. Ошибка составила:
Шаг 3. Талкеры — кто дал решение.
Первые две буквы после $ говорят, какая система выдала данные:
| Талкер | Система | Страна/регион |
|---|---|---|
$GP | GPS | США |
$GL | ГЛОНАСС | Россия |
$GA | Galileo | Евросоюз |
$GB / $BD | BeiDou | Китай |
$GN | смешанное решение | несколько систем сразу |
Важное правило разбора. Сравнивать надо тип сообщения (три буквы после талкера: GGA, RMC, GSV), а не весь префикс целиком. Строка $GNGGA \text{и} $GPGGA — это одно и то же сообщение GGA, просто от разных источников решения. Ошибка «искать строго $GPGGA» приводит к тому, что программа не видит данных на приёмниках со смешанным решением.
Талкер $GL (ГЛОНАСС) сыграет ключевую роль на уроке 5 — по нему обнаруживается спуфинг.
Шаг 4. Качество фикса (поле 6 сообщения GGA).
| Значение | Смысл | Можно ли доверять |
|---|---|---|
| 0 | нет решения | нет |
| 1 | обычный GPS | да |
| 2 | дифференциальный (DGPS) | да, точнее |
| 4 / 5 | RTK (сантиметровая точность) | да, очень точно |
| 6 | экстраполяция (dead reckoning) | осторожно! |
Ловушка значения 6. Режим dead reckoning означает, что модуль не видит спутников и вычисляет положение по последней известной скорости и направлению. Формально «фикс есть», а фактически это предположение, которое с каждой секундой всё дальше от реальности.
Если программа проверяет только «фикс ≠ 0», она примет экстраполяцию за настоящее решение. Правильная проверка учитывает конкретное значение поля.
Шаг 5. Контрольная сумма строки.
Каждая строка NMEA заканчивается * и двумя шестнадцатеричными цифрами — это XOR всех байтов между $ и *. Тот же принцип, что CRC из урока 2, только проще. Битые строки нужно отбрасывать.
Блок 4. Практические задачи (30–40 мин)
Уровень A (12–14 лет)
A1. Переведите 5540.500,N в десятичные градусы.
Решение
55 градусов + 40,500 минут.
A2. Переведите 03736.200,E в десятичные градусы. Не забудьте: у долготы три цифры градусов.
Решение
037 градусов + 36,200 минут.
A3. Почему минуты делят на 60, а не на 100?
Ответ
Потому что в одном градусе 60 минут — так же, как в часе 60 минут. Это не десятичная система, и деление на 100 даёт неверный результат.
Уровень B (14–15 лет)
B1. Ученик перевёл 5537.838 делением на 100 и получил 55,3784°. На сколько километров он промахнулся? (1° широты ≈ 111 км)
Решение
Правильное значение: 55 + 37,838/60 = 55,6306°.
Разница: 55,6306 − 55,3784 = 0,2522°.
Вывод: для маячка безопасности это означает поиск человека в другом городе.
B2. В строке $GNGGA \text{талкер} — GN. \text{Что} \text{это} \text{означает} \text{и} \text{почему} \text{программа}, \text{ищущая} \text{строго} $GPGGA, не увидит данных?
Ответ
GN означает смешанное решение — приёмник использовал спутники нескольких систем (GPS + ГЛОНАСС + другие) одновременно, что обычно точнее.
Программа, сравнивающая весь префикс $GPGGA, не найдёт совпадения и решит, что данных нет, — хотя они есть и лучшего качества. Правильно сравнивать три буквы типа сообщения (GGA), игнорируя талкер.
B3. Приёмник сообщает качество фикса = 6. Стоит ли использовать эту координату для отправки тревоги?
Ответ
Нет. Значение 6 означает dead reckoning — модуль не видит спутников и экстраполирует положение по последним известным скорости и направлению. Для человека, который упал и лежит, экстраполяция бессмысленна: она продолжит «вести» его по прежнему маршруту.
Для тревоги нужен настоящий фикс (значение 1, 2, 4 или 5). Если его нет — честно отправить флаг gps_valid = 0, чтобы диспетчер знал, что координата не подтверждена.
Уровень C (15–16 лет)
C1. Один градус широты — примерно 111 км везде. А один градус долготы? Объясните разницу и посчитайте для широты Москвы (55,63°).
Решение
Меридианы сходятся к полюсам, поэтому длина градуса долготы зависит от широты:
Для 55,63°: cos(55,63°) ≈ 0,5646.
Практическое следствие: одна и та же ошибка в градусах долготы на широте Москвы даёт вдвое меньший сдвиг, чем в широте. А на экваторе они равны. Это важно при оценке точности и при построении карт.
C2. Точность нашего формата — lat × 10⁷, то есть 10⁻⁷ градуса. Сколько это в метрах? Не избыточна ли такая точность?
Решение
Точность бытового GPS — единицы метров (2–10 м). Наш формат хранит координату в сотни раз точнее, чем её способен измерить приёмник.
Избыточна ли? Формально да, но это не расточительство: int32 всё равно занимает 4 байта, и меньший множитель (например, 10⁵) не сэкономил бы ни байта, зато потребовал бы думать о потере точности. Множитель 10⁷ — стандарт де-факто, он гарантированно не ограничивает точность и совместим с другими системами.
Вывод: избыточность бесплатна — это хороший инженерный выбор. Избыточность, которая чего-то стоит, требует обоснования.
C3. Предложите проверку правдоподобия координаты, которую можно добавить в прошивку маячка. От каких ошибок она защитит, а от каких нет?
Разбор
Возможные проверки:
- Диапазон: широта в пределах [−90, 90], долгота [−180, 180]. Ловит грубые ошибки разбора.
- Географическая область: координата внутри ожидаемого региона эксплуатации. Ловит ошибку «делить на 100» и часть спуфинга.
- Скорость перемещения: расстояние от предыдущей точки, делённое на время, не превышает разумного (человек не движется быстрее 10 м/с). Ловит скачки и часть спуфинга.
- Возраст фикса: не старше порога (урок 4).
От чего не защитит: от согласованного спуфинга, который подставляет правдоподобную близкую точку с реалистичной динамикой. Против него нужна кросс-проверка по созвездиям — урок 5.
Ценный вывод: проверки правдоподобия ловят ошибки своего кода и грубые внешние аномалии, но не защищают от продуманной атаки.
Ответы на вопросы, которые прозвучат
| Вопрос ученика | Как отвечать |
|---|---|
| «Зачем такой странный формат, почему не сразу градусы?» | NMEA создан в 1980-х для морской навигации, где градусы и минуты — традиция мореходства. Стандарт живёт по инерции, и весь мир к нему адаптировался |
| «Библиотека же переводит правильно — зачем нам знать?» | Чтобы не поверить неверной ручной формуле и понимать, что видите в логе. Ошибка «делить на 100» — одна из самых частых в проектах с GPS |
| «Почему у долготы три цифры градусов?» | Долгота изменяется от 0 до 180°, поэтому нужны три позиции. Широта — только до 90°, хватает двух |
| «Что если строка пришла битой?» | В конце строки есть контрольная сумма после *. Битые строки отбрасывают — библиотека делает это автоматически |
| «А ГЛОНАСС точнее GPS?» | Ни одна система не точнее «вообще»: точность зависит от числа видимых спутников и геометрии. Совместное использование нескольких систем — точнее любой отдельной |
Раздаточный лист (для печати)
Урок 3. NMEA — координаты в градусах и минутах
Формат записи:
широта: ГГММ.МММ 5537.838 = 55° 37,838′ долгота: ГГГММ.МММ 03736.200 = 037° 36,200′Формула перевода:
⚠ Частая ошибка: делить на 100 вместо 60 → промах ~30 км!
Задания. Переведите:
NMEA Градусы Минуты Десятичные градусы 5537.838,N5540.500,N03736.200,EПроверка по карте: найдите последнюю точку. Куда попали? __________
Талкеры (кто дал решение):
Талкер Система $GP$GL$GA$GNКачество фикса (поле 6 в GGA):
0 1 6 Почему значению 6 нельзя доверять?
___________________________________________________
Домашнее задание
Обязательная часть
Врайтап по рубрике А. Обязательный пункт: опишите свою ошибку с делением на 100 (если она была) и как вы её обнаружили.
Уровень A
Найти три примера единиц измерения, где деление на 100 было бы ошибкой (время, углы, что-то ещё). Объяснить, почему.
Уровень B
Взять реальные координаты своего дома или школы из карты (в десятичных градусах) и записать их в формате NMEA. Проверить обратным переводом.
Уровень C
Изучить структуру сообщения $GPGSV (информация о видимых спутниках). Объяснить, какие данные оно несёт и почему они понадобятся на следующих уроках.
Ориентир для педагога
GSV содержит: число сообщений в группе, номер сообщения, общее число видимых спутников, а затем для каждого — номер, угол места, азимут и отношение сигнал/шум.
Ключевое для урока 5: поле «общее число видимых спутников» в строке $GLGSV показывает, сколько спутников ГЛОНАСС видит приёмник. Ноль при большом числе GPS-спутников — сигнатура спуфинга.
Итог урока: что записать в журнал
Вывод урока 3
- NMEA хранит координаты в формате градусы и минуты:
5537.838= 55° 37,838′. - Перевод в десятичные градусы:
градусы + минуты/60. Не на 100! - Ошибка «делить на 100» даёт промах около 30 км — для маячка безопасности это критично.
- Талкер (
$GP,$GL,$GA,$GN) показывает, какая система дала решение. Сравнивать надо тип сообщения, а не весь префикс. - Качество фикса = 6 означает экстраполяцию без спутников — такому «фиксу» доверять нельзя.
- Цена ошибки в единицах измерения не абстрактна: она измеряется в километрах и в безопасности человека.
Связь с курсом
| Что родилось на этом уроке | Где станет инструментом |
|---|---|
| Талкеры созвездий | Урок 5 (нулевой ГЛОНАСС — сигнатура спуфинга) |
| Качество фикса | Урок 4 (дозревание и свежесть) |
| Цена ошибки в единицах | WarWalk (пересчёт координат в расстояния) |
| Проверка результата по карте | Любая работа с данными: проверяй результат независимым способом |
Чек-лист педагога перед уроком
- GPS-модуль подключён и выдаёт строки (или распечатаны реальные строки NMEA)
- Открыта карта для проверки координат
- Проверено:
5537.838→ 55,6306°, ошибочно → 55,3784°, разница ≈ 28 км - Раздаточный лист распечатан
- Приготовлено: не поправлять ошибку деления на 100 сразу — дать проверить по карте