СПО бортовой вычислительной платформы - DRONE520/DRONE520-main GitHub Wiki
Беспилотные летательные аппараты (БПЛА) — бурно развивающаяся область техники, выполняющая широкий спектр как военных, так и гражданских задач. В последние годы большую популярность приобрели мультироторные БПЛА (мультикоптеры) по причине доступности и простоты эксплуатации. Мультикоптеры используются для доставки грузов, фото- и видеосъемки, поисковых работ, наблюдения за природными явлениями и многого другого.
В данной работе описан проект, цель которого организовать возможность проведения вычислений для анализа кадров видеопотока. Разработка устройства от проектирования и до готового кода велась самостоятельно и в ней, кроме всего прочего, были использованы источники с открытым исходным кодом. Для реализации данного СПО используется одноплатный компьютер NanoPi NEO и библиотека компьютерного зрения OpenCV. Устройство является прототипом, но имеет перспективы к развитию и реальному использованию.
Для достижения поставленной цели необходимо было выполнить следующие задачи:
- Выбрать и установить операционную систему для целевой платформы;
- Освоить технологию удалённой отладки программ на целевой платформе;
- Произвести интеграцию разрабатываемого программного обеспечения с библиотекой компьютерного зрения OpenCV;
- Разработать ПО для нахождения заданной метки в непрерывном видеопотоке посредством контурного анализа.
NanoPi NEO (256Mb) - одноплатный компьютер на процессоре Allwinner H3 от компании FriendlyARM, в который входят четыре вычислительных ядра Cortex A7 с тактовой частотой до 1,2 ГГц. Работа производится под управлением Android 4.4, Ubuntu, Debian. Имеет 256 МБ DDR3 оперативной памяти SDRAM, поддерживает карты памяти (microSD) ёмкостью до 64 гигабайт.
Мини-компьютер оснащен графическим ускорителем Mali-400MP2, позволяющим декодировать 4К-видео формата H.265/HEVC, частота воспроизведения - до 30 кадров в секунду. NanoPi NEO отлично подходит для построения встраиваемых систем управления и систем контроля.
В верхней части плата оснащена Ethernet, USB хостом и микро USB (питание) портами, а также микро SD слотом и разъемами ввода/вывода (рис. 1). На задней панели расположены две основные микросхемы: четыре вычислительных ядра Cortex A7 и чип Samsung RAM.
Рисунок 1. Интерфейс NanoPi NEO (256Mb)
Диаграмма контактов подключения приведена на рис. 2.
Рисунок 2. Диаграмма контактов подключения
Для получения более подробной информации о внутреннем устройстве NanoPi NEO можно воспользоваться официальной документацией [1].
Плата NanoPi NEO поддерживает ряд операционных систем:
- FriendlyCore (UbuntuCore-16.04);
- Armbian;
- H3Droid;
- DietPi;
- Lakka;
- Kali;
- OpenWrt;
- FriendlyELEC и т.д.
В качестве используемой операционной системы была выбрана ОС Linux Ubuntu 16.04 (FriendlyCore). Описание развертывания ОС приведено в документации к проекту [2].
Для проверки работоспособности платы необходимо подключиться к ней по ssh. После успешной авторизации в терминале появится информация следующего вида (рис. 3):
Рисунок 3. Пример терминального окна после подключения к плате по ssh
Кросс-компиляция - это процесс компиляции кода для определённой компьютерной системы (целевой) из другой системы (хостовой). Метод полезен, когда целевая система слишком мала для размещения компилятора и всех соответствующих файлов.
Для кросс-компиляции под ARM требуются набор инструментов (англ. toolchain) и эмулятор платформы либо реальная целевая платформа (NanoPi NEO). Часто в качестве toolchain используют cross-toolchain. В этом случае подразумевается, что программа компилируется на персональном компьютере с процессором архитектуры x86-x64, а результирующий бинарный код должен исполняться на процессоре другой архитектуры, например, ARM. Стоит сказать, что эти наборы инструментов создаются под заданную триаду:
- Build. Указывает на какой платформе собирается toolchain.
- Host. Указывает на какой платформе работает toolchain.
- Target. Указывает под какую целевую платформу toolchain будет собирать итоговую программу.
Самые распространенные случаи типов toolchain указаны в таб. 1.
Таблица 1. Распространенные типы toolchain.
Build | Host | Target |
---|---|---|
x86-64 | x86-64 | ARM |
x86-64 | x86-64 | aarch64 |
x86-64 | x86-64 | mips |
Обычно toolchain генерируют и используют на intel-совместимых персональных компьютерах, а результат компиляции запускают на arm, aarch64, mips, nios, zinq и т.д.
Так, например, существует open-source платформа crosstool-ng [3] для генерации собственного toolchain в среде Linux (для известных архитектур). Crosstool-ng строит toolchain с использованием GCC, GNU Compiler Collection [4] - набор компиляторов C, C++, Objective-C, Fortran, Ada, Go, D и стандартных библиотек типа libstd++ и других. Другим возможным вариантом набора инструментов является собранный toolchain [5], поставляемый с официальным образом операционной системы.
Для данного СПО использовался пакет arm-linux-gnueabihf [6]. Установка всех последующих зависимостей требует наличие интернета на используемой системе. Установка набора инструментов осуществляется с помощью команд:
user@user:~$ sudo apt update
user@user:~$ sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
Установка обязательных зависимостей осуществляется с помощью команд:
user@user:~$ sudo apt-get install gcc flex make texinfo help2man -y
user@user:~$ sudo apt-get install gawk libtool-bin libncurses5-dev libncurses5 g++ -y
Отладка кросс-компиляции осуществляется на простейшей программе, описанной в hello.cpp
:
#include <iostream>
int main() {
std::cout << "Hello, world!\n";
return 0;
}
Для компиляции вышеуказанной программы под ARM-систему требуется выполнить инструкцию:
user@user:~$ arm-linux-gnueabihf-g++ -o hello hello.cpp
После этапа кросс-компиляции необходимо отправить исполняемый файл на целевую платформу. Это можно сделать по SSH. Для копирования файлов по SSH в Linux-системах можно использовать утилиту scp
. Общий вид команды:
user@user:~$ scp [опция] [источник] [получатель]
Для того, чтобы отправить исполняемый файл на NanoPi необходимо выполнить команду:
user@user:~$ scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Пример команды:
user@user:~$ scp /home/hello [email protected]:/home
После выполнения команды в директории /home
на NanoPi появится скомпилированная программа hello
. Для запуска программы на исполнение необходимо выполнить:
user@user:~$ ./hello
Для осуществления удаленной отладки необходимо обеспечить наличие:
на хост машине:
- Eclipse IDE [7].
на целевой платформе NanoPi:
- gdbserver [8].
Организация технологии удаленной отладки описана в [9].
Одной из потенциальных задач бортовой вычислительной платформы является обработка изображений, полученных с помощью USB-камеры. Для ускорения процесса обработки необходимо интегрировать библиотеку компьютерного зрения OpenCV [10] в разрабатываемый проект.
Для использования OpenCV на плате NanoPi (платформа armhf) необходимо выполнить ряд действий, описанных в [11]. Все действия выполнялись на операционной системе Linux Ubuntu 16.04 LTS. После проведения вышеописанных операций была собрана библиотека OpenCV для процессоров с архитектурой ARM (armhf).
С помощью выбранного toolchain была скомпилирована исполняемая программа [12]:
user@user:~$ arm-linux-gnueabihf-g++ -std=c++11 video_capture.cpp -o video_capture `pkg-config --cflags --libs opencv`
Основной задачей СПО бортовой вычислительной платформы является обработка и анализ изображений с видеокамеры. Так, например, зона посадки летательного аппарата задаётся определённой меткой на изображении. Таким образом, необходимо осуществлять анализ видеопотока для детектирования заданной метки.
В качестве вышеуказанной метки использовалось изображение на рис. 4.
Рисунок 4. Метка, используемая при анализе видеопотока
Была разработана система контурного анализа, которая включает в себя:
- предварительную обработку кадров видеопотока;
- нахождение всех контуров на текущем кадре;
- анализ иерархии найденных контуров и сопоставление последних с заданной меткой.
Результаты обработки каждого кадра отображаются в консольном окне. Исходный код программы находится в репозитории проекта [12].
В ходе реализации специализированного программного обеспечения бортовой вычислительной платформы приведено краткое описание встраиваемой ОС и описана процедура развертывания встраиваемой ОС для микроконтроллера с архитектурой ARM.
Были описаны технологические особенности кросс-разработки (кросс-компиляции) с инструкцией по развертыванию программ для микроконтроллера с архитектурой ARM. Была освоена технология удаленной отладки посредством использования gdbserver и Eclipse IDE C/C++. Проведена процедура интегрирования библиотеки компьютерного зрения OpenCV.
По результатам интегрирования удалось собрать библиотеку для процессоров с архитектурой ARM и скомпилировать разрабатываемый проект, включающий в себя систему контурного анализа непрерывного видеопотока. Бинарный файл был отправлен на целевую платформу с последующим тестированием функционала.
- FriendlyELEC WiKi - NanoPi NEO. Раздел 4.1. - 2016. - URL: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO#Layout (дата обращения: 05.05.2022г.). - Текст: электронный.
- Подключение к NanoPi. - 2021. - URL: https://github.com/DRONE520/OCP/wiki/%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA-NanoPi (дата обращения: 09.05.2022г.). - Текст: электронный.
- Crosstool-NG. Официальная страница. - 2022. - URL: https://crosstool-ng.github.io (дата обращения: 11.05.2022г.). - Текст: электронный.
- GCC, the GNU Compiler Collection. - 2022. - URL: https://gcc.gnu.org (дата обращения: 12.05.2022г.). - Текст: электронный.
- FriendlyElec NanoPi NEO Downloads. - 2016. - URL: https://download.friendlyelec.com/nanopineo (дата обращения: 14.05.2022г.). - Текст: электронный.
- Debian packages - gcc-arm-linux-gnueabihf. - 2022. - URL: https://packages.debian.org/ru/sid/gcc-arm-linux-gnueabihf (дата обращения: 15.05.2022г.). - Текст: электронный.
- Eclipse IDE for C/C++ Developers. - 2022. - URL: https://www.eclipse.org/downloads/packages/release/2022-03/r/eclipse-ide-cc-developers (дата обращения: 16.05.2022г.). - Текст: электронный.
- Ubuntu packages - gdbserver. - 2022. URL: https://packages.ubuntu.com/search?keywords=gdbserver (дата обращения: 16.05.2022г.). - Текст: электронный.
- Singh A. RaspberryPi development setup on Eclipse [Linux] and Debugging via SSH. - 2020. - URL: https://medium.com/@eternalamit5/raspberry-pi-development-setup-on-eclipse-linux-and-debugging-via-ssh-a1927852e3a2 (дата обращения: 17.05.2022г.). - Текст: электронный.
- OpenCV library. - 2022. - URL: https://opencv.org/releases/ (дата обращения: 27.05.2022г.). - Текст: электронный.
- Пичугин А. Кросс-компиляция OpenCV 4 для Raspberry Pi и BeagleBone Black. - 2019. - URL: https://habr.com/ru/post/461693/ (дата обращения: 20.05.2022г.). - Текст: электронный.
- Исходный код реализованного программного обеспечения. - 2022. - URL: https://github.com/DRONE520/OCP/blob/master/src/video_capture.cpp (дата обращения: 25.05.2022г.). - Текст: электронный.