СПО бортовой вычислительной платформы - DRONE520/DRONE520-main GitHub Wiki

Введение

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

Цель

В данной работе описан проект, цель которого организовать возможность проведения вычислений для анализа кадров видеопотока. Разработка устройства от проектирования и до готового кода велась самостоятельно и в ней, кроме всего прочего, были использованы источники с открытым исходным кодом. Для реализации данного СПО используется одноплатный компьютер NanoPi NEO и библиотека компьютерного зрения OpenCV. Устройство является прототипом, но имеет перспективы к развитию и реальному использованию.

Постановка задачи

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

  1. Выбрать и установить операционную систему для целевой платформы;
  2. Освоить технологию удалённой отладки программ на целевой платформе;
  3. Произвести интеграцию разрабатываемого программного обеспечения с библиотекой компьютерного зрения OpenCV;
  4. Разработать ПО для нахождения заданной метки в непрерывном видеопотоке посредством контурного анализа.

Краткое описание встраиваемой операционной системы

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].

Интегрирование библиотеки OpenCV

Одной из потенциальных задач бортовой вычислительной платформы является обработка изображений, полученных с помощью 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 и скомпилировать разрабатываемый проект, включающий в себя систему контурного анализа непрерывного видеопотока. Бинарный файл был отправлен на целевую платформу с последующим тестированием функционала.

Литература

  1. FriendlyELEC WiKi - NanoPi NEO. Раздел 4.1. - 2016. - URL: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO#Layout (дата обращения: 05.05.2022г.). - Текст: электронный.
  2. Подключение к 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г.). - Текст: электронный.
  3. Crosstool-NG. Официальная страница. - 2022. - URL: https://crosstool-ng.github.io (дата обращения: 11.05.2022г.). - Текст: электронный.
  4. GCC, the GNU Compiler Collection. - 2022. - URL: https://gcc.gnu.org (дата обращения: 12.05.2022г.). - Текст: электронный.
  5. FriendlyElec NanoPi NEO Downloads. - 2016. - URL: https://download.friendlyelec.com/nanopineo (дата обращения: 14.05.2022г.). - Текст: электронный.
  6. Debian packages - gcc-arm-linux-gnueabihf. - 2022. - URL: https://packages.debian.org/ru/sid/gcc-arm-linux-gnueabihf (дата обращения: 15.05.2022г.). - Текст: электронный.
  7. 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г.). - Текст: электронный.
  8. Ubuntu packages - gdbserver. - 2022. URL: https://packages.ubuntu.com/search?keywords=gdbserver (дата обращения: 16.05.2022г.). - Текст: электронный.
  9. 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г.). - Текст: электронный.
  10. OpenCV library. - 2022. - URL: https://opencv.org/releases/ (дата обращения: 27.05.2022г.). - Текст: электронный.
  11. Пичугин А. Кросс-компиляция OpenCV 4 для Raspberry Pi и BeagleBone Black. - 2019. - URL: https://habr.com/ru/post/461693/ (дата обращения: 20.05.2022г.). - Текст: электронный.
  12. Исходный код реализованного программного обеспечения. - 2022. - URL: https://github.com/DRONE520/OCP/blob/master/src/video_capture.cpp (дата обращения: 25.05.2022г.). - Текст: электронный.
⚠️ **GitHub.com Fallback** ⚠️