Pull to refresh

Получаем спутниковые координаты GPS/ГЛОНАСС с помощью модуля SIM868 на Repka Pi

Level of difficultyEasy
Reading time25 min
Views7.8K

Сегодня уже трудно найти человека, который не знает, что такое навигатор и GPS/Глонасс координаты. В этой статье мы расскажем о том, как встроить функции навигатора в устройство, собранное на базе микрокомпьютера Repka Pi. Для получения координат мы будем использовать модуль GSM/GPRS/GNSS Bluetooth HAT, о котором вы уже знаете из предыдущих статей нашей серии про эти модули на базе SIM868.

Полученные GPS-координаты вы сможете использовать в устройствах IoT, самоходных машинах и роверах, самокатах, дронах, автомобилях, в шлагбаумах, воротах и так далее.

Вы научитесь получать от модуля сообщения NMEA в формате передачи данных между корабельными приборами. Этот формат часто применяется при интеграции навигатора с различными устройствами, которые должны получать и отслеживать данные о местоположении, направлении, скорости, параметры навигационных спутников и другие данные.

Контролируя спутниковые координаты своего устройства, вы сможете получать сообщения о начале движения или остановке устройства, о вхождении в определенную область, заданную своими координатами или о выходе устройства из этой области. Также можно контролировать высоту, скорость и направление перемещения устройства. Например, можно реагировать на превышение скорости, отправляя сообщение в центр обработки данных.

Если устройств много, то данные о координатах, добавленные в телеметрические данные, позволят сразу понять, где находится то или иное устройство, требующее внимания или обслуживания.

Модуль GSM/GPRS/GNSS Bluetooth HAT может отправлять данные, например, через GPRS или SMS, а также совершать телефонные звонки.

Возможно, вам будут полезны и другие статьи нашего цикла про модуль GSM/GPRS/GNSS Bluetooth HAT.

В первой статье серии мы рассказали о том, как с помощью модуля GSM/GPRS/GNSS Bluetooth HAT обмениваться данными между микрокомпьютером Repka Pi с JSON-сервисом, доступным в интернете, по каналу GPRS.

Вторая статья рассматривает такой обмен глубже, на уровне AT-команд, передаваемых в модуль через UART.

Третья статья научит вас отправлять и принимать короткие текстовые сообщений SMS (Short Message Service) в текстовом режиме, а также в режиме PDU.

В четвертой статье мы рассказали, как модуль может звонить и принимать телефонные звонки.

Содержание

Как работает навигация GNSS

Подготовка макета для работы

Получаем координаты GPS от GSM/GPRS/GNSS Bluetooth HAT

Получаем GNSS-координаты с помощью AT-команд

Автоматическое получение сообщений URC с навигационными данными

Отправка сообщений NMEA в UART

Другие полезные команды

Получение GPS-координат через GSM

Сбор телеметрии

Полезные статьи

Итоги

 

Как работает навигация GNSS

Вы, конечно, слышали о том, что навигаторы работают совместно со спутниками навигации, и поэтому в помещении, в туннелях и других подобных местах эти устройства часто бывают бесполезны. Если невозможно «поймать» сингал от спутников или его уровень окажется недостаточным, координаты GPS устройства определить не получится.

Правда, есть вариант определения координат через GSM, о чем мы еще будем говорить, но полученные данные будут очень приблизительными.

Современная глобальная система навигации GNSS (Global Navigation Satellite System) работает с сетями спутников, расположенных на хорошо известных орбитах (рис. 1).

Рис. 1. Спутники навигации на орбите земли (изображение создано нейросетью).
Рис. 1. Спутники навигации на орбите земли (изображение создано нейросетью).

Эти спутники оснащены очень точными атомными часами и способны передавать сигналы для устройств навигации (которые также называют GNSS-приемниками или GPS-навигаторами).

Самые известные из систем навигации — GPS (США), ГЛОНАСС (Россия), Galileo (Европейский союз) и BeiDou (Китай).

Первые спутники американской системы GPS были запущены в начале 1978 года. Всего на настоящий момент на орбите Земли находится 31 спутник GPS и 27 спутников ГЛОНАСС, но количество спутников может изменяться.

Устройства навигации получают сигналы с метками времени и позициями одновременно от нескольких спутников, измеряя время, затраченное на прием сигналов от каждого спутника. Получив эту информацию, GNSS-приемники определяют свое положение в трехмерном пространстве с помощью триангуляции.

Для увеличения точности определения координат используются различные системы коррекции, в том числе с использованием наземных станций коррекции.

Спутники GPS оснащены передатчиками, работающими на частоте 1575.42 МГц (для гражданских устройств) и мощностью порядка 50 Вт.

Расскажем о данных, которые спутники навигации передают устройствам навигации. Это альманахи и эфимерисы, необходимые для вычисления местоположения устройства.

Альманах

Альманах определяется как совокупность данных с параметрами орбит всех спутников. Каждый спутник передает альманахи для всех спутников системы навигации.

Эти данные не очень точны, но они действительны несколько месяцев.

Эфемериды и эфимерисы

Эфимериды (Ephemerides) представляют собой набор данных с прогнозом положения спутника в определенное время — параметры орбиты спутника, время, скорость и другие параметры.

Также используется термин эфимерисы (Ephemeris). Этот термин в статьях иногда заменяет термин эфимериды, однако данные эфимериса могут включать в себя как прогнозируемые, так и реальные данные о положении объекта на небосклоне.

Данные эфимериса спутников навигации содержат корректировки параметров орбит и часов для каждого спутника, что требуется для точного определения координат. Спутники передают свои (и только свои) данные эфимериса каждые 30 секунд.

Как стартует навигатор GPS

В зависимости от времени, в течение которого устройство навигации было выключено, а также от того, перемещалось это устройство на большие расстояния или нет, выполняются различные виды старта.

Если устройство навигации надолго выключить или перевезти на большое расстояние, данные альманаха и эфимериса нужно будет загружать заново. На это может уйти несколько минут или даже десятков минут (так называемый холодный старт).

Также может получиться так, что данные альманаха не устарели, но необходимо обновить данные эфимериса. Время такой загрузки может быть порядка одной минуты.

И, наконец, при кратковременном выключении навигатора, когда данные альманаха и эфимериса не устарели, навигатор сразу может использовать данные о спутниках для определения своего местоположения.

Эксперименты с модулем GSM/GPRS/GNSS Bluetooth HAT показали, что даже при кратковременном выключении питания после его восстановления выполняется холодный старт.

Подготовка макета для работы

Если вы работали со статьями серии, посвященной использованию модуля GSM/GPRS/GNSS Bluetooth HAT, то скорее всего уже выполнили все подготовительные работы — подключили модуль к микрокомпьютеру Repka Pi и отключили вывод сообщений на UART0 с помощью программы repka-config.

Если нет, то соберите простой макет, подключив модуль GSM/GPRS/GNSS Bluetooth HAT непосредственно к разъему GPIO микрокомпьютера Repka Pi как «шляпу». Также не забудьте подключить антенну GPS (рис. 2).

Рис. 2. Подключение GSM/GPRS/GNSS Bluetooth HAT к Repka Pi.
Рис. 2. Подключение GSM/GPRS/GNSS Bluetooth HAT к Repka Pi.

Антенна GPS с достаточно длинным кабелем, а также короткий соединительный кабель для подключения к модулю GSM/GPRS/GNSS Bluetooth HAT поставляются в комплекте с этим модулем.

Если вы запускаете модуль в помещении, расположите антенну GPS на подоконнике (желательно с внешней стороны окна, но можно попробовать и с внутренней) или на балконе поближе к окну (рис.3).

Рис. 3. Расположение антенны GPS на подоконнике.
Рис. 3. Расположение антенны GPS на подоконнике.

Перед подключением модуля GSM/GPRS/GNSS Bluetooth HAT к GPIO Repka Pi установите перемычки желтого цвета на пины B, и вставьте SIM-карту мобильного оператора.

Отключение вывода сообщений на UART0

Загрузите Repka OS и отключите вывод сообщений на UART0 с помощью программы repka-config. Запустите эту программу, и, когда появится окно с текущей максимальной частотой процессора, щелкните в нем кнопку Ok. Далее в меню настраиваемых опций выберите Включить / отключить вывод сообщений на UART0. После этого отключите вывод сообщений (рис.4).

Рис. 4. Отключение вывода сообщений на UART0.
Рис. 4. Отключение вывода сообщений на UART0.

При выходе  из программы repka-config перезагрузите Repka OS. После перезагрузки включите питание модуля кнопкой PWRKEY, нажав ее примерно на одну секунду. После этого на плате модуля GSM/GPRS/GNSS Bluetooth HAT должны замигать светодиоды красного цвета.

После включения питания дождитесь, когда на плате модуля начнет мигать светодиод PPS. Это произойдет, когда навигатор модуля определит свое местоположение. Скорее всего, ждать придется достаточно долго, минут 10–15. Если светодиод так и не замигал, попробуйте вынести антенну поближе к улице или перенести модуль с антенной в другую комнату.

Если ничего не получается, убедитесь, что питание модуля включено с помощью AT-команды AT+CGNSPWR?:

AT+CGNSPWR?
+CGNSPWR: 1

 Здесь питание включено. Если оно было выключено, включить его:

AT+CGNSPWR=1
+CGNSPWR: 1

Затем дождитесь, когда светодиод PPS начнет мигать.

Процедура работы с AT-командами описана ниже в разделе статьи с названием Включение питания.

Для работы с программами вам потребуется доступ SSH к консоли Repka OS, установленной на Repka Pi, через сеть, или доступ к командной строке через оконный интерфейс Repka OS.

Установка необходимых библиотек

Для программы получения GNSS-координат get-gnss-data.py будут нужны библиотеки Python SIM800L и RoverConnect.

Сначала установите библиотеку SIM800L, сайт которой находится по адресу https://pypi.org/project/sim800l-gsm-module/1.0.0/.

Установка описана здесь https://github.com/Ircama/raspberry-pi-sim800l-gsm-module:

# apt update
# apt install python3-pip
# python3 -m pip install sim800l-gsm-module

Запустите эти команды в консоли SSH, подключившись к Repka OS, запущенной на микрокомпьютере Repka Pi. Вам потребуются права пользователя root.

Вслед за установкой SIM800L скопируйте в рабочий каталог библиотеку RoverConnect и программу get-gnss-data.py из репозитория https://github.com/AlexandreFrolov/rover_connect2.

Получаем координаты GPS от GSM/GPRS/GNSS Bluetooth HAT

С помощью библиотеки RoverConnect, доступной по адресу https://github.com/AlexandreFrolov/rover_connect2, и модуля GSM/GPRS/GNSS Bluetooth HAT, созданного на базе SIM868, можно очень легко написать программу навигации для вашего устройства.

Пример такой программы get-gnss-data.py вы найдете в листинге 1.

Листинг 1. https://github.com/AlexandreFrolov/rover_connect2/blob/main/get-gnss-data.py

import traceback
import pdb
import json
from sim800l import SIM800L
from rover_connect import RoverConnect

if __name__ == "__main__":
#    pdb.set_trace()
    rover = RoverConnect('/dev/ttyS0', 'internet.mts.ru')
    gnss_data = rover.get_cgns_data()
    gnss_parsed_data = rover.parse_cgns_info(gnss_data)
    gnss_parsed_data = json.loads(gnss_parsed_data)
    print(json.dumps(gnss_parsed_data, indent=4))  

Если запустить программу через консоль, вы увидите координаты и другие данные, полученные от GNSS-приемника (часть данных скрыта при помощи символов X):

# python3 get-gnss-data.py
{
    "gnss_status": "1",
    "fix_status": "1",
    "utc_datetime": "20240206174749.000",
    "latitude": "55.642XXX",
    "longitude": "37.337XXX",
    "msl_altitude": "216.293",
    "speed": "0.00",
    "course": "310.6",
    "fix_mode": "1",
    "reserved_1": "",
    "hdop": "1.9",
    "pdop": "2.2",
    "vdop": "0.9",
    "reserved_2": "",
    "satellites_in_view": "13",
    "gnss_satellites_used": "12",
    "glonass_satellites_used": "10",
    "reserved_3": "",
    "c_n0_max": "37",
    "hpa": "",
    "vpa": ""
}

 

Описание полей данных, которые программа get-gnss-data.py выводит на консоль, приведено в Таблице 1.

Таблица 1. Данные от GNSS приемника.

Анализируя поля gnss_status и fix_status, можно понять, готов ли навигатор к определению координат своего местоположения.

Чтобы навигатор мог определять координаты, он должен загрузить данные как минимум от 3–4  спутников. Если вы только что включили модуль GSM/GPRS/GNSS Bluetooth HAT, то на получение данных от всех спутников может уйти 10–15 минут.

По содержимому поля fix_status ваша программа может определить успешность фиксации местоположения. При успехе модуль вернет программе правильные координаты.

Поле utc_datetime содержит дату в формате UTC с точностью до миллисекунд. Например, значение 20240206174749.000 можно расшифровать с использованием формата "ГГГГММДДЧЧММСС.МММ":

  • "ГГГГ" - год (2024)

  • "ММ" - месяц (02)

  • "ДД" - день (06)

  • "ЧЧ" - часы (17)

  • "ММ" - минуты (47)

  • "СС" - секунды (49)

  • "МММ" - миллисекунды (000)

Напомним, что для повышения точности определения координат спутники GNSS оснащены очень точными атомными часами.

Поля latitude и longitude содержат широту и долготу вашего модуля GSM/GPRS/GNSS Bluetooth HAT, а значит и устройства, в котором он установлен. Здесь все понятно — это как раз те самые координаты, ради получения которых все и делается.

В некоторых случаях (например, для дронов) может представлять интерес поле msl_altitude, содержащее высоту устройства над уровнем моря в метрах.

Если устройство не стоит на месте, а перемещается, то анализируя поля speed и course можно определить скорость и направление движения.

Для повышения точности определения местоположения используются методы коррекции при получении сигналов от спутников. Поле fix_mode позволяет узнать, какой метод коррекции используется.

Если значение поля fix_mode равно нулю, используются только стандартные методы определения местоположения на основе данных, полученных от спутников.

Когда поле fix_mode содержит значение 1, применяются стандартные методы коррекции сигналов, такие как обработка эфимериса (параметры орбиты и ухода часов конкретного спутника, позволяющие определить его местоположение в зависимости от времени), коррекцию часового сдвига и других систематических ошибок. Именно такой метод применяется в модуле GSM/GPRS/GNSS Bluetooth HAT.

И, наконец, если содержимое fix_mode равно 2, используются дополнительные данные коррекции, полученные от станций дифференциальной коррекции, расположенных на земле.

Чтобы оценить горизонтальную и вертикальную точность фиксации, нужно проанализировать поля  hdop и vdop, соответственно. Эти поля могут содержать значения от 0 до 99.9. Чем значение меньше, тем точность выше.

Поле pdop используется для оценки общей точности трехмерного местоположения. И чем оно меньше, тем точность выше.

Поле satellites_in_view позволяет узнать, сколько спутников доступно для приема сигналов в данное время.

В поле gnss_satellites_used записано количество спутников GPS, GLONASS, Galileo и BeiDou, которые используются для вычисления местоположения.

Аналогично, поле glonass_satellites_used показывает количество использованных спутников системы GLONASS.

Через поле c_n0_max передается максимальное соотношение сигнал-шум среди всех видимых спутников в системе навигации. Измеряется в dBHz (единица измерения отношения мощности сигнала к ширине полосы частоты), значение может находиться в диапазоне от 0 до 55. Более высокое значение dBHz указывает на более чистый сигнал.

Таким образом, анализируя данные, полученные программой get-gnss-data.py от функции rover.get_cgns_data (листинг 1), можно получить не только координаты местоположения модуля, но и различную дополнительную информацию. Эта информация может оказаться полезной, в частности, для оценки качества принимаемых сигналов от спутников и количества спутников.

Получаем GNSS-координаты с помощью AT-команд

Для работы с AT-командами мы будем использовать терминальную программу minicom. Ее можно установить и запустить в Repka OS следующим образом:

# apt install minicom
# minicom -D /dev/ttyS0

В консоли SSH появится окно программы minicom для ввода AT-команды и просмотра результатов их выполнения.

Для удобства включите эхо-режим командой ATE1. Если вы ввели команду AT, увидели ее и ответ на команду OK, эхо-режим включен. Команда ATE0 выключает эхо-режим.

Включение питания

Команда AT+CGNSPWR позволяет узнать, включено ли питание модуля, и при необходимости его включить:

AT+CGNSPWR?
+CGNSPWR: 1

Здесь питание включено. Если оно было выключено, то включить можно так:

AT+CGNSPWR=1
OK
+CGNSPWR: 1

Учтите, что, если питание модуля выключено и команда AT+CGNSPWR? вернула нулевое значение, данные спутников навигации не будут загружены.

Получение координат

Для получения координат используйте команду AT+CGNSINF.

Если фиксация местоположения еще не выполнена, в ответ на эту команду вы получите строку, в которой будет неправильная дата и время, а также будут отсутствовать координаты:

AT+CGNSINF
+CGNSINF: 1,0,19800105235955.000,,,,0.00,0.0,0,,,,,,2,0,0,,35,,

Когда местоположение зафиксировано, команда AT+CGNSINF вернет необходимые данные (часть данных скрыта символами X):

AT+CGNSINF
+CGNSINF: 1,1,20240208183233.000,55.643XXX,37.338XXX,336.322,0.00,323.0,1,,0.9,1.2,0.8,,12,10,9,,33,,
OK

Как расшифровать эту строку?

Полная расшифровка есть в документе SIM868 Series_GNSS _Application Note, доступном для загрузки на сайте Simcom после регистрации, в описании команды AT+CGNSINF.

В библиотеке https://github.com/AlexandreFrolov/rover_connect2/blob/main/rover_connect.py определена функция parse_cgns_info, которая преобразует строку, полученную от команды AT+CGNSINF, в строку JSON:

def parse_cgns_info(self, data_string):
        CGNSInfo = namedtuple("CGNSInfo", [
            "gnss_status", "fix_status", "utc_datetime",
            "latitude", "longitude", "msl_altitude",
            "speed", "course", "fix_mode", "reserved_1",
            "hdop", "pdop", "vdop", "reserved_2", "satellites_in_view",
            "gnss_satellites_used", "glonass_satellites_used",
            "reserved_3", "c_n0_max", "hpa", "vpa"
        ])
        
        substring_to_remove = 'AT+CGNSINF\r\r\n+CGNSINF: '
        substring_to_remove_from_end = '\r\n\r\nook'
        data_string = data_string.replace(substring_to_remove, '')
        data_string = data_string.replace(substring_to_remove_from_end, '')
        parts = data_string.strip().split(",")
        
        cgns_info = CGNSInfo(
            gnss_status=parts[0], fix_status=parts[1], utc_datetime=parts[2],
            latitude=parts[3], longitude=parts[4], msl_altitude=parts[5],
            speed=parts[6], course=parts[7], fix_mode=parts[8],
            reserved_1=parts[9], hdop=parts[10], pdop=parts[11],
            vdop=parts[12], reserved_2=parts[13],
            satellites_in_view=parts[14],
            gnss_satellites_used=parts[15], glonass_satellites_used=parts[16],
            reserved_3=parts[17], c_n0_max=parts[18], hpa=parts[19], vpa=parts[20]
        )
        if cgns_info.gnss_status != '1' or cgns_info.fix_status != '1':
            raise Exception(f"failed with error: GNSS Position not fixed")
        cgns_info_dict = cgns_info._asdict()
        telemetry_json = json.dumps(cgns_info_dict, ensure_ascii=False, indent=2)            
        return telemetry_json

В именованном кортеже CGNSInfo перечислены все поля исходной строки и их названия. Эти поля уже были описаны нами ранее в таблице 1, поэтому вы легко найдете соответствие.

Автоматическое получение сообщений URC с навигационными данными

Вы можете автоматически отслеживать такие события, как обновление местоположения, превышение скорости или изменение качества сигнала. Для этого можно включить командой AT+CGNSURC автоматическое получение так называемых не запрошенных сообщений с кодом результата URC (Unsolicited Result Code messages).

В качестве параметра команде AT+CGNSURC передается режим навигации:

  • 0 — выключение режима автоматического получения сообщений URC;

  • 1 — включение режима автоматического получения сообщений URC после каждого обновления  данных о местоположении:

  • 2 — аналогично предыдущему, но сообщения отправляются после каждого второго обновления данных о местоположении;

  • 255 — аналогично предыдущему, но сообщения отправляются после каждого 255-го обновления данных о местоположении

Если выдать команду AT+CGNSURC с параметром, равным единице, то вы увидите в окне терминала серию сообщений:

AT+CGNSURC=1
OK
+UGNSINF: 1,1,20240209075252.000,55.643XXX,37.338XXX,290.433,4.02,215.7,1,,1.3,1.5,0.9,,15,7,10,,32,,
+UGNSINF: 1,1,20240209075253.000,55.643XXX,37.338XXX,288.970,5.61,187.5,1,,1.3,1.5,0.9,,15,7,10,,31,,
+UGNSINF: 1,1,20240209075254.000,55.643XXX,37.338XXX,287.498,4.22,217.4,1,,1.3,1.5,0.9,,14,7,10,,31,,
…
+UGNSINF: 1,1,20240209075257.000,55.643XXX,37.338XXX,283.593,3.70,196.7,1,,1.2,1.5,0.9,,15,8,10,,30,,

Чтобы отключить поток сообщений, нужно выдать эту же команду с параметром, равным нулю:

AT+CGNSURC=0

Ваша программа может анализировать полученные данные и использовать их, например, для таких целей:

  • отслеживание начала движения или фиксации момента остановки устройства, оснащенного модулем GSM/GPRS/GNSS Bluetooth HAT;

  • фиксация момента, когда устройство покидает область, заданную своими координатами, или наоборот, попадает в такую область;

  • контроль скорости и направления движения — фиксация превышения скорости или изменения направления движения;

  • контроль изменения высоты устройства над уровнем моря;

  • контроль доступности спутников GNSS, уровня и качества получаемых от них сигналов

Конечно, вы можете написать программу, которая для получения данных от модуля выдает в цикле с некоторой задержкой команду AT+CGNSINF. Однако с помощью команды AT+CGNSURC можно получать данные только тогда, когда произошли обновления местоположения или других параметров устройства, имеющих отношение к GNSS.

Отправка сообщений NMEA в UART

С помощью команды AT+CGNSTST вы можете включить отправку так называемых сообщений NMEA (National Marine Electronics Association) в порт UART.

Сообщения NMEA представляет собой формат передачи данных между корабельными приборами. Такие сообщения используются для передачи данных от GPS-навигатора в различные системы и устройства — системы отслеживания судов, автопилоты, компасы и другие системы. Это может быть информация о местоположении, времени, скорости, курсе и тому подобное.

Команда AT+CGNSTST? вернет нулевое значение, если отправка сообщений NMEA в UART отключена (так сделано по умолчанию), и единицу — если включена:

AT+CGNSTST?
+CGNSTST: 0

Давайте включим режим отправки следующей командой:

AT+CGNSTST=1
OK

Как только вы это сделаете, на экране терминальной программы minicom начнут появляться сообщения NMEA (часть данных скрыта символами XXX):

$GNGGA,083248.000,5538.610XXX,N,03720.325XXX,E,1,8,3.18,308.312,M,14.738,M,,*4F
$GPGSA,A,3,19,14,22,02,17,21,,,,,,,3.31,3.18,0.90*0A
$GLGSA,A,3,85,76,,,,,,,,,,,3.31,3.18,0.90*10
$GPGSV,3,1,11,22,72,084,18,17,52,121,18,14,50,074,25,13,45,193,*7D
$GPGSV,3,2,11,15,45,247,,24,39,290,15,19,36,158,16,30,21,119,14*75
$GPGSV,3,3,11,02,18,048,17,23,15,302,,21,15,032,25*4D
$GLGSV,3,1,10,77,75,312,,76,47,071,22,67,42,244,,68,38,314,*66
$GLGSV,3,2,10,86,34,088,,85,27,028,32,78,18,270,,87,11,138,*69
$GLGSV,3,3,10,66,09,199,,69,04,351,*60
$GNRMC,083248.000,A,5538.610XXX,N,03720.325XXX,E,1.05,268.09,100224,,,A*79
$GNVTG,268.09,T,,M,1.05,N,1.95,K,A*2F
$GPACCURACY,29.1*32
…

Чтобы отключить поток сообщений, используйте команду AT+CGNSTST=0.

Сообщения NMEA состоит из строки ASCII-символов, начинающейся с символа "$", за которым следует двухсимвольный идентификатор спутниковой системы, от которой получена информация:

  • GP — GPS (США);

  • GL — Глонасс (Россия);

  • GA — Galileo (Европа);

  • BD — Beidou (Китай);

  • GQ — QZSS (Япония);

  • GN —спутники разных навигационных систем

Далее идет трехсимвольный идентификатор строки и идут поля данных, разделенные запятыми. В зависимости от идентификатора строки поля могут содержать такие данные, как время, координаты GPS, скорость и так далее.

Фиксация местоположения GGA

В качестве примера разберем сообщение о фиксации местоположения $GNGGA:

$GNGGA,083248.000,5538.610XXX,N,03720.325XXX,E,1,8,3.18,308.312,M,14.738,M,,*4F

В этом сообщении:

  • GN — информация получена от спутников разных навигационных систем;

  • GGA — данные о последнем зафиксированном местоположении;

  • 083248 UTC — время UTC в формате "ЧЧММСС.ССС";

  • 55°38.610XXX' N — широта;

  • 37°20.325XXX' E — долгота;

  • 1 — способ вычисления координат;

  • 8 — количество активных спутников;

  • 3.18 — горизонтальный геометрический фактор ухудшения точности DOP;

  • 308.312 М — высота над уровнем моря;

  • 14.738 М — геоидальное различие (различие между земным эллипсоидом WGS 84 и уровнем моря);

  • *4F — контрольная сумма строки

Способы вычисления координат могут быть такими:

  • 0 — недоступно;

  • 1 — автономно;

  • 2 — дифференциально;

  • 3 — GPS режим прецизионной точности, возможно определение местоположения;

  • 4 — фиксированный RTK;

  • 5 — не фиксированный RTK;

  • 6 — использование данных инерциальных систем;

  • 7 — ручной режим;

  • 8 — режим симуляции

Рекомендованные минимальные данные о местоположении RMC

Сообщение RMC содержит информацию о рекомендованных минимальных данных о местоположении (RMC) в формате GNSS. В нашем случае мы получили такое сообщение:

$GNRMC,083248.000,A,5538.610XXX,N,03720.325XXX,E,1.05,268.09,100224,,,A*79

Здесь:

  • 083248.000 — время UTC в формате "ЧЧММСС.ССС";

  • A — статус данных, A означает верные данные о местоположении;

  • 5538.610XXX,N — широта и направление (N - северное полушарие);

  • 03720.325XXX,E — долгота и направление (E - восточное полушарие);

  • 1.05 — скорость в узлах;

  • 268.09 — курс в градусах;

  • 100224 — дата в формате ДДММГГ;

  • ,,, — вспомогательные данные о движении (направление, скорость) отсутствуют;

  • A — статус фиксации местоположения A;

  • *79 — контрольная сумма для проверки целостности сообщения.

Данные о скорости и курсе VTG

Строка $GNVTG содержит информацию о скорости и курсе относительно земли:

$GNVTG,268.09,T,,M,1.05,N,1.95,K,A*2F

Здесь:

  • 268.09 — курс на истинный полюс в градусах;

  • T — флаг достоверности курса (T — True, F — False);

  • Поле отсутствует — магнитное склонение в градусах;

  • M — магнитный;

  • 1.05 N — скорость в узлах;

  • 1.95 K — скорость в км/час;

  • A — автономный способ вычисления скорости и курса

  • *2F — контрольная сумма строки

Другие возможные способы вычисления скорости и курса:

  • A — автономный;

  • D — дифференциальный;

  • E — аппроксимация;

  • M — фиксированные данные;

  • N — недостоверные данные

Точность местоположения ACCURACY

Сообщение $GPACCURACY содержит информацию о точности местоположения:

$GPACCURACY,29.1*32

В данном случае точность — 29.1 метра.

Детальная информация о спутниках GSV

Интересны сообщения $GPGSV и $GLGSV:

$GPGSV,3,3,11,02,18,048,17,23,15,302,,21,15,032,25*4D
$GLGSV,3,1,10,77,75,312,,76,47,071,22,67,42,244,,68,38,314,*66

Анализируя эти сообщения, можно получить детальную информацию о спутниках — количество видимых спутников, их номера, возвышение, азимут и значение отношения «сигнал — шум » для каждого спутника.

Каждое такое сообщение может содержать информацию максимум о четырех спутниках. Рассмотрим первую строку $GPGSV, содержащую данные о спутниках GPS:

  • 3 — общее количество сообщений, содержащих информацию о спутниках;

  • 3 — номер данного сообщения из общего количества сообщений (в данном случае это третье сообщение);

  • 11 — общее количество спутников в сообщении;

  • 02,18,048 — информация о первом спутнике: номер (02), угол возвышения в градусах (18), азимут в градусах (048);

  • 17,23,15 — информация о втором спутнике: номер (17), угол возвышения (23), азимут (15);

  • 302 — соотношение сингал/шум в dBHz для второго спутника;

  • 21,15,032 — информация о третьем спутнике: номер (21), угол возвышения (15), азимут (032);

  • 25 — сингал/шум в dBHz для третьего спутника;

  • *4D —контрольная сумма для проверки целостности сообщения

Второе сообщение передает информацию о спутниках ГЛОНАСС:

  • 3 — общее количество сообщений, содержащих информацию о спутниках;

  • 1 — номер данного сообщения из общего количества сообщений (в данном случае это первое сообщение);

  • 10 — общее количество спутников в сообщении;

  • 77,75,312 — информация о первом спутнике: номер (77), угол возвышения в градусах (75), азимут в градусах (312);

  • 76,47,071 — информация о втором спутнике: номер (76), угол возвышения (47), азимут (71);

  • 22,67,42 — информация о третьем спутнике: номер (22), угол возвышения (67), азимут (42):

  • 244 — сингал/шум в dBHz для третьего спутника;

  • 68,38,314  информация о четвертом спутнике: номер (68), угол возвышения (38), азимут (314);

  • *66 — контрольная сумма для проверки целостности сообщения

Как видите, сингал/шум в dBHz здесь указан только для третьего спутника ГЛОНАСС.

Команды PMTK для управления модулем навигации

Ваш модуль GSM/GPRS/GNSS Bluetooth HAT может не только передавать в микрокомпьютер описанные выше сообщения NMEA с информацией о координатах и спутниках, но и получать команды управления PMTK.

Команды PMTK передаются в модуль GSM/GPRS/GNSS Bluetooth HAT с помощью команды AT+CGNSCMD с параметрами.

Хотя в документации на модуль параметры PMTK не описаны, вы можете воспользоваться руководством NMEA Manual based on MediaTek chipset For u-blox, Fastrax IT500 series GPS/GNSS modules или MT3333 Platform NMEA Message Specification For GPS+GLONASS_V1.00.pdf.

Должны предупредить, что эксперименты, описанные в этом разделе, вы проводите на свой страх и риск.

С помощью следующих команд задается спутниковая система, от которой нужно получать сообщения NMEA:

  • AT+CGNSCMD=0,"$PMTK353,1,1*37" — инструктирует модуль передавать данные и от GPS, и от ГЛОНАСС;

  • AT+CGNSCMD=0,"$PMTK353,1,0*36" — задает режим, при котором модуль возвращает только данные от спутников GPS;

  • AT+CGNSCMD=0,"$PMTK353,0,1*36" — ограничивает получение данных системой ГЛОНАСС.

Числа 36 и 37 в параметрах команды PMTK представляют собой контрольные суммы сообщения.

Заметим, что, если для вычисления координат используются одновременно разные системы, например, GPS и ГЛОНАСС, точность вычисления будет выше, чем при работе только с одной из этих систем.

Эксперименты с этими командами будем проводить в режиме отправки сообщений NMEA в UART. Напомним, что для включения и выключения этого режима используются перечисленные ниже команды:

AT+CGNSTST=1
AT+CGNSTST=0

Сначала включим режим получения сообщений NMEA только от GPS и проверим результат:

AT+CGNSCMD=0,"$PMTK353,1,0*36"
AT+CGNSTST=1
$GPGGA,130915.000,5538.614XXX,N,03720.346XXX,E,1,7,1.27,288.066,M,14.738,M,,*54
$GPGSA,A,3,06,28,12,11,25,29,20,,,,,,1.57,1.27,0.92*0F
$GPGSV,3,1,11,25,79,215,16,12,53,133,14,11,51,075,22,29,46,250,17*7C
$GPGSV,3,2,11,28,38,292,20,20,25,109,20,36,25,196,26,06,24,045,42*72
$GPGSV,3,3,11,31,22,317,,05,04,140,,04,04,005,*4F
$GPRMC,130915.000,A,5538.614XXX,N,03720.346XXX,E,0.76,59.22,120224,,,A*54
$GPVTG,59.22,T,,M,0.76,N,1.40,K,A*05
$GPACCURACY,29.9*3A

В сообщениях $GPGGA и $GPRMC префикс GP означает, что данные получены от системы GPS.

Если включить режим получения сообщений GPS и ГЛОНАСС, то в зависимости от доступности спутников в сообщениях NMEA будет информация от одной или обеих систем навигации.

AT+CGNSCMD=0,"$PMTK353,1,1*37"
AT+CGNSTST=1
$GNGGA,062820.000,5538.606XXX,N,03720.330XXX,E,1,7,1.28,312.976,M,14.738,M,,*47
$GPGSA,A,3,20,17,08,30,07,,,,,,,,1.54,1.28,0.84*0D
$GLGSA,A,3,87,78,,,,,,,,,,,1.54,1.28,0.84*19
$GPGSV,4,1,13,30,71,100,18,14,66,176,13,13,60,285,,22,48,198,*73
$GPGSV,4,2,13,07,38,094,25,15,29,306,15,05,28,253,,08,26,049,35*79
$GPGSV,4,3,13,17,08,155,18,20,07,223,28,23,05,345,,27,04,019,*79
$GPGSV,4,4,13,18,01,319,*48
$GLGSV,3,1,09,79,74,255,,69,64,222,,78,48,054,37,70,30,324,*69
$GLGSV,3,2,09,68,23,174,,87,22,031,31,80,19,242,,88,13,085,*64
$GLGSV,3,3,09,86,07,342,*50
$GNRMC,062820.000,A,5538.606XXX,N,03720.330XXX,E,0.00,286.63,130224,,,A*77
$GNVTG,286.63,T,,M,0.00,N,0.00,K,A*2A
$GPACCURACY,12.3*38

В данном случае в сообщениях $GNGGA и $GNRMC есть префикс GN, что соответствует спутниковой системе ГЛОНАСС.

Ваша программа может анализировать префиксы и использовать данные, полученные от нужной вам системы навигации.

Другие полезные команды

Рассмотрим несколько полезных AT-команд для работы с модулем GSM/GPRS/GNSS Bluetooth HAT.

Определение версии GNSS

Команда AT+CGNSVER позволит вам определить версию GNSS модуля навигации:

AT+CGNSVER
OK
AXN_5.10_3333_17081100,0000,B07V01SIM868_11

Эта команда может пригодиться, например, при отладке, при общении со службой поддержки или в профильных форумах.

Определение последнего проанализированного предложение NMEA

Команда AT+CGNSSEQ полезна, когда требуется ограничить объем передаваемых данных или когда необходимо сохранить определенные типы информации о GNSS в памяти устройства. С ее помощью можно выбрать определенные предложения NMEA для обработки, фильтрации или сохранения в памяти устройства.

Эта команда задает строку NMEA, после получения которой формируется содержимое для выдачи данных командой AT+CGNSINF.

Команда AT+CGNSSEQ? позволит вам узнать текущую настройку:

AT+CGNSSEQ?
+CGNSREQ: RMC

При изменении установки в качестве параметра n нужно передать команде необходимую последовательность предложений NMEA:

AT+CGNSSEQ=n

Сделаем такую настройку для получения только информации о спутниках:

AT+CGNSSEQ=GSV

После этого введем команду получения координат AT+CGNSINF:

AT+CGNSINF
+CGNSINF: 1,,,,,,,,,,,,,,,,8,,35,,

Теперь команда AT+CGNSINF выдает нам только статус GNSS, количество использованных спутников ГЛОНАСС, а также соотношение сигнал/шум в dBHz:

  • gnss_status;

  • glonass_satellites_used;

  • c_n0_max

Ограничим выдачу информацией об активных спутниках:

AT+CGNSSEQ=GSA
OK
AT+CGNSINF
+CGNSINF: 1,,,,,,,,,,1.3,1.5,0.9,,,,,,,,

Теперь в ответ на команду AT+CGNSINF мы получим значения hdop, pdop и vdop, имеющие отношение к точности фиксации местоположения (табл.1).

Испытаем такие команды:

AT+CGNSSEQ=GGA
OK
AT+CGNSINF
+CGNSINF: 1,1,20240210131346.000,55.642XXX,37.337XXX,214.816,1.96,259.0,1,,0.9,1.3,0.9,,11,10,9,,34,,
OK
AT+CGNSSEQ=RMC
OK
AT+CGNSINF
+CGNSINF: 1,1,20240210131419.000,55.643XXX,37.338XXX,216.208,3.00,59.7,1,,6.0,6.1,0.9,,10,5,9,,31,,

Как видите, здесь мы получили от команды AT+CGNSINF одинаковые значения.

Настройка параметров навигации GNSS

Команда AT+CGNSINFIX предназначена для настройки параметров навигации (fix parameters of GNSS navigation information statement), но описана в документации не очень подробно. В интернете, к сожалению, также не удалось найти никакой информации или примеров использования этой команды.

Для изучения команды AT+CGNSINFIX давайте проведем эксперимент. Сначала узнаем, какое значение параметров установлено по умолчанию:

AT+CGNSINFIX?
+CGNSINFIX: 0

Видно, что по умолчанию установлено нулевое значение.

Согласно документации, можно установить только два значения — 0 и 1. Значение 0 обозначено в документации как Fix off, значение 1 — Fix on.

Попробуем изменить значение на 1 и посмотрим, как изменятся результаты работы команды AT+CGNSINF:

AT+CGNSINFIX?
+CGNSINFIX: 0
OK
AT+CGNSINF
+CGNSINF: 1,1,20240209084715.000,55.642XXX,37.337XXX,215.105,0.00,71.6,1,,1.8,2.0,0.9,,13,6,10,,32,,
OK
AT+CGNSINFIX=1
OK
AT+CGNSINF
+CGNSINF: 1,1,20240209084730.000,55.642XXX,37.338XXX,215.330,0.33,71.6,1,,1.4,1.7,0.9,,23,5,2,,33,,
OK 

Сверяя эти данные с табл. 1, видим, что после команды AT+CGNSINFIX=1 количество спутников в поле зрения приемника увеличилось с 13 до 23. Однако количество использованных спутников GNSS уменьшилось с 6 до 5, а количество использованных спутников ГЛОНАСС — уменьшилось с 10 до 2.

Параметры точности немного улучшились. Если раньше hdop, pdop и vdop были равны 1.8,2.0,0.9, то теперь — 1.4,1.7,0.9, соответственно.

Получение GPS-координат через GSM

Если навигационные спутники недоступны, есть вариант получения координат местоположения через GSM.

Ниже представлена необходимая последовательность команд:

AT+SAPBR=3,1,"Contype","GPRS"
OK
AT+SAPBR=3,1,"APN","internet.mts.ru"
OK
AT+SAPBR=1,1
OK
AT+SAPBR=2,1
+SAPBR: 1,1,"11.174.194.220"
OK
AT+CLBSCFG=0,1
+CLBSCFG: 0,1,""
OK
AT+CLBSCFG=0,2
+CLBSCFG: 0,2,2
OK
AT+CLBSCFG=0,3
+CLBSCFG: 0,3,"lbs-simcom.com:3002"
OK
AT+CLBSCFG=1,3,"lbs-simcom.com:3002"
OK
AT+CLBS=1,1
+CLBS: 0,37.331XXX,55.635XXX,550
OK

Первые три команды устанавливают тип соединения (Contype) для передачи данных через GPRS, устанавливают точку доступа APN для подключения к оператору мобильной связи, а затем открывают соединение.

С помощью команды AT+SAPBR=2,1 можно проверить, что соединение было установлено, и модулю выделен адрес IP в сети мобильного оператора (у вас, скорее всего, будет другой адрес IP):

AT+SAPBR=2,1
+SAPBR: 1,1,"11.174.194.220"

Если адрес выделен, можно приступать к получению координат местоположения устройства, определенный через базовые станции мобильного оператора.

Команда AT+CLBSCFG=0,3 показывает текущий сервер компании Simcom, возвращающий местоположение, определенное через GPRS:

AT+CLBSCFG=0,3
+CLBSCFG: 0,3,"lbs-simcom.com:3002"

По умолчанию установлен бесплатный сервер lbs-simcom.com, работающий на порту 3002. При необходимости с помощью следующей команды можно задать адрес этого или другого сервера:

AT+CLBSCFG=1,3,"lbs-simcom.com:3002"

Доступно еще два сервера, но за их использование придется заплатить:

  • lbs-simcom.com:3000

  • lbs-simcom.com:3001

Для получения координат и их точности используется команда AT+CLBS=1,1:

AT+CLBS=1,1
+CLBS: 0,37.331XXX,55.635XXX,550

Учтите, что команда возвращает долготу, широту и точность определения местоположения, которая обычно очень невысокая. Тем не менее, приблизительные координаты этим методом определить можно.

Если передавать команде AT+CLBS другие параметры, можно получить от нее различную информацию.

Например, такая команда возвращает счетчик количества запросов доступа (access times):

AT+CLBS=3,1
+CLBS: 5

Следующая команда возвращает дополнительно дату и время:

AT+CLBS=4,1
+CLBS: 0,37.331XXX,55.635XXX,550,24/02/09,15:04:06

В библиотеке  https://github.com/AlexandreFrolov/rover_connect2/blob/main/rover_connect.py определена функция getGsmLocations, которая возвращает координаты и точность:

def getGsmLocations(self):
    GSMCGNSInfo = namedtuple("GSMCGNSInfo", [ "latitude", "longitude", "positioning_accuracy" ])
    ip_address = self.connect_gprs(self.apn)
    if ip_address is False:
        if not keep_session:
            self.disconnect_gprs()
            return False

    cmd = "AT+CLBSCFG=0,1"
    data = self.command_data_ok(cmd)   
    cmd = "AT+CLBSCFG=0,2"
    data = self.command_data_ok(cmd)   
    cmd = "AT+CLBSCFG=0,3"
    data = self.command_data_ok(cmd)   
    cmd = "AT+CLBSCFG=1,3,\"lbs-simcom.com:3002\""
    self.command_ok(cmd)   
    cmd = "AT+CLBS=1,1"
    data = self.command_data_ok(cmd)   
    pattern = r'\+CLBS: (\S+)'
    matches = re.findall(pattern, data)
    if matches:
        coordinates = matches[0].split(',')
        if len(coordinates) == 4:
            mode, longitude, latitude, positioning_accuracy = coordinates
        else:
            raise Exception(f"getGsmLoctions failed, Not enough coordinates, data: {data}")
    else:
        raise Exception(f"getGsmLoctions failed, Coordinates not found")
    self._Latitude = latitude
    self._Longitude = longitude
    self._Altitude = positioning_accuracy
    gsm_cgns_info = GSMCGNSInfo(latitude=latitude, longitude=longitude, positioning_accuracy=positioning_accuracy)
    if not self.disconnect_gprs():
        self.command('AT+HTTPTERM\n')
        self.disconnect_gprs()
        return False        
    return(gsm_cgns_info)

Сбор телеметрии

Ранее из статьи Передаем данные от Repka Pi и Raspberry Pi в интернет по GSM связи через модуль SIM868 и GPRS вы узнали, как с помощью упомянутого модуля обмениваться данными между микрокомпьютером Repka Pi с JSON-сервисом, доступным в интернете, по каналу GPRS.

Там мы рассказали о программе get-telemetry.py, собирающей самую разную информацию и передающую ее JSON-сервису, и привели исходный код самого сервиса.

Если модуль зафиксировал свое положение с помощью сети спутников GNSS, то в этой информации будут показаны координаты устройства, в котором установлен этот модуль:

root@Repka-Pi:~/rover_connect2# python3 get-telemetry.py
{
  "sim868cfg": {
    "Flash ID": "Device Name:SERIAL§FLASH§MTKSIP§6261§SF§32§01",
    "Hw revision": "Revision:1418B06SIM868M32§BT",
    "Date": "2024-02-09 15:24:01",
    "Operator": "Mts",
    "Service provider": "MTS RUS",
    "Signal strength": "62.5%",
    "Temperature": "32.37 degrees",
    "MSISDN": "Unstored MSISDN",
    "Battery Voltage": "4.059 V",
    "IMSI": "250016442143869",
    "ICCID": "89701010064421438699",
    "Unit Name": "SIM868 R14.18",
    "Balance": "182,48 rub.",
    "SIM is registered": true
  },
  "gnss": {
    "gnss_status": "1",
    "fix_status": "1",
    "utc_datetime": "20240209122406.000",
    "latitude": "55.642XXX",
    "longitude": "37.338XXX",
    "msl_altitude": "198.679",
    "speed": "0.00",
    "course": "357.9",
    "fix_mode": "1",
    "reserved_1": "",
    "hdop": "3.9",
    "pdop": "4.1",
    "vdop": "1.0",
    "reserved_2": "",
    "satellites_in_view": "12",
    "gnss_satellites_used": "5",
    "glonass_satellites_used": "10",
    "reserved_3": "",
    "c_n0_max": "35",
    "hpa": "",
    "vpa": ""
  },
  "gsm_gnss": {
    "latitude": "55.635XXX",
    "longitude": "37.331XXX",
    "positioning_accuracy": "550"
  }
}

При этом будут показаны также координаты (неточные) и точность их определения, полученные через GSM. Вся эта информация будет продублирована в консоли JSON-сервера.

Полезные материалы

Итоги

Из этой статьи Вы узнали, как с на базе одноплатного мини компьютера Repka Pi с помощью модуля GSM/GPRS/GNSS Bluetooth HAT, созданного на базе SIM868, можно получать спутниковые координаты и другую информацию от систем навигации GNSS, таких как GPS и ГЛОНАСС - высоту, скорость и направление движения, данные о точности и спутниках с помощью программы, составленной на Python, а также через AT-команды.

Помимо разовых запросов данных с блока навигации, установленном в модуле мы с Вами разобрали, как настраивать автоматическое получение сообщений URC при обновлении данных навигации и сообщений NMEA в формате передачи данных между корабельными приборами.

Если данные спутников навигации недоступны, но в модуле установлена SIM-карта и работает GPRS, вы сможете определить примерные координаты через сеть GSM.

Теперь вы сможете создать на базе Repka Pi и модуля GSM/GPRS/GNSS Bluetooth HAT свою систему сбора телеметрии, включающую в себя не только данные о состоянии самого модуля, но и точные координаты места положения.

Всем успешных и творческих проектов области телеметрии, робототехники и навигации!

Использованные изображения

https://commons.wikimedia.org/wiki/File:Physical_Map_of_Africa_(2021).svg

https://www.flaticon.com/ru/free-icons/map-mark

Отметка на карте иконки от Tanah Basah - Flaticon

Tags:
Hubs:
Total votes 15: ↑14 and ↓1+20
Comments1

Articles