Добрый день уважаемые читатели. В своей последней статье я рассказывал о двух алгоритмах SLAM, предназначенных для камер глубины: rtabmap и RGBD-SLAM. Тогда мы попробовали только построение карты местности. В данной статье я расскажу о возможностях локализации и навигации робота с использованием алгоритма rtabmap. Кого заинтересовало, прошу под кат.

Локализация в rtabmap с визуализацией в rviz


Для начала если не запущен ROS мастер, то запускаем его:

roscore

Запускаем драйвер для камеры:

roslaunch freenect_launch freenect.launch depth_registration:=true

Запустим rtabmap для построения карты с визуализацией в rviz и удалением старой карты:

roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" rtabmapviz:=false rviz:=true

Когда процедура построения карты закончена, завершим работу программы с помощью Ctrl+C для сохранения карты и перезапустим rtabmap в режиме локализации:

roslaunch rtabmap_ros rtabmap.launch localization:=true rtabmapviz:=false rviz:=true

image

Для того, чтобы показать карту в rviz необходимо нажать галочку в пункте Download Map на дисплее MapCloud:

image

image

Переместим камеру в то место, где находится робот на карте в rviz. После этого будет опубликована трансформация между системами координат /map > /odom.

image

Построение карты и навигация с использованием rtabmap на примере Turtlebot


Построение карты и локализацию робота методом rtabmap можно попробовать на симуляторе робота Turtlebot. В rtabmap есть для этого специальные пакеты. Для дополнительной информации даю ссылку на источник материала. Для начала установим необходимые пакеты:

sudo apt-get install ros-<ros_version>-turtlebot-bringup ros-<ros_version>-turtlebot-navigation ros-<ros_version>-rtabmap-ros

По умолчанию используется драйвер OpenNI2, который указан в файле 3dsensor.launch (TURTLEBOT_3D_SENSOR=asus_xtion_pro). В своих экспериментах я использовал камеру Microsoft Kinect. Давайте установим драйвер для него в переменной TURTLEBOT_3D_SENSOR:

echo ‘export TURTLEBOT_3D_SENSOR=kinect’ >> ~/.bashrc
source ~/.bashrc

Сейчас запустим построение карты, используя специальные пакеты для симулятора Turtlebot в rtabmap_ros:

roslaunch turtlebot_bringup minimal.launch
roslaunch rtabmap_ros demo_turtlebot_mapping.launch args:="--delete_db_on_start" rgbd_odometry:=true
roslaunch rtabmap_ros demo_turtlebot_rviz.launch

Мы увидим в окне rviz:



А теперь с облаком точек с камеры Kinect:

image

Вы должны увидеть двухмерную карту, трехмерную карту и еще некоторые выходные данные топиков, необходимые для навигации. Кроме того, в панели дисплеев слева отображаются стандартные дисплеи rviz и дополнительные спечифичные для rtabmap (Local Map, Global Map, Rtabmap Cloud).

image

Переместим камеру в пространстве и через некоторое время мы увидим:

image

По умолчанию rtabmap использует ту же самую базу данных при каждом запуске demo_turtlebot_rviz.launch. Чтобы удалить старую карту и начать построение карты заново (с чистого старта), можно либо вручную удалить базу данных, сохраненную в файле ~/.ros/rtabmap.db, либо запустить demo_turtlebot_rviz.launch с аргументом args:="--delete_db_on_start".

Запустим построение карты без удаления базы данных:

roslaunch rtabmap_ros demo_turtlebot_mapping.launch

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

image

Локализация с Turtlebot


Теперь у нас есть карта, которая сохранена в базе данных в файле ~/.ros/rtabmap.db. Перезапустим demo_turtlebot_mapping.launch в режиме локализации с аргументом localization:=true:

roslaunch rtabmap_ros demo_turtlebot_mapping.launch rgbd_odometry:=true localization:=true

Мы увидим такую картинку:

image

Переместим Kinect в сторону. Робот определит свое новое местоположение как только обнаружит цикл (loop closure):

image

Для успешной детекции цикла потребуется время, поэтому наберитесь терпения.
Работает довольно быстро:



Автономная навигация с Turtlebot


Теперь, когда карта создана, можно попробовать автономную навигацию на известной карте с использованием Navigation stack. Для этого нужно просто указать для робота текущую цель на карте в rviz, в направлении которой должен двигаться робот в автономном режиме. Обо всем остальном позаботится Navigation stack. Нам для начала достаточно нажать кнопку 2D Nav Goal в rviz

image

и указать цель кликнув в произвольном месте на карте

image

Добавим дисплей Pose, выбрав для него топик “/move_base/current_goal” и дисплей Path выбрав топик “/move_base/NavfnROS/plan”. Вы должны увидеть запланированный путь (зеленая линия на карте) и установленную цель, обозначенную красной стрелкой:

image

Пакет move_base отвечает за управление роботом в направлении цели. Он будет публиковать команды движения типа geometry_msgs/Twist в топик /mobile_base/commands/velocity:

rostopic echo /mobile_base/commands/velocity

Дополнительную информацию о работе с Navigation stack можно найти в туториале на официальной странице turtlebot_navigation. Для использования rtabmap на своем собственном роботе есть также туториал.

Таким образом, в этот раз мы смогли выполнить локализацию робота на построенной заранее карте и узнали как задать для робота цель чтобы он мог двигаться к ней в автономном режиме. Желаю вам удачи в экспериментах и до новых встреч!

Комментарии (4)


  1. Alex_ME
    20.11.2017 10:04

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


    Вот, на рисунке изображено положение кинекта и начало СК робота


    Т.е. хотелось бы получать координату не камеры, а СК робота. Пытался вставить промежуточный фрейм между map, odom и фреймами камер, но особо не вышло, rtabmap ломается.


    1. vovaekb90 Автор
      20.11.2017 22:53

      Я с этим не имел дело, но думаю вам нужно использовать пакет tf. Примеры можно посмотреть здесь для rtabmap и в моей статье (файл my_localize.launch).


  1. pasetchnik
    20.11.2017 12:49

    Жалко, что Майкрософт прекратила производство Kinect'а.


    1. cattheblack
      20.11.2017 15:35

      Он всё равно только в помещениях работает. Универсальнее стереозрение использовать