Как подключить внешний GPS-приемник к компьютеру и считать данные с его выхода.
Настройка оборудования
Тебе понадобится:
- GPS-модуль. Я использую NEO-M8N, купленный на AliExpress за 10 австралийских долларов. Есть также GY-NEO6MV2, который стоит менее 4 австралийских долларов. Оба обеспечивают аналогичный вывод данных
- Модуль USB 2.0 to TTL UART HW-409 за 2 австралийских доллара на AliExpress
- 4 соединительных провода с гнездовым разъемом Dupont или XH2.54. 2,20 австралийских доллара за 10 комплектов на AliExpress (в этом же магазине продается ресивер NEO-M8N)
- Электрический припой для крепления проводов
- Компьютер с портом USB и установленным Python (я использую Apple MacBook с разъемом USB-C)
GPS-приемник отправляет данные по последовательному соединению со скоростью 9600 бод (помните, в прошлом веке скорость модемного соединения использовалась в бодах? 9600 бод было моей обычной скоростью соединения еще в 1997 году). Модуль USB UART позволяет нам взаимодействовать с последовательными интерфейсами через USB.
Припой соединяет провода с приемником GPS и штекерным разъемом с модулем UART. Провода должны быть подключены следующим образом:
GND к GND (черный)
TX к RXD (желтый)
RX на TXD(белый)
VCC на +5V (красный)
Сохранение данных с приемника в файл
Теперь, когда оборудование готово, подключите модуль USB UART к концентратору USB. Оно должно определяться как новое устройство. В моем устройстве Apple MacBook используется имя /dev/cu.usbserial-0001.
Запустите блокнот Jupyter. Для чтения данных я буду использовать библиотеку Python pyserial. Чтобы установить его, выполните:
!pip install pyserial
Теперь мы готовы получить данные от GPS-приемника через последовательный порт и сохранить их в виде текстового файла. Данные отправляются в формате NMEA, где каждая строка, разделенная символом возврата каретки, представляет собой предложение с информацией об определенных типах данных GPS. ser.readline() читает одно предложение. Когда число прочитанных предложений достигает 2000, они сохраняются в файл с именем data/gps_data_ГГГГММДД-ЧЧММСС.nmea, используя текущее время UTC в качестве метки времени.
Запустите следующий фрагмент для белого, пока первые 2000 предложений не загрузятся и не сохранятся в файл.
Теперь давайте проверим содержимое этого файла. Просмотреть полный файл
Как видите, каждая строка начинается с поля $G***, которое определяет тип записи. Например:
$GNGGA,064656.00,3402.91778,S,15101.42545,E,1,12,0.62,140.8,M,18.6,M,,*5E
$GNGGA
Данные, связанные со временем, положением и исправлением приемника
064656.00
отметка времени записи в часовом поясе UTC 06:46:56
3402,91778,S
широта, умноженная на 100. S для Южного полушария
15101,42545,E
долгота, умноженная на 100. E для восточного полушария
Это сообщение можно использовать для регистрации положения устройства с отметкой времени. Мы будем использовать именно этот тип сообщения в этой демонстрации, но есть много других команд, предоставляющих информацию о количестве видимых спутников, положении магнитного севера и других метаданных.
Для получения дополнительной информации проверьте:
Справочное руководство по NMEA доступно по адресу https://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual-Rev2.1-Dec07.pdf.
Или руководство производителя GPS-приемника, в котором подробно описана реализация протокола устройства https://www.u-blox.com/sites/default/files/products/documents/u-blox8-M8_ReceiverDescrProtSpec_UBX-13003221.pdf
Парсинг данных с помощью pynmea2
Хотя извлекать данные из сообщения GNGGA довольно просто, разделяя поля запятыми, анализируя числа и разделяя координаты на 100, есть более простой способ — использовать библиотеку pynmea2. Установите его, запустив:
!pip install pynmea2
Установив библиотеку, проанализируйте сообщение GNGGA. Он возвращает объект, который содержит данные в готовом к использованию формате.
message = "$GNGGA,064656.00,3402.91778,S,15101.42545,E,1,12,0.62,140.8,M,18.6,M,,*5E" gga = pynmea2.parse(message) print(gga.latitude) print(gga.longitude) print(gga.timestamp)
Библиотека может анализировать большое количество типов сообщений и предоставляет описания для каждого поля данных. Таким образом, вы можете исследовать поля других типов сообщений.
Например, сообщение GLGSV предоставляет информацию о видимых спутниках и их положении в небе. Первый столбец содержит описание и второе имя свойства анализируемого сообщения.
Sentence: $GLGSV,3,2,09,74,22,022,20,80,27,134,,85,09,346,13,86,37,304,18*64 Number of messages of type in cycle num_messages 3 Message Number msg_num 2 Total number of SVs in view num_sv_in_view 09 SV PRN number 1 sv_prn_num_1 74 Elevation in degrees 1 elevation_deg_1 22 Azimuth, deg from true north 1 azimuth_1 022 SNR 1 snr_1 20 SV PRN number 2 sv_prn_num_2 80 Elevation in degrees 2 elevation_deg_2 27 Azimuth, deg from true north 2 azimuth_2 134 SNR 2 snr_2 SV PRN number 3 sv_prn_num_3 85 Elevation in degrees 3 elevation_deg_3 09 Azimuth, deg from true north 3 azimuth_3 346 SNR 3 snr_3 13 SV PRN number 4 sv_prn_num_4 86 Elevation in degrees 4 elevation_deg_4 37 Azimuth, deg from true north 4 azimuth_4 304 SNR 4
Загрузка данных о положении устройства в GeoPandas
Имея ряд сообщений, содержащих координаты временной метки, мы можем загрузить эти данные в геопанду GeoDataFrame и нанести их поверх базовой карты.
Первый шаг — извлечение необходимых данных из проанализированных сообщений в массив объектов dict:
Координаты_данные[0] теперь содержат первую точку данных, которую мы хотели бы загрузить во фрейм данных:
{'timestamp': datetime.time(6, 46, 55), 'latitude': -34.048630333333335, 'longitude': 151.02375633333332, 'horizontal_dil': '0.62', 'num_sats': '12', 'gps_qual': 1}
Создайте GeoDataFrame:
horizontal_dil показывает точность определения координат, gps_qual равно 0, если устройство не смогло получить координаты из-за слабого сигнала.
Создание карты с координатными точками
Теперь мы готовы создать карту, показывающую координаты точек, записанные GPS-приемником. Данные были собраны во время короткой поездки по моему району.
Ехать или ходить с ноутбуком не очень удобно, поэтому в другой статье я хотел бы обсудить, как использовать небольшой и очень дешевый микроконтроллер для записи данных с GPS-приемника на SD-карту.
Полный пример кода доступен на GitHub.
Запустите и отредактируйте этот блокнот в Google Colab
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.