Обеспечение фото‐ и видео‐ съемки, обработка изображений на борту БАС - DRONE520/RF-BAS-COMMON GitHub Wiki
Современные беспилотные авиационные системы (БАС) находят широкое применение в различных сферах, включая исследовательские миссии, мониторинг окружающей среды, а также в области робототехники и автоматизации. Одним из ключевых аспектов успешного функционирования БАС является возможность эффективной обработки визуальной информации, получаемой с помощью фото- и видеокамер, установленными на борту аппарата. Эта информация используется для решения задач навигации, а также для более глубокого анализа окружающей среды.
В рамках данной работы подгруппа занимается обеспечением фото- и видео-съемки, а также разработкой алгоритмов обработки изображений непосредственно на борту БАС. Для реализации данной задачи выбран встраиваемый компьютер Nano Pi, что предполагает использование кросс-компиляции на C++ для обеспечения работы программного обеспечения на ограниченных ресурсах устройства. Важной частью работы является сборка и настройка библиотеки OpenCV для обработки изображений, а также создание программ, позволяющих эффективно сохранять полученные данные в файловую систему.
Кроме того, в рамках проекта был начат процесс разработки приложения для визуальной одометрии, что позволит БАС более точно ориентироваться в пространстве, используя только данные с камер. Эти решения являются основой для дальнейшей работы в области автономных систем, где обработка визуальных данных на борту является важнейшей задачей для повышения независимости и точности работы беспилотного аппарата.
Визуальная одометрия — это метод оценки положения и ориентации движущегося устройства (например, дрон или робот) на основе анализа последовательных изображений, получаемых с камеры. В контексте использования дронов с одной камерой, этот метод играет ключевую роль в отслеживании перемещения и ориентации без использования внешних датчиков, таких как GPS.
Принцип работы визуальной одометрии заключается в следующем:
-
Получение входного изображения: Системы визуальной одометрии могут использовать различные типы камер: моно-камеры (с одной камерой), стерео-камеры (с двумя камерами для захвата глубины) или панорамные камеры (с всенаправленным захватом изображения). Выбор типа камеры зависит от поставленных задач и требуемой точности.
-
Калибровка камеры:
Для корректного восстановления 3D-положения камеры и её перемещения, учитываются параметры камеры, такие как фокусное расстояние, искажения объектива (например, эффект рыбьего глаза). Это реализуется с помощью матрицы калибровки камеры и процедуры дисторсии. -
Обнаружение и отслеживание характерных признаков в различных кадрах
3.1. Детектирование ключевых точек:
Для начала необходимо обнаружить ключевые точки на изображении, которые будут отслеживаться в последующих кадрах. Это может быть реализовано с помощью детекторов, таких как FAST, ORB, SIFT. Эти детекторы выявляют угловые или интересные точки на изображении, которые являются хорошими кандидатами для отслеживания в дальнейшем.3.2. Сопоставление точек между кадрами: После обнаружения ключевых точек необходимо сопоставить их между последовательными изображениями. Это можно сделать с помощью методов сопоставления дескрипторов, таких как ORB, либо с использованием BFMatcher для бинарных дескрипторов.
3.3. Вычисление оптического потока:
Оптический поток позволяет оценить перемещение точек на изображении между двумя последовательными кадрами, что является основой для вычисления движения камеры. Это реализуется с помощью алгоритмов, например Лукаса-Канаде, которые вычисляют движение пикселей между двумя изображениями. Это особенно важно, когда необходимо отслеживать движение объекта в сцене. -
Оценка движения (позы):
Основываясь на сопоставленных точках и их перемещениях между изображениями, используется метод позы (pose estimation) для вычисления смещения и поворота камеры. Для этого можно использовать алгоритмы PnP (Perspective-n-Point) или Bundle Adjustment, которые учитывают как параметры камеры, так и движение объекта. Некоторые векторы в поле оптического потока могут быть аномальными (например, из-за движения объекта, ошибки в алгоритме или особенностей сцены). На этом этапе производится их выявление и корректировка с использованием различных методов, таких как RANSAC.
Для повышения точности и устойчивости в вычислениях часто применяются фильтры, такие как фильтр Калмана, для сглаживания и прогнозирования состояния устройства в реальном времени. Это помогает компенсировать ошибки, возникающие из-за шумов в измерениях и погрешностей в сопоставлении точек.
Для того, чтобы начать работу с контроллером-компаньоном необходимо установить на него операционную систему.
Для этого потребуется:
- контроллер NanoPi NEO,
- microSD карта памяти,
- microUSB кабель питания,
- Host компьютер с операционной системой Ubuntu 20.04 (или Ubuntu 22.04).
Далее рабочий ПК будет называться Host машиной или просто Host, а контроллер NanoPi - Target. Операционные системы на Host машине и на Target машине должны иметь одинаковые версии, из-за проблем с совместимостью.
На Host компьютер необходимо скачать образ операционной системы friendlycore. Данная ОС основывается на Linux Ubuntu. В данном случае был использован образ friendlycore-focal (Ubuntu 20.04). Так же можно использовать образ friendlycore-jammy (Ubuntu 22.04). При использовании более ранних версий Ubuntu могут возникнуть проблемы с совместимостью версий библиотеки GLIBC при сборке OpenCV и других приложений.
Далее необходимо на Host машине установить программу Balena Etcher для записи образа ОС на microSD.
Для установки программы необходимо выполнить следующие команды:
curl -L -o balena-etcher_1.19.25_amd64.deb https://github.com/balena-io/etcher/releases/download/v1.19.25/balena-etcher_1.19.25_amd64.deb
sudo apt install ./balena-etcher_1.19.25_amd64.deb
balena-etcher
После чего произвести запись образа ОС на microSD карту и вставить карту в слот для microSD.
Подключив Host и Target к одной сети, можно подключиться к Target по ssh.
Для этого необходимо установить программу для сканирования IP-сетей - nmap:
sudo apt install nmap
И просканировать сеть, для того, чтобы найти IP адрес платы:
nmap -sn ip.address.of.local/network_area
Далее можно подключиться к плате:
# For user
ssh [email protected]
# Password: pi
# For root
ssh [email protected]
# Password: fa
И запустить обновление системы:
sudo apt-get update
sudo apt-get upgrade
Для установки библиотеки потребуется использование кросскомпиляции (cross compilation). Кросскомпиляция - процесс сборки программы на Host машине для Target машины, имеющей отличную платформу от Host. Такой метод компиляции необходим, когда сборка на Target невозможна, либо нецелесообразна. В данном случае, сборка OpenCV на контроллере возможна, но нецелесообразна из-за больших временных затрат.
Для кросс-компиляции требуются набор инструментов (англ. toolchain). Простой набор инструментов для разработки программного обеспечения может состоять из компилятора и компоновщика (которые преобразуют исходный код в исполняемую программу), библиотеки (которые предоставляют интерфейсы для операционной системы), и отладчик (который используется для тестирования и отладки созданных программ).
В первую очередь нужно установить необходимый toolchain на машину сборки:
sudo apt install -y crossbuild-essential-armhf
В качестве примера кросс-компиляции используется следующая простая программа hello.cpp:
#include <iostream>
int main() {
std::cout << "Hello, armhf!\n";
return 0
}
Для сборки используется следующая команда:
arm-linux-gnueabihf-g++ hello.cpp -o hello
После этапа кросс-компиляции необходимо отправить исполняемый файл на целевую платформу. Это можно сделать по SSH. Для копирования файлов по SSH в Linux-системах можно использовать утилиту scp:
scp hello [email protected]:~/test
После выполнения команды в директории ~/test
на nanoPi появится скомпилированная программа hello
. Для запуска программы на исполнение необходимо выполнить: ./hello
.
Процесс сборки OpevCV для ARM процессоров описан на сайте OpenCV. Стоит заметить, что у процессора NanoPi 32-х битная разрядность и сборку необходимо проводить с учетом разрядности.
Процесс сборки:
- Установка необходимых инструментов
sudo apt update -y
sudo apt install -y \
git \
cmake \
pkgconf \
build-essential \
ninja-build \
crossbuild-essential-armhf
- Структура директорий для работы
/home
+ kmtr - please replace your account name.
+ work
+ opencv - source, cloned from github
+ opencv_contrib - source, cloned from github
+ build4-full_armhf - artifact(for armhf target), created by cmake
- Клонирование OpenCV
mkdir work
cd work
git clone --depth=1 https://github.com/opencv/opencv.git
git clone --depth=1 https://github.com/opencv/opencv_contrib.git
- Добавление путей к библиотекам пакетного менеджера apt
В консоли нужно ввести:
sudo apt edit-sources
В открывшемся файле дописать следующее (focal - Ubuntu 20.04, jammy - Ubuntu 22.04):
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-updates multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports focal-security multiverse
И прописать в консоль:
sudo apt get update
- Обновление настроек пакетного менеджера dpkg
sudo dpkg --add-architecture arm64
sudo dpkg --add-architecture armhf
- Установка необходимых для компиляции библиотек
sudo apt install -y \
linux-libc-dev:armhf \
libavcodec-dev:armhf \
libavformat-dev:armhf \
libavutil-dev:armhf \
libswscale-dev:armhf \
libfreetype-dev:armhf \
libharfbuzz-dev:armhf
Возможна такая ситуация, что нужные библиотеки не будут найдены (платформа поддерживает другие версии библиотек). В таком случае необходимо воспользоваться командой apt search
:
apt search libavcodec
- Настройка OpenCV
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_armhf \
-DENABLE_NEON=ON \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/arm-gnueabi.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
# В этой строчке необходимо изменить путь
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/arm-gnueabi.toolchain.cmake \
- Компиляция OpenCV
cmake --build build4-full_armhf -j10
sudo cmake --install build4-full_armhf
Флаг -jn
позволяет компилировать программу параллельно на n
ядрах.
- Отправка OpenCV на контроллер
Архивация OpenCV:
tar czvf opencv_arm64.tgz -C build4-full_arm64/install .
После архивации необходимо отправить архив на контроллер
- Установка дополнительных библиотек на контроллере
Приведенные ниже версии библиотек могут не совпадать с требуемыми на контроллере, поэтому можно воспользоваться apt search
.
sudo apt install -y \
libavcodec60 \
libavformat60 \
libavutil58 \
libswscale7 \
libfreetype6 \
libharfbuzz0b
sudo ldconfig
- Установка OpenCV на плате
sudo tar zxvf opencv_arm64.tgz -C /usr/local
sudo ldconfig
Для проверки работоспособности библиотеки можно создать файл main.cpp:
#include <iostream>
#include <opencv2/core.hpp>
int main(void)
{
std::cout << cv::getBuildInformation() << std::endl;
return 0;
}
Собрать его и запустить:
g++ main.cpp -o a.out -I/usr/local/include/opencv4 -lopencv_core
./a.out
Для обеспечения фотосъемки было разработано приложение, использующее библиотеку OpenCV, которое осуществляет съемку с камеры, подключенной к контроллеру, и сохранение фотографий в память платы.
Для просмотра журнала нужно перейти в директорию journal, находящейся в каталоге с программой.
Исходный код программы:
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <ctime>
#include <iostream>
#include <iterator>
#include <locale>
using namespace cv;
int main(int argc, char** argv )
{
VideoCapture cap(0);
Mat image;
cap >> image;
std::time_t time = std::time({});
char timeString[] = "yyyy-mm-dd-hh:mm:ss";
std::strftime(timeString, sizeof(timeString),
"%F-%T", std::gmtime(&time));
std::string filename = "journal/output-";
filename += timeString;
filename += ".png";
imwrite(filename, image);
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5.0)
project(take_photo VERSION 0.1.0 LANGUAGES C CXX)
set(OpenCV_DIR "/home/user/workspace/opencv_src/build4-full_armhf")
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
link_libraries( ${OpenCV_LIBS})
add_executable(take_photo test.cpp)
Собрать программу можно следующим образом:
cd /path/to/program/dir/
mkdir build/
cd build/
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=<path to the OpenCV source directory>/platforms/linux/arm-gnueabi.toolchain.cmake
cmake --build .
Для того, чтобы БАС мог ориентироваться в пространстве без сигнала GPS, можно воспользоваться данными с видеокамеры. Обработав эти данные можно получить смещение между соседними кадрами, тем самым построить траекторию и ориентироваться в пространстве. Для данной задачи была разработана программа, которая оценивает эти смещения и выводит их в отдельный файл. Обработка этих данных позволяет воспроизвести траекторию полета БАС:
Обработка изображений в данной программе основывается на детекторе ключевых точек FAST и вычислении разреженного оптического потока по алгоритму Лукаса-Канаде. Оценка смещения камеры производится методом RANSAC.
В дальнейшем планируется улучшение программы с фокусом на подбор наиболее оптимальных алгоритмов для встраиваемой платформы Nano Pi, что обеспечит повышение производительности и точности обработки. Также предполагается интеграция методов фильтрации, таких как фильтр Калмана, для улучшения стабильности оценки движения.
Производительность программы была оценена на контроллере Nano Pi, что позволило определить примерное количество кадров, которое устройство способно обрабатывать — 2-3 кадра в секунду. Однако производительность может варьироваться в зависимости от условий окружающей среды и сложности сцены, например, от количества деталей на изображении.
Процедура сборки:
cd /path/to/program/dir/
mkdir build/
cd build/
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=<path to the OpenCV source directory>/platforms/linux/arm-gnueabi.toolchain.cmake
cmake --build .
В результате выполненной работы была обеспечена базовая функциональность для фото- и видео-съемки с использованием встраиваемой системы Nano Pi, а также реализована начальная обработка изображений на борту БАС с применением библиотеки OpenCV. Разработаны программы для сохранения изображений и ведется работа по созданию приложения для визуальной одометрии. Эти шаги являются важным этапом на пути к созданию автономной системы, способной эффективно использовать визуальные данные для навигации и анализа окружающей среды в реальном времени.