Организация ведения журнала работы полезной нагрузки и бортовой аппаратуры - DRONE520/RF-BAS-COMMON GitHub Wiki

1. Введение

Необходимо разработать целостное приложение, объединяющее программу, обеспечивающую прием и обработку радиосигналов, и программу, обеспечивающую фотосъемку, которые будут эффективно обмениваться данными с минимальными задержками. Приложение должно обеспечивать доступ к Pixhawk через Mavlink. Также оно должно включать потоковые обращения к приемнику и к камере. В приложении также должен быть предусмотрен интерфейс, который представляет собой библиотеку для работы с MavLink 1(https://mavlink.io/en/).

Изначально планировалось разработать систему, основанную на полётном контроллере Pixhawk и NanoPi NEO, которые будут оснащены ROS и MavROS для обработки сообщений в рамках ROS 2(https://docs.ros.org/). В этом случае использовались бы ноды: publisher для публикации данных и listener для их прослушивания. Однако в данной работе предложено объединить компоненты в одно приложение на базе Mavlink.

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

2. Цель ведения журнала работы полезной нагрузки и бортовой аппаратуры

Беспилотная авиационная система (БАС) — это устройство, предназначенное для совершения полётов и решения различных задач в таких сферах, как аэрофотосъёмка, мониторинг, картографирование местности и другие. В рамках данной работы поставлена задача использования БАС в качестве разведчика РЭБ для исследования радиотехнических установок. Полётное задание заключается в следующем. Сначала осуществляется облет заданной траектории. В определенный момент детектор сигнала сработает и зафиксирует событие. С момента его обнаружения фиксируется уровень сигнала в нескольких точках до тех пор, пока он не покинет зону обнаружения. Приложение будет связывать телеметрические данные с этими событиями. Предполагая, что уровень сигнала отражает расстояние, можно сказать, что чем ближе БАС подлетает, тем сильнее сигнал исходит от источника, а при удалении сигнал от источника ослабевает.

В процессе выполнения полётного задания будет вестись журнал, в который будут заноситься все события с фотографиями. По возвращении БАС журнал можно будет забрать. Этот журнал позволит провести анализ местности. Из каждой точки, в которой было зафиксировано событие, можно будет провести круг: когда сигнал был максимальным, круг будет маленьким, а когда ослабнет — большим. Хотя в этом случае нельзя говорить о точных данных, но можно понять: если сигнал ослабел вдвое, значит, БАС находится на расстоянии, в два раза дальше от источника сигнала. Таким образом, подобрав размеры всех этих кругов, можно сопоставить их так, чтобы они пересекались в одной точке. Они, конечно, могут пересекаться в разных местах, но все пересечения будут происходить только в тех местах, где находится объект. Можно использовать эту информацию, которая, пригодится не только для определения по фотографиям, где было максимальное приближение, но и для более точного анализа. Это следующая задача — обработка журнала.

3. Источники данных для журнала

1] HackRF One – это полудуплексный широкополосный программно-определяемый радиоприёмник (SDR), разработанный и выпущенный компанией Great Scott Gadgets. Устройство оснащено антенным портом SMA, портами SMA для ввода и вывода тактовых сигналов, а также портом USB 2.0 (см. рис. 1). HackRF One способен как передавать, так и принимать сигналы в частотном диапазоне от 1 МГц до 6 ГГц, обеспечивая максимальную выходную мощность до 15 дБм в зависимости от выбранного диапазона 3(https://hackrf.readthedocs.io/en/latest/hackrf_one.html). Для работы с данным устройством необходимо установить следующее программное обеспечение:

Программное обеспечение HackRF состоит из инструментов HackRF и библиотеки libhackrf. Инструменты HackRF представляют собой командные утилиты, которые позволяют взаимодействовать с устройством HackRF. Библиотека libhackrf является низкоуровневой и обеспечивает взаимодействие программного обеспечения на компьютере с HackRF 4(https://hackrf.readthedocs.io/en/latest/installing_hackrf_software.html).

Установка программного обеспечения HackRF на Linux: Ubuntu / Debian

sudo apt-get install hackrf

Libusb – это библиотека с открытым исходным кодом, которая предоставляет приложениям возможность управлять передачей данных на устройства USB и с них в системах Unix и не-Unix без необходимости использования драйверов в режиме ядра 5(https://libusb.info/).

Установка libusb на Linux: Ubuntu / Debian

sudo apt-get install libusb-1.0-0-dev
20250528_121149
Рисунок 1. HackRF One с подключённой антенной

2] ELP 8MP USB Camera Module USB2.0 – это компактная USB-камера для ПК и встраиваемых систем, обеспечивающая высокое качество снимаемых изображений за счёт 8-мегапиксельного сенсора Sony IMX179 (см. рис. 2). Интерфейс: USB 2.0. Рабочее напряжение: DC 5 В. Рабочий ток: 150~240 мА 6(http://www.elpcctv.com/elp-high-resolution-8-megapixel-imx179-mini-micro-usb-camera-with-28mm-lens-for-windows-linux-p-240.html). Для работы с данным устройством необходимо установить следующее программное обеспечение:

OpenCV – это библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым исходным кодом. OpenCV поддерживает C++, Python, Java и другие языки, что делает её универсальной для разработчиков 7(https://opencv.org/).

Установка библиотеки openCV на Linux: Ubuntu / Debian

sudo apt install libopencv-dev
20250528_121149
Рисунок 2. ELP 8MP USB Camera Module USB2.0

3] Pixhawk 4 – это полетный контроллер, на открытом стандарте FMUv6C 8(https://pixhawk.org/). Он поставляется с предустановленным автопилотом PX4 (см рис. 3). Микроконтроллер STM32F765 оснащен ядром Arm Cortex-M7, работающим на частоте до 216MHz МГц, имеет флэш-память объемом 2 МБ и оперативную память объемом 512 КБ. Номинальное напряжение: Рабочее напряжение: 4,75 ~ 6 В. Рабочий ток: 1,5 А 9(https://holybro.com/products/pixhawk-4). Датчики:

  • Акселерометр/гироскоп: ICM-20689
  • Акселерометр/гироскоп: BMI055/ICM-20602
  • Магнитометр: IST8310
  • Барометр: MS5611

Для работы с данным устройством необходимо установить следующее программное обеспечение:

MAVLink – это протокол информационного взаимодействия с БАС. MAVLink использует современный гибридный шаблон проектирования «publish-subscribe» и «point-to-point»: потоки данных отправляются / публикуются в виде тем, в то время как подпротоколы конфигурации, такие как протокол миссии или протокол параметров, работают по принципу «point-to-point» с ретрансляцией. MAVLink распространяется под LGPL лицензией в виде генератора библиотек под различные языки, в том числе С/C++ библиотеки 10(https://github.com/mavlink/c_uart_interface_example).

Установка MAVLink на Linux: Ubuntu / Debian

sudo apt install python3 python3-pip
git clone https://github.com/mavlink/mavlink.git --recursive
python3 -m pip install -r pymavlink/requirements.txt
20250528_121149
Рисунок 3. Pixhawk 4

Все эти устройства будут объединены с БАС и NanoPi NEO, как показано на рисунке 4.

13
Рисунок 4. Схема взаимодействия устройств с БАС и NanoPi NEO

4. Организация ведения журнала

В приложении несколько потоков: один для работы с радиоустройством, поток для обработки изображения, и главный поток, который будет вести журнал событий. Поток обработки изображения будет переделан в виде библиотеки функций. Первый запуск системы должен быть синхронным: он должен инициировать процесс и вернуть управление. Основное приложение вызовет эту библиотечную функцию и получит информацию, извлеченную из камеры. Получение включает в себя инициализацию записи и извлечение параметров. Эти параметры необходимо фиксировать в журнале. Соответственно, основное приложение будет вызывать эти функции, а уже внутри программа может управлять потоками по нашему усмотрению.

Интерфейс MAVLink для систем Unix, позволяет осуществлять связь между Pixhawk и внешним компьютером. На основе примера интерфейса MAVLink c_uart_interface_example 10(https://github.com/mavlink/c_uart_interface_example) (который позволит получить одно сообщение MAVLink) было создано приложение c_uart_interface_example 11(https://github.com/Asevulon/RadioReceiver), предназначенное для подключения к устройствам и ведения журнала (см. рис 5).

image
Рисунок 5. Диаграмма размещения (развёртывания) взаимодействия модулей

В основном файле в функции main работает бесконечный цикл, опрашивающий HackRF, который работает в отдельном потоке. В этом потоке с заданным шагом принимается сигнал приёмником и обрабатывается детектором. Если детектор по уровню сигнала определяет возникновение события, то приложение извлекает данные телеметрии из MAVLink и обращается к камере для съёмки изображения. Затем в файл журнала записываются данные о новом событии. После этого файл журнала сохраняется. Этот процесс продолжается до тех пор, пока программа не будет остановлена (см. рис. 6).

image
Рисунок 6. Блок-схема организации ведения журнала

Структура программы:

  • c_uart_interface_example/
    • autopilot_interface.cpp / .h - функции интерфейса автопилота для отправки и получения команд автопилоту через MAVLink

    • mavlink_control.cpp / .h - процесс автономного управления с помощью mavlink. Этот процесс подключает внешнее UART-устройство MAVLink для отправки и получения данных

    • generic_port.cpp - общее (абстрактное) определение интерфейса (порта)

    • serial_port.cpp / .h - функции для открытия, закрытия, чтения и записи через последовательные порты

    • udp_port.cpp / .h - функции для открытия, закрытия, чтения и записи через порты UDP

    • build.sh - скрипт для сборки приложения

    • libcamera.a - статическая библиотека для взаимодействия с камерой (инициализация, сохранение, отключение)

    • CMakeLists.txt - CMake для сборки c_uart_interface_example

    • journal.txt - журнал с телеметрией

    • build/journal/output-yyyy-mm-dd-hh_mm_ss.png's - изображения для журнала

    • CameraLib/

      • camera.h - заголовочный файл для вызова функций libcamera.a
    • logs/journal.txt - журнал с телеметрией

    • mavlink/include/ - зависимости MAVLink

    • MyHackRF/

      • builder.py - для сборки приложения MyHackRF со всеми библиотеками

      • CMakeLists.txt - для сборки MyHackRF

      • inc/

        • Detecter.h - заголовочный файл обнаружителя\детектора
        • general.h - заголовочный файл обработчика сигнала
        • Journal.h - заголовочный файл журнала
        • Receiver.h - заголовочный файл приёмник
      • libs/comphackrf/inc/

        • hackrf.h - заголовочный файл библиотеки libhackrf
      • src/

        • Detecter.cpp - обнаружитель\детектор
        • general.cpp - обработчик сигнала
        • Journal.cpp - журнал
        • main.cpp - точка входа в программу
        • Receiver.cpp - приёмник

5. Экспериментальная отработка ведения журнала

Чтобы проверить работоспособность вышеописанной программы, нужно собрать аппаратную часть. Для этого необходимо собрать схему, показанную на рисунке 4, используя доступные устройства, бортовой компьютер NanoPi NEO и БАС (см. рис. 7).

20250528_140338
Рисунок 7. Собранная схема взаимодействия устройств с БАС и NanoPi NEO

Перед тем как тестировать функциональность разработанной программы, следует убедиться в работоспособности интерфейса MAVLink c_uart_interface_example 10(https://github.com/mavlink/c_uart_interface_example). Попробуем получить сообщение MAVLink о телеметрии (см. пример 1).

OPEN PORT
Connected to /dev/ttyUSB0 with 57600 baud, 8 data bits, no parity, 1 stop bit (8N1)

START READ THREAD 

CHECK FOR HEARTBEAT
Found

GOT VEHICLE SYSTEM ID: 1
GOT AUTOPILOT COMPONENT ID: 50

INITIAL POSITION XYZ = [ 8.2935 , -1.1447 , -0.7609 ] 
INITIAL POSITION YAW = 2.1539 

START WRITE THREAD 

ENABLE OFFBOARD MODE

SEND OFFBOARD COMMANDS
POSITION SETPOINT XYZ = [ 3.2935 , -6.1447 , -0.7609 ] 
POSITION SETPOINT YAW = 2.1539 
0 CURRENT POSITION XYZ = [  8.2935 , -1.1447 , -0.7609 ] 
1 CURRENT POSITION XYZ = [  8.2935 , -1.1447 , -0.7609 ] 
2 CURRENT POSITION XYZ = [  8.2524 , -1.1444 , -0.7667 ] 
3 CURRENT POSITION XYZ = [  8.2205 , -1.1431 , -0.7747 ] 
4 CURRENT POSITION XYZ = [  8.1920 , -1.1421 , -0.7737 ] 
5 CURRENT POSITION XYZ = [  8.1920 , -1.1421 , -0.7737 ] 
6 CURRENT POSITION XYZ = [  8.1539 , -1.1414 , -0.7847 ] 
7 CURRENT POSITION XYZ = [  8.1522 , -1.1417 , -0.7820 ] 

DISABLE OFFBOARD MODE

READ SOME MESSAGES 
Got message LOCAL_POSITION_NED (spec: https://mavlink.io/en/messages/common.html#LOCAL_POSITION_NED)
    pos  (NED):  8.152975 -1.141093 -0.784075 (m)
Got message HIGHRES_IMU (spec: https://mavlink.io/en/messages/common.html#HIGHRES_IMU)
    ap time:     3611390110 
    acc  (NED):   0.005503  0.044659 -9.740363 (m/s^2)
    gyro (NED):  -0.003064  0.003857  0.000005 (rad/s)
    mag  (NED):  -0.117767 -0.335362 -0.253204 (Ga)
    baro:        1020.519958 (mBar) 
    altitude:    -60.341393 (m) 
    temperature: 46.779999 C 

CLOSE THREADS

CLOSE PORT

Пример 1. Вывод телеметрии MavLink

Удостоверившись, что приложение с интерфейсом MAVLink c_uart_interface_example 10(https://github.com/mavlink/c_uart_interface_example) функционирует корректно, можно переходить к тестированию разработанной программы c_uart_interface_example 11(https://github.com/Asevulon/RadioReceiver). В качестве источника сигнала будет применяться высокочастотный генератор сигналов Keysight N9310A. Сгенерируем сигнал на частоте 2.402 ГГц и попробуем сформировать журнал событий в процессе обнаружения сигнала (см. рис. 8-10).

5
Рисунок 8. Генерация сигнала на частоте 2.402 ГГц
18
Рисунок 9. Журнал полётного задания
19
Рисунок 10. Изображения журнала полётного задания

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

Таблица 1. Значения столбцов журнала полётного задания

Столбец Значение
ID Идентификатор (номер) записи
t [мс] Временная метка (время с момента загрузки системы)
x [м] Положение по X (локальные координаты)
y [м] Положение по Y (локальные координаты)
z [м] Положение по Z (локальные координаты)
vx [м/с] Скорость по X (локальные координаты)
vy [м/с] Скорость по Y (локальные координаты)
vz [м/с] Скорость по Z (локальные координаты)
roll [рад] Продольная ось (ось крена)
pitch [рад] Поперечная ось (боковая ось, ось тангажа)
yaw [рад] Вертикальная ось (ось рыскания)
I Синфазная составляющая сигнала
Q Квадратурная составляющая сигнала
Image Имя файла изображения

6. Заключение

В заключение можно отметить, что были успешно выполнены следующие задачи:

  1. Изучены способы взаимодействия модулей HackRF, ELP 8MP USB Camera Module USB2.0 и Pixhawk 4 с бортовым компьютером NanoPi NEO при использовании протокола MAVLink.
  2. Разработана программа, которая интегрирует модули устройств (полезную нагрузку БАС) с бортовым компьютером NanoPi NEO для обнаружения и детектирования сигнала и сбора данных с датчиков устройств.
  3. Получены результаты выявления события и составления соответствующего журнала с приложенными изображениями на бортовом компьютере NanoPi NEO.

7. Ссылки

  1. MAVLink Developer Guide. URL: https://mavlink.io/en/
  2. Официальный сайт ROS. URL: https://docs.ros.org/
  3. Документация HackRF One. URL: https://hackrf.readthedocs.io/en/latest/hackrf_one.html
  4. Программное обеспечение HackRF. URL: https://hackrf.readthedocs.io/en/latest/installing_hackrf_software.html
  5. Libusb документация. URL: https://libusb.info/
  6. ELP 8MP USB Camera Module USB2.0 URL: http://www.elpcctv.com/elp-high-resolution-8-megapixel-imx179-mini-micro-usb-camera-with-28mm-lens-for-windows-linux-p-240.html
  7. Официальный сайт OpenCV. URL: https://opencv.org/
  8. Официальный сайт Pixhawk. URL: https://pixhawk.org/
  9. Pixhawk 4. URL: https://holybro.com/products/pixhawk-4
  10. GitHub репозиторий на исходный пример интерфейса c_uart_interface_example URL: https://github.com/mavlink/c_uart_interface_example
  11. GitHub репозиторий разработанной программы c_uart_interface_example в RadioReceiver URL: https://github.com/Asevulon/RadioReceiver