Vision-based SLAM: tutorial
После опубликования статьи об опыте использования монокулярного SLAM мы получили несколько комментариев с вопросами о подробной настройке. Мы решили ответить песней серией статей-уроков о SLAM. Сегодня предлагаем ознакомиться с первой из них, в которой поставим все необходимые пакеты и подготовим окружение для дальнейшей работы.
Итак, мы готовим три статьи:
- техническую — о настройке окружения и установке необходимых для использования SLAM пакетов, а также о калибровке камеры
- использование монокулярного SLAM на примере PTAM и LSD SLAM
- использование SLAM на основе стереокамер и камер глубины на примере RTAB-Map
Начальные условия
Для ускорения работы мы будем рассматривать самую простую конфигурацию. Для работы нам потребуются:
- компьютер с Ubuntu 14.04 (обратите внимание на версию, почему именно она — скажем ниже);
- USB-камера для монокулярного зрения;
- две как можно более похожих USB-камеры для стереозрения;
- камера глубины (мы использовали Kinect 360).
Сразу снимем вопрос о использовании виртуальных ОС — в целом это возможно, но несет в себе очень много проблем (особенно когда дело доходит до визуализации полученных изображений), поэтому если не хотите тратить время на блуждание по форумам, рекомендуем ставить на реальную ОС. Для тех, кто хочет развернуть все на виртуалке, постараемся дать рекомендации по проблемам, с которыми сами столкнулись, в конце статьи.
Установка Robotic Operating System (ROS)
Итак, у нас есть установленная Ubuntu 14.04, теперь мы можем поставить на нее ROS. Почему ROS? Потому что она предоставляет удобные обертки всех используемых библиотек, а также предлагает хорошую инфраструктуру для быстрого создания прототипа. Описывать установку ROS здесь смысла нет — на сайте есть очень подробный урок, главное — запомнить, что мы работаем с версией «Indigo» (на более новую Jade перенесены не все нужные нам пакеты. Кстати, именно поэтому и используем Ubuntu 14.04). Убедитесь, что Вы ставите пакет ros-indigo-desktop-full — это Вас избавит от необходимости добавлять пакеты в дальнейшем.
Настройка workspace
ROS установлена, теперь нужно настроить workspace. Workspace представляет собой папку, в которой Вы размещаете пакеты ROS, собираемые из исходников.
ROS использует две системы сборки: rosbuild и catkin. В настоящий момент подавляющее большинство пакетов уже мигрировали на систему сборки catkin, но некоторые используют старенькую rosbuild. LSD SLAM относится именно к ним (хотя в репозитории и есть ветки, в которых вроде бы произведена миграция на catkin, по факту же там лежат битые скрипты, а pull request на исправление этих ошибок не принят). Поэтому потратим немного времени и настроим workspace для обеих систем сборки.
- Создадим папку ros_workspace внутри домашней папки
mkdir ~/ros_workspace
- Настройка catkin:
- создадим папку для пакетов и перейдем в нее:
mkdir –p ~/ros_workspace/catkin/src && cd $_
- выполним команду инициализации:
catkin_init_workspace
- соберем workspace, чтобы получить конфигурацию для использования в rosbuild:
cd .. && catkin_make
- создадим папку для пакетов и перейдем в нее:
- Настройка rosbuild:
- создадим папку и перейдем в нее:
mkdir ~/ros_workspace/rosbuild && cd $_
- установим ссылку на devel нашего catkin workspace:
rosws init . ~/ros_workspace/catkin/devel
- создадим папку для пакетов:
mkdir packages
- добавим в наш rosbuild workspace информацию о папке для пакетов:
rosws set ~/ros_workspace/rosbuild/packages -t .
- добавим инициализацию переменных окружения в файл bashrc:
echo "source ~/ros_workspace/rosbuild/setup.bash" >> ~/.bashrc
- перезапустим терминал, что бы изменения вступили в силу.
- создадим папку и перейдем в нее:
- Для проверки того, что все настроено, корректно выполним команду
roscd
Вы должны перейти в папку ~/ros_workspace/rosbuild.
Установка пакетов
Теперь установим необходимые для SLAM пакеты.
Для монокулярного SLAM мы рассмотрим две реализации: PTAM и LSD SLAM.
LSD SLAM:
- Мы будем включать поддержку обнаружения циклов (loop closure) при сборке, поэтому нам придется пересобрать OpenCV и включить при сборке non-free модули. Для этого нужно скачать исходники OpecCV (версия 2.4.8 — это тоже важно: если поставить другую версию, то есть шанс, что отвалятся некоторые модули ROS, поэтому для избежания танцев с бубнами качайте эту версию.
- Разархивируйте (не нужно размещать исходники OpenCV в workspace, т.к. этот пакет не относится к ROS) и соберите OpenCV:
- создайте папку build и перейдите в нее
mkdir build && cd $_
- выполните команду
cmake –D CMAKE_BUILD_TYPE=Release ..
- и по ее завершению
sudo make install
- создайте папку build и перейдите в нее
- Для включения поддержки loop closure в самом LSD SLAM необходимо отредактировать файл lsd_slam_core/CmakeLists.txt, расскоментировав следующие строки:
add_subdirectory(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap)
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap/include)
add_definitions("-DHAVE_FABMAP")
set(FABMAP_LIB openFABMAP )
- Разархивируйте (не нужно размещать исходники OpenCV в workspace, т.к. этот пакет не относится к ROS) и соберите OpenCV:
- Установим необходимые зависимости:
sudo apt-get install ros-indigo-libg2o liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
- Переходим в папку
cd ~/ros_workspace/rosbuild/package
- Клонируем репозиторий
git clone https://github.com/tum-vision/lsd_slam.git
- Собираем пакет
rosmake lsd_slam
PTAM:
- Переходим в папку
cd ~/ros_workspace/catkin/src
- Клонируем репозиторий:
git clone https://github.com/ethz-asl/ethzasl_ptam
- Переходим на уровень workspace и собираем его:
cd .. && catkin_make –j4
RTAB-Map:
Лучше всего устанавливать RTAB-Map из бинарных пакетов:
sudo apt-get install ros-indigo-rtabmap-ros
Подключаем USB-камеру
Пакет usb-cam необходим для использования обычной RGB USB камеры в качестве источника данных.
- Переходим в папку
cd ~/ros_workspace/catkin/src
- Клонируем репозиторий
git clone https://github.com/bosch-ros-pkg/usb_cam
- собираем пакет
cd.. && catkin_make
- доставляем необходимые зависимости:
sudo apt-get install v4l-utils
Проверим работоспособность камеры — подключите камеру и посмотрите, какой идентификатор устройства был ей присвоен:
ls /dev/video*
В нашем случае это video0. Далее перейдем в папку (предварительно создав ее) ~/ros_workspace/test и создадим в ней текстовый файл camera.launch запуска со следующем содержанием:
Файлы запуска — это специальные файлы, с помощью которых можно запустить сразу несколько узлов ROS и передать в них параметры.
С помощью данного файла мы запускаем два узла — usb_cam_node из пакета usb_cam — для получения изображения с нашей камеры. И image_view из одноименного пакета — с помощью этого узла мы отображаем на экране данные, полученные с камеры. Так же для узла камеры мы определяем некоторые параметры, самым главным из которых является video_device, который соответствует устройству нашей камеры.
Теперь выполняем этот файл с помощью команды (нужно находиться в той же папке, где и файл)
roslaunch camera.launch
Вы должны увидеть окно в котором отображается изображение, получаемое с камеры:
Подключаем Kinect 360
Для работы с Kinect 360 нам понадобится драйвер Freenect, который можно установить из бинарных пакетов:
sudo apt-get install freenect
Проверим, как работает наш Kinect, запустив GUI RTAB-Map командой
rtabmap
При первом запуске RTAB-Map выдаст два окошка, сообщив, куда она будет сохранять свою базу данных, файлы конфигурации и т.п.
Далее Вы должны увидеть GUI RTAB-Map:
Нам нужно создать новую базу данных RTAB-Map и запустить захват изображений:
После чего, если все работает правильно, Вы должны увидеть изображения с камеры глубины:
Калибровка камеры
Алгоритмы визульного SLAM требуют тщательной калибровки камеры и ректификации получаемого изображения. В большинстве случаев используется модель камеры-обскуры (стеноп, pinhole camera). Процесс калибровки включает в себя вычисление внутренних параметров (intrincsics) модели и коэффициентов модели дисторсии.
В ROS имеются встроенные средства калибровки камеры. Перед калибровкой камеры необходимо подготовить калибровочный образец: распечатать шахматный узор (например, такой, желательно хотя бы A3, больше — лучше).
Запуск утилиты производится следующим образом:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera
где
- --size 8×6 указывает количество внутренних углов шахматного узора (8×6 соответствует узору из 9×7 квадратов)
- --square 0.108 — размер (стороны) квадрата шахматного узора в метрах
Для более точной калибровки нужно снять калибровочный объект в разных частях кадра с разным масштабом и наклоном/поворотом. Утилита самостоятельно выберет необходимое количество кадров для процесса калибровки. После того как наберется достаточно кадров (все индикаторы станут зелеными) можно запустить процесс калибровки нажатием на клавишу «calibrate». Затем необходимо нажать кнопку «commit» для сохранения данных калибровки для выбранного источника.
Virtual Box
Как мы и обещали, дадим пару советов по установке всего окружения внутри виртуальных ОС. В качестве теста мы попробовали провести установку внутри Virtual Box (версия 5.0.14). Проблема, которая нас надолго задержала, связана с ошибкой загрузки видеодрайвера vboxvideo, которую мы так и не сумели побороть за адекватное время. И хотя Unity радостно рапортовал, что поддержка 3D присутствует, и даже запускал демки из mesa-utils, попытки запуска RViz (пакет визуализации, входящий в состав ROS) приводили в лучшем случае к его аварийному завершению (в худшем случае вырубалась виртуальная машина). Частичное решение заключается в явном указании необходимости использования софтверного рендеринга: для этого необходимо перед командой указать LIBGL_ALWAYS_SOFTWARE=1, например
LIBGL_ALWAYS_SOFTWARE=1 roslaunch softkinetic_camera softkinetic_camera_demo.launch
Еще одной проблемой стали устройства USB 3.0, но это решается просто установкой VirtualBox extension pack и активацией соответствующей настройки в свойствах виртуальной машины.
Также есть большая вероятность, что после того, как Вы все благополучно установите, Вас будет ждать большое разочарование. Что и произошло в нашем случае — при запуске примеров RViz получает только один кадр с камеры, после чего данные с камеры не поступают. Эту проблему мы так и не побороли, поэтому совсем отказались от использования виртуалки, чего и Вам советуем.
На этом подготовительная часть закончена. В следующей части мы приступим к настройке и использованию различных видов визуального SLAM.