Работа с 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
  • +4
  • 3 февраля 2012, 16:01
  • noonv

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

RSS свернуть / развернуть
+
0
молодчина! поздравляю! так держать!
avatar

aivanov

  • 3 февраля 2012, 17:38
+
+4
а вот елку уже пора убирать))
avatar

aivanov

  • 3 февраля 2012, 18:47
+
0
уже давно убрана :)
avatar

noonv

  • 3 февраля 2012, 19:01

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.