Работа с Kinect под ROS



Для меня, Kinect — это, в первую очередь, интересный датчик для технического зрения роботов. И хотя, с ним можно работать напрямую из-под OpenCV или PCL, но больший интерес представляет работа с Kinect из-под операционной системы для роботов — ROS.

lsusb

Подключим Kinect к USB и посмотрим как он определится системой.
Для этого выполним команду
lsusb

...
Bus 002 Device 010: ID 045e:02ae Microsoft Corp.
Bus 002 Device 009: ID 045e:02ad Microsoft Corp.
Bus 002 Device 008: ID 045e:02b0 Microsoft Corp.
...

ага — вот он 🙂
подробнее можно посмотреть если задать программе параметр -v:

lsusb -v
Bus 002 Device 010: ID 045e:02ae Microsoft Corp.
...
  iProduct                1 Xbox NUI Camera
...
  Self Powered

Bus 002 Device 009: ID 045e:02ad Microsoft Corp.
...
  iProduct                2 Xbox NUI Audio
...
  Self Powered

Bus 002 Device 008: ID 045e:02b0 Microsoft Corp.
...
  iProduct                2 Xbox NUI Motor
...
  (Bus Powered) 
Установка

Установка стека ROS для работы с Kinect, очень проста. Если у вас уже установлен ROS, то нужно выполнить команды:

sudo apt-get update

— для обновления списка пакетов

Остаётся установить стек openni-kinect:
для ROS версии Diamondback:

sudo apt-get install ros-diamondback-openni-kinect

, соответственно для ROS версии Electric:

sudo apt-get install ros-electric-openni-kinect

Другой вариант — выполнить устновку стека для робота на базе iRobot Create и Kinect — Turtlebot:

sudo apt-get install ros-electric-turtlebot-robot

— я остановился именно на этом варианте (и рекомендую именно его), хотя бы потому, что в стеке Turtlebot-а есть полезный пакет pointcloud_to_laserscan, который преобразует облако точек, получаемое от сенсора Kinect в данные лазерного сканера (Fake Laser), что позволяет использовать готовые алгоритмы SLAM.

pointcloud_to_laserscan — конвертирует трёхмерное облако точек (3D Point Cloud) в двумерные данные лазерного сканера (2D laser scan). Это является полезным для использования устройств типа Kinect-а, в роли лазерного сканера для алгоритмов, требующих двумерные данные (2D-based algorithms) (например, SLAM на основе лазерных сканеров (laser-based SLAM)).

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

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

Проверка

После устновки пакетов и подключения сенсора, можем проверить его работу.
Для этого:
в одном терминале запускаем roscore
а в другом файл запуска openni.launch:

roslaunch openni_launch openni.launch

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

rostopic list

получим вот такую портянку:

/camera/depth/camera_info
/camera/depth/disparity
/camera/depth/image
/camera/depth/image/compressed
/camera/depth/image/compressed/parameter_descriptions
/camera/depth/image/compressed/parameter_updates
/camera/depth/image/theora
/camera/depth/image/theora/parameter_descriptions
/camera/depth/image/theora/parameter_updates
/camera/depth/image_raw
/camera/depth/image_raw/compressed
/camera/depth/image_raw/compressed/parameter_descriptions
/camera/depth/image_raw/compressed/parameter_updates
/camera/depth/image_raw/theora
/camera/depth/image_raw/theora/parameter_descriptions
/camera/depth/image_raw/theora/parameter_updates
/camera/depth/image_rect
/camera/depth/image_rect/compressed
/camera/depth/image_rect/compressed/parameter_descriptions
/camera/depth/image_rect/compressed/parameter_updates
/camera/depth/image_rect/theora
/camera/depth/image_rect/theora/parameter_descriptions
/camera/depth/image_rect/theora/parameter_updates
/camera/depth/image_rect_raw
/camera/depth/image_rect_raw/compressed
/camera/depth/image_rect_raw/compressed/parameter_descriptions
/camera/depth/image_rect_raw/compressed/parameter_updates
/camera/depth/image_rect_raw/theora
/camera/depth/image_rect_raw/theora/parameter_descriptions
/camera/depth/image_rect_raw/theora/parameter_updates
/camera/depth/points
/camera/depth/rectify_depth/parameter_descriptions
/camera/depth/rectify_depth/parameter_updates
/camera/depth_registered/camera_info
/camera/depth_registered/disparity
/camera/depth_registered/image
/camera/depth_registered/image/compressed
/camera/depth_registered/image/compressed/parameter_descriptions
/camera/depth_registered/image/compressed/parameter_updates
/camera/depth_registered/image/theora
/camera/depth_registered/image/theora/parameter_descriptions
/camera/depth_registered/image/theora/parameter_updates
/camera/depth_registered/image_raw
/camera/depth_registered/image_raw/compressed
/camera/depth_registered/image_raw/compressed/parameter_descriptions
/camera/depth_registered/image_raw/compressed/parameter_updates
/camera/depth_registered/image_raw/theora
/camera/depth_registered/image_raw/theora/parameter_descriptions
/camera/depth_registered/image_raw/theora/parameter_updates
/camera/depth_registered/image_rect
/camera/depth_registered/image_rect/compressed
/camera/depth_registered/image_rect/compressed/parameter_descriptions
/camera/depth_registered/image_rect/compressed/parameter_updates
/camera/depth_registered/image_rect/theora
/camera/depth_registered/image_rect/theora/parameter_descriptions
/camera/depth_registered/image_rect/theora/parameter_updates
/camera/depth_registered/image_rect_raw
/camera/depth_registered/image_rect_raw/compressed
/camera/depth_registered/image_rect_raw/compressed/parameter_descriptions
/camera/depth_registered/image_rect_raw/compressed/parameter_updates
/camera/depth_registered/image_rect_raw/theora
/camera/depth_registered/image_rect_raw/theora/parameter_descriptions
/camera/depth_registered/image_rect_raw/theora/parameter_updates
/camera/depth_registered/points
/camera/depth_registered/rectify_depth/parameter_descriptions
/camera/depth_registered/rectify_depth/parameter_updates
/camera/driver/parameter_descriptions
/camera/driver/parameter_updates
/camera/ir/camera_info
/camera/ir/image_raw
/camera/ir/image_raw/compressed
/camera/ir/image_raw/compressed/parameter_descriptions
/camera/ir/image_raw/compressed/parameter_updates
/camera/ir/image_raw/theora
/camera/ir/image_raw/theora/parameter_descriptions
/camera/ir/image_raw/theora/parameter_updates
/camera/ir/image_rect
/camera/ir/image_rect/compressed
/camera/ir/image_rect/compressed/parameter_descriptions
/camera/ir/image_rect/compressed/parameter_updates
/camera/ir/image_rect/theora
/camera/ir/image_rect/theora/parameter_descriptions
/camera/ir/image_rect/theora/parameter_updates
/camera/ir/rectify_ir/parameter_descriptions
/camera/ir/rectify_ir/parameter_updates
/camera/rgb/camera_info
/camera/rgb/debayer/parameter_descriptions
/camera/rgb/debayer/parameter_updates
/camera/rgb/image_color
/camera/rgb/image_color/compressed
/camera/rgb/image_color/compressed/parameter_descriptions
/camera/rgb/image_color/compressed/parameter_updates
/camera/rgb/image_color/theora
/camera/rgb/image_color/theora/parameter_descriptions
/camera/rgb/image_color/theora/parameter_updates
/camera/rgb/image_mono
/camera/rgb/image_mono/compressed
/camera/rgb/image_mono/compressed/parameter_descriptions
/camera/rgb/image_mono/compressed/parameter_updates
/camera/rgb/image_mono/theora
/camera/rgb/image_mono/theora/parameter_descriptions
/camera/rgb/image_mono/theora/parameter_updates
/camera/rgb/image_raw
/camera/rgb/image_raw/compressed
/camera/rgb/image_raw/compressed/parameter_descriptions
/camera/rgb/image_raw/compressed/parameter_updates
/camera/rgb/image_raw/theora
/camera/rgb/image_raw/theora/parameter_descriptions
/camera/rgb/image_raw/theora/parameter_updates
/camera/rgb/image_rect
/camera/rgb/image_rect/compressed
/camera/rgb/image_rect/compressed/parameter_descriptions
/camera/rgb/image_rect/compressed/parameter_updates
/camera/rgb/image_rect/theora
/camera/rgb/image_rect/theora/parameter_descriptions
/camera/rgb/image_rect/theora/parameter_updates
/camera/rgb/image_rect_color
/camera/rgb/image_rect_color/compressed
/camera/rgb/image_rect_color/compressed/parameter_descriptions
/camera/rgb/image_rect_color/compressed/parameter_updates
/camera/rgb/image_rect_color/theora
/camera/rgb/image_rect_color/theora/parameter_descriptions
/camera/rgb/image_rect_color/theora/parameter_updates
/camera/rgb/rectify_color/parameter_descriptions
/camera/rgb/rectify_color/parameter_updates
/camera/rgb/rectify_mono/parameter_descriptions
/camera/rgb/rectify_mono/parameter_updates
/rosout
/rosout_agg
/tf 

О-го сколько всего!
Попробуем посмотреть картинку с RGB-камеры. Для этого, воспользуемся программой image_view, которой укажем интересующее нас название топика:

rosrun image_view image_view image:=/camera/rgb/image_color

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

rosrun image_view image_view image:=/camera/depth/image


Можно себя поздравить — сенсор работает 🙂

rviz

Но намного удобнее (проще и нагляднее) использовать для таких целей мощную программу визуализации — rviz
Остановим image_view, нажав Ctrl+C в соответствующих терминалах.
И запустим rviz:

rosrun rviz rviz

Для начала работы, необходимо указать программе базовую систему отсчёта.
В левой части окна rviz, выводятся текущие параметры визуализации.
В самом верху находятся глобальные настройки:
.Global Options
щёлкаем напротив Fixed Frame и в появившемся окошке доступных систем отсчёта указываем

/camera_link

Теперь можно добавлять визуализацию 🙂
Щёлкаем внизу на кнопке Add и из списка объектов визуализации выбираем камеру:
Camera
Появится пустое окошко, а в области параметров появятся параметры камеры. Остаётся выбрать топик, картинки которого мы хотим посмотреть.
Щёлкаем напротив Image Topic и получаем окошко со списком топиков, которые публикуют сообщения типа image.
Например, выберем ИК-картинку:

/camera/ir/image_rect

Отключим показ картинки, просто сняв галочку напротив Camera в области параметров.
И добавим облако точек, которое выдаётся топиком

/camera/depth/points

Супер!
но визуализация подтормаживает 🙁

далее: Преобразование облака точек в данные лазерного дальномера

Ссылки
http://www.ros.org/wiki/kinect

http://www.ros.org/wiki/openni_kinect
ROS OpenNI is an open source project focused on the integration of the PrimeSense sensors with ROS.
http://www.ros.org/wiki/openni_camera
http://www.ros.org/wiki/openni_tracker

http://www.ros.org/wiki/turtlebot
http://www.ros.org/wiki/pointcloud_to_laserscan
http://www.ros.org/wiki/rviz

Шпаргалка:
Установка:
ROS Diamondback

sudo apt-get install ros-diamondback-openni-kinect

ROS Electric

sudo apt-get install ros-electric-openni-kinect

или

sudo apt-get install ros-electric-turtlebot-robot

Проверка работы:

roslaunch openni_launch openni.launch
rosrun image_view image_view image:=/camera/rgb/image_color
rosrun rviz rviz

По теме
Что же такое ROS?
Юбилей Kinect-а
Kinect — начало работы — настройка OpenCV


0 комментариев на «“Работа с Kinect под ROS”»

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение