Как подключить внешний GPS-приемник к компьютеру и считать данные с его выхода.

Настройка оборудования

Тебе понадобится:

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.