Организация ведения журнала работы полезной нагрузки и бортовой аппаратуры - 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
Рисунок 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
Рисунок 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
Рисунок 3. Pixhawk 4 |
Все эти устройства будут объединены с БАС и NanoPi NEO, как показано на рисунке 4.
Рисунок 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).
Рисунок 5. Диаграмма размещения (развёртывания) взаимодействия модулей |
В основном файле в функции main работает бесконечный цикл, опрашивающий HackRF, который работает в отдельном потоке. В этом потоке с заданным шагом принимается сигнал приёмником и обрабатывается детектором. Если детектор по уровню сигнала определяет возникновение события, то приложение извлекает данные телеметрии из MAVLink и обращается к камере для съёмки изображения. Затем в файл журнала записываются данные о новом событии. После этого файл журнала сохраняется. Этот процесс продолжается до тех пор, пока программа не будет остановлена (см. рис. 6).
Рисунок 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).
Рисунок 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).
Рисунок 8. Генерация сигнала на частоте 2.402 ГГц |
Рисунок 9. Журнал полётного задания |
Рисунок 10. Изображения журнала полётного задания |
В журнале содержатся записи с приложенными изображениями. В первой строке указаны заголовки столбцов, разделённые запятыми, а сами записи также отделены запятыми. Значения столбцов представлены в таблице 1.
Таблица 1. Значения столбцов журнала полётного задания
Столбец | Значение |
---|---|
ID | Идентификатор (номер) записи |
t | [мс] Временная метка (время с момента загрузки системы) |
x | [м] Положение по X (локальные координаты) |
y | [м] Положение по Y (локальные координаты) |
z | [м] Положение по Z (локальные координаты) |
vx | [м/с] Скорость по X (локальные координаты) |
vy | [м/с] Скорость по Y (локальные координаты) |
vz | [м/с] Скорость по Z (локальные координаты) |
roll | [рад] Продольная ось (ось крена) |
pitch | [рад] Поперечная ось (боковая ось, ось тангажа) |
yaw | [рад] Вертикальная ось (ось рыскания) |
I | Синфазная составляющая сигнала |
Q | Квадратурная составляющая сигнала |
Image | Имя файла изображения |
6. Заключение
В заключение можно отметить, что были успешно выполнены следующие задачи:
- Изучены способы взаимодействия модулей HackRF, ELP 8MP USB Camera Module USB2.0 и Pixhawk 4 с бортовым компьютером NanoPi NEO при использовании протокола MAVLink.
- Разработана программа, которая интегрирует модули устройств (полезную нагрузку БАС) с бортовым компьютером NanoPi NEO для обнаружения и детектирования сигнала и сбора данных с датчиков устройств.
- Получены результаты выявления события и составления соответствующего журнала с приложенными изображениями на бортовом компьютере NanoPi NEO.
7. Ссылки
- MAVLink Developer Guide. URL: https://mavlink.io/en/
- Официальный сайт ROS. URL: https://docs.ros.org/
- Документация HackRF One. URL: https://hackrf.readthedocs.io/en/latest/hackrf_one.html
- Программное обеспечение HackRF. URL: https://hackrf.readthedocs.io/en/latest/installing_hackrf_software.html
- Libusb документация. URL: https://libusb.info/
- 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
- Официальный сайт OpenCV. URL: https://opencv.org/
- Официальный сайт Pixhawk. URL: https://pixhawk.org/
- Pixhawk 4. URL: https://holybro.com/products/pixhawk-4
- GitHub репозиторий на исходный пример интерфейса c_uart_interface_example URL: https://github.com/mavlink/c_uart_interface_example
- GitHub репозиторий разработанной программы c_uart_interface_example в RadioReceiver URL: https://github.com/Asevulon/RadioReceiver