Slam На Основе Видения: Руководство

С момента публикации нашей статьи об опыте монокулярного SLAM мы получили несколько комментариев с вопросами о подробной настройке.

Мы решили ответить песней и серией статей-уроков о SLAM. Сегодня мы предлагаем вам ознакомиться с первым из них, в котором мы установим все необходимые пакеты и подготовим среду для дальнейшей работы.



SLAM на основе видения: руководство

Итак, готовим три статьи:

  1. технический — о настройке среды и установке необходимых пакетов для использования SLAM, а также калибровке камеры
  2. применение монокулярного SLAM на примере ПТАМ и LSD SLAM
  3. использование SLAM на основе стереокамер и камер глубины на примере RTAB-Map


Первоначальные условия

Чтобы ускорить дело, мы рассмотрим самую простую конфигурацию.

Для работы нам понадобится:

  • компьютер с Убунту 14.04 (обратите внимание на версию, почему именно так – скажем ниже);
  • USB-камера для монокулярного зрения;
  • две USB-камеры, максимально похожие по стереовидению;
  • камера глубины (мы использовали Kinect 360).

Сразу снимем вопрос с использованием виртуальных ОС - в целом это возможно, но несет в себе массу проблем (особенно, когда речь идет о визуализации получаемых изображений), поэтому, если вы не хотите тратить время на блуждание по форумам, мы рекомендуем установку на реальную ОС.

Для тех, кто хочет развернуть всё на виртуальной машине, мы в конце статьи постараемся дать рекомендации по проблемам, с которыми мы сами столкнулись.



Установка роботизированной операционной системы (ROS)

Итак у нас установлена Ubuntu 14.04, теперь можно на нее установить РОС .

Почему РОС? Потому что он предоставляет удобные оболочки для всех используемых библиотек, а также предлагает хорошую инфраструктуру для быстрого прототипирования.

Здесь нет смысла описывать установку ROS - информация есть на сайте очень подробный урок , главное помнить, что мы работаем с версией «Индиго» (не все нужные нам пакеты перенесены в более новую Jade. Кстати, именно поэтому мы используем Ubuntu 14.04).

Убедитесь, что вы установили пакет ros-indigo-рабочий стол-полный – это избавит вас от необходимости добавлять пакеты в будущем.



Настройка рабочего пространства

ROS установлена, теперь нужно настроить рабочую область.

Рабочая область — это папка, в которую вы помещаете пакеты ROS, собранные из исходного кода.

ROS использует две системы сборки: rosbuild и catkin. На данный момент подавляющее большинство пакетов уже перешло на систему сборки catkin, но некоторые используют старую rosbuild. LSD SLAM относится именно к ним (хотя в репозитории есть ветки, которые вроде бы перекочевали на catkin, на самом деле там лежат битые скрипты, а пул-реквесты на исправление этих ошибок не принимаются).

Итак, давайте потратим немного времени и настроим рабочее пространство для обеих систем сборки.

  1. Давайте создадим папку ros_workspace внутри домашней папки.

      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
       

    mkdir ~/ros_workspace

  2. Настройка Catkin:
    1. Создадим папку для пакетов и зайдем в нее:

      mkdir –p ~/ros_workspace/catkin/src && cd $_

    2. Выполним команду инициализации:

      catkin_init_workspace

    3. соберем рабочую область, чтобы получить конфигурацию для использования в rosbuild:

      cd .

      && catkin_make

  3. Настройка росбилда:
    1. Создадим папку и зайдем в нее:

      mkdir ~/ros_workspace/rosbuild && cd $_

    2. установите ссылку на разработку нашего рабочего пространства Catkin:

      rosws init .

      ~/ros_workspace/catkin/devel

    3. Создадим папку для пакетов:

      mkdir packages

    4. Добавим информацию о папке для пакетов в нашу рабочую область rosbuild:

      rosws set ~/ros_workspace/rosbuild/packages -t .



    5. Добавим инициализацию переменных окружения в файл bashrc:

      echo "source ~/ros_workspace/rosbuild/setup.bash" >> ~/.

      bashrc

    6. Перезапустим терминал, чтобы изменения вступили в силу.

  4. Чтобы проверить, что всё настроено, выполним команду правильно

    roscd

    Вам следует перейти в папку ~/ros_workspace/rosbuild.


Установка пакетов

Теперь установим пакеты, необходимые для SLAM. Для монокулярного SLAM мы рассмотрим две реализации: PTAM и LSD SLAM.

ЛСД СЛЭМ:

  1. Мы добавим поддержку обнаружения замыкания цикла при сборке, поэтому нам придется пересобрать OpenCV и включить несвободные модули при сборке.

    Для этого вам необходимо скачать исходники OpecCV (версия 2.4.8 - это тоже важно: если вы установите другую версию, то есть вероятность, что некоторые модули ROS отвалятся, поэтому, чтобы не танцевать с бубнами, скачайте эта версия .

    1. Разархивируйте (исходники OpenCV размещать в рабочей области не нужно, так как этот пакет не имеет отношения к ROS) и соберите OpenCV:
      1. создайте папку сборки и зайдите в нее

        mkdir build && cd $_

      2. запустить команду

        cmake –D CMAKE_BUILD_TYPE=Release .



      3. и по его завершению

        sudo make install

    2. Чтобы включить поддержку замыкания цикла в самом 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 )

  2. Установим необходимые зависимости:

    sudo apt-get install ros-indigo-libg2o liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev

  3. Перейти в папку

    cd ~/ros_workspace/rosbuild/package

  4. Клонирование репозитория

    git clone https://github.com/tum-vision/lsd_slam.git

  5. Сборка пакета

    rosmake lsd_slam



ПТАМ:

  1. Перейти в папку

    cd ~/ros_workspace/catkin/src

  2. Клонируем репозиторий:

    git clone https://github.com/ethz-asl/ethzasl_ptam

  3. Перейдите на уровень рабочей области и соберите ее:

    cd .

    && catkin_make –j4



RTAB-Карта:

Устанавливать RTAB-Map лучше всего из бинарных пакетов:

sudo apt-get install ros-indigo-rtabmap-ros



Подключение USB-камеры

Пакет usb-cam необходим для использования обычной RGB USB-камеры в качестве источника данных.

  1. Перейти в папку

    cd ~/ros_workspace/catkin/src

  2. Клонирование репозитория

    git clone https://github.com/bosch-ros-pkg/usb_cam

  3. собираем посылку

    cd. && catkin_make

  4. Доставляем необходимые зависимости:

    sudo apt-get install v4l-utils

Проверим работоспособность камеры — подключим камеру и посмотрим, какой ID устройства ей присвоен:

ls /dev/video*

В нашем случае это video0. Далее зайдем в папку (предварительно создав ее) ~/ros_workspace/test и создадим в ней текстовый файл запуска с именем camera.launch следующего содержания:

<launch> <node pkg="usb_cam" type="usb_cam_node" name="camera" output="screen"> <param name="video_device" value="/dev/video0"/> <param name="image_width" value="320"/> <param name="image_height" value="240"/> </node> <node pkg="image_view" type="image_view" name="viewer"> <remap from="image" to="/camera/image_raw"/> </node> </launch>

Файлы запуска — это специальные файлы, которые можно использовать для запуска сразу нескольких узлов ROS и передачи им параметров.

С помощью этого файла мы запускаем два узла — usb_cam_node из пакета usb_cam — для получения изображения с нашей камеры.

И image_view из одноименного пакета — с помощью этого узла мы отображаем на экране данные, полученные от камеры.

Мы также определяем некоторые параметры для узла камеры, наиболее важным из которых является video_device, который соответствует устройству нашей камеры.

Теперь выполняем этот файл с помощью команды (нужно находиться в той же папке, что и файл)

roslaunch camera.launch

Вы должны увидеть окно с изображением, полученным с камеры:

SLAM на основе видения: руководство



Подключение Кинект 360

Для работы с Kinect 360 нам понадобится драйвер Freenect, который можно установить из бинарных пакетов:

sudo apt-get install freenect

Давайте проверим, как работает наш Kinect, запустив GUI RTAB-Map командой

rtabmap

При первом запуске RTAB-Map отобразит два окна, сообщающих вам, где он сохранит свою базу данных, файлы конфигурации и т. д.

SLAM на основе видения: руководство



SLAM на основе видения: руководство

Далее вы должны увидеть GUI RTAB-Map:

SLAM на основе видения: руководство

Нам нужно создать новую базу данных RTAB-Map и начать захват изображений:

SLAM на основе видения: руководство



SLAM на основе видения: руководство

После чего, если все работает правильно, вы должны увидеть изображения с камеры глубины:

SLAM на основе видения: руководство



Калибровка камеры

Алгоритмы визуального SLAM требуют осторожности.

калибровка камеры и исправление полученного изображения.

В большинстве случаев используется модель камеры-обскуры.

Процесс калибровки включает в себя расчет внутренних параметров модели и коэффициентов модели искажений.

ROS имеет встроенный инструменты калибровки камеры .

Перед калибровкой камеры необходимо подготовить калибровочный образец: распечатать шахматный рисунок (например, такой , желательно хотя бы А3, лучше больше).

Утилита запускается следующим образом:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera

Где

  • --size 8x6 указывает количество внутренних углов шахматного узора (8x6 соответствует шаблону из квадратов 9x7)
  • --square 0.108 — размер (стороны) квадрата шахматной доски в метрах
Для более точной калибровки необходимо снимать калибровочный объект в разных частях кадра с разным масштабом и наклоном/поворотом.

Утилита самостоятельно подберет необходимое количество кадров для процесса калибровки.

После того, как будет собрано достаточное количество кадров (все индикаторы станут зелеными), вы можете начать процесс калибровки, нажав кнопку «калибровать».

Затем вы должны нажать кнопку «Зафиксировать», чтобы сохранить данные калибровки для выбранного источника.



SLAM на основе видения: руководство



Виртуальная коробка

Как мы и обещали, дадим пару советов по установке всей среды внутри виртуальной ОС.

В качестве теста мы попробовали установить 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 и активировав соответствующую настройку в свойствах виртуальной машины.

Также велика вероятность того, что после того, как вы все благополучно установите, вы будете сильно разочарованы.

В нашем случае произошло именно это — при запуске примеров RViz получает от камеры только один кадр, после чего с камеры не поступают никакие данные.

Эту проблему мы до сих пор не преодолели, поэтому полностью отказались от использования виртуальной машины, что и советуем вам сделать.

На этом подготовительная часть завершена.

В следующей части мы начнем настраивать и использовать различные типы визуального SLAM. Теги: #slam #ros #kinect #Обработка изображений #Разработка робототехники

Вместе с данным постом часто просматривают: