10.9 OpenNI и отслеживание скелета
Возможно, самым ранним и самым известным робототехническим приложением, использующим глубинную камеру, является отслеживание скелета. Пакет ROS openni_tracker может использовать данные глубины из Kinect или Asus Xtion для отслеживания положения суставов человека, стоящего перед камерой. Используя эти данные, можно запрограммировать робота на выполнение жестовых команд, сигнализируемых пользователем. Один пример того, как сделать это с помощью ROS и Python, можно найти в пакете pi_tracker.
Хотя мы не будем вдаваться в подробности использования отслеживания скелета, давайте хотя бы взглянем на основы.
10.9.1 Установка NITEandopenni_trackerforROSIndigo
На момент написания этой статьи ни двоичные файлы NITE, ни ROS-пакет openni_tracker не были доступны в качестве Debian-пакета для ROS Indigo, поэтому их нужно устанавливать вручную.
Чтобы установить двоичные файлы NITE, следуйте этим инструкциям:
Загрузите двоичный пакет NiTE v1.5.2.23 по одной из следующих ссылок в зависимости от того, используете ли вы 32-битную или 64-битную установку Ubuntu:
а. 32-разрядная версия: http://www.openni.ru/wp-content/uploads/2013/10/NITE-Bin-Linux- x86-v1.5.2.23.tar.zip
б. 64-разрядная версия: http://www.openni.ru/wp-content/uploads/2013/10/NITE-Bin-Linux- x64-v1.5.2.23.tar.zip
Разархивируйте и распакуйте архив в любое место по вашему выбору (например, ~ / tmp)
Распакованный архив - фактически другой архив в формате bz2, поэтому распакуйте и
распакуйте архив в то же место, что и в шаге 2.
Полученная папка должна называться NITE-Bin-Dev-Linux-x64-v1.5.2.23 (64-разрядная версия) или NITE-Bin-Linux-x86-v1.5.2.23 (32-разрядная версия). Переместитесь в эту папку и затем запустите runtheuninstall.shscript, следуя theinstall.shscripts. Для 64-битной версии это будет выглядеть следующим образом:
5 . Чтобы завершить установку NITE, выполните команду:
Это должно сделать это. Теперь мы готовы установить пакет openni_tracker как следующим образом:
10.9.2 Просмотр скелетов в RViz
Пакет ROS openni_tracker подключается к устройству PrimeSense, такому как Kinect или Asus Xtion, и передает преобразование кадра ROS для каждого скелета, обнаруженного перед камерой. Tf-преобразования определяются относительно openni_depth_frame, который встроен в камеру за датчиком глубины.
Чтобы просмотреть каркасные рамки в RViz, выполните следующие действия. Во-первых, подключите камеру Kinect или Asus, а в случае с Kinect убедитесь, что она также имеет питание. Обязательно прекратите запуск любых файлов openni, которые у вас уже есть. Затем выполните команду openni_tracker:
(Не беспокойтесь, если вы не видите начального вывода этой команды. Сообщения о состоянии появятся позже, когда вы будете стоять перед камерой и ваши суставы отслеживаются.)
Теперь вызовите RViz с помощью включенного конфигурационного файла skeleton_frames.rviz:
Следите за RViz и отойдите от камеры как минимум на 5 или 6 футов, принимая «Пси-позу». (См. Страницу openni_tracker для примера позы Psi.) Как только трекер зафиксируется на вас, вы должны увидеть, что ваши скелетные кадры TF появляются в RViz, как показано ниже.
В этот момент вы можете передвигаться как угодно перед камерой, и скелет в RViz должен имитировать ваши действия.
10.9.3 Доступ к каркасным фреймам в ваших программах
Поскольку узел openni_tracker делает скелетные соединения доступными в виде кадров ROS, мы можем использовать tf TransformListener, чтобы найти текущую позицию данного соединения. Пример того, как это работает, можно найти в пакете skeleton_markers. Вы можете установить его в свой личный каталог ROS catkin, используя следующие команды:
Давайте попробуем это, прежде чем смотреть на код. Сначала прекратите любые случаи openni_tracke и RVizyou, возможно, запустили в предыдущем разделе. Затем выполните следующие две команды:
Теперь примите «Psi Pose» перед камерой, следя за RViz, пока калибровка не будет завершена и не начнется отслеживание. Как только трекер закрепится на вас, вы должны увидеть зеленые маркеры скелета в RViz. В этот момент вы можете передвигаться как угодно перед камерой, а скелет в RViz должен следовать вашим действиям, как показано на рисунке ниже:
Прежде чем мы рассмотрим код, давайте удостоверимся, что понимаем файл запуска markers_from_tf.launch, указанный ниже:
Сначала мы запускаем узел openni_tracker с фиксированным кадром, установленным на глубину кадра камеры. (Это по умолчанию, так что строго говоря, указывать параметр в файле запуска не обязательно.) Затем мы запускаем наш скрипт markers_from_tf.py и загружаем параметрfilemarker_params.yamlfromtheparamsdirectory. Этот файл определяет параметры, описывающие внешний вид маркеров, а также список каркасных фреймов, которые мы хотим отслеживать.
Давайте теперь посмотрим на скрипт markers_from_tf.py. Наша общая стратегия будет заключаться в использовании библиотеки tf для нахождения преобразования между каждым каркасным кадром и кадром с фиксированной глубиной. Все, что нам нужно для наших целей - это координаты начала каждого кадра относительно кадра глубины. Это позволяет нам разместить маркер визуализации в этом месте, чтобы представить положение соответствующего скелетного сустава в пространстве.
Ссылка на источник: markers_from_tf.py
Давайте рассмотрим ключевые строки:
Здесь мы устанавливаем фиксированный кадр по умолчанию, используемый узлом openni_tracker. Мы также читаем в списке каркасных фреймов, которые мы хотим отслеживать, как указано в файле параметров marker_params.yaml. Файл параметров выглядит следующим образом:
Файл параметров используется для определения частоты обновления, появления маркеров для отображения в RViz и списка кадров скелета, которые мы хотим отслеживать.
Возвращаясь к сценарию markers_from_tf.py:
Здесь мы создаем TransformListener из библиотеки ROS tf и настраиваем издателя для маркеров визуализации.
Эта строка вызывает функцию (определенную позже в скрипте) для инициализации маркеров. Мы не будем обсуждать маркеры в этом томе, но вы, вероятно, можете довольно легко следовать функции инициализации. Вы также можете посмотреть Учебное пособие по маркерам в ROS Wiki, хотя примеры приведены на C ++.
Прежде чем мы начнем искать каркасные кадры, мы должны убедиться, что, по крайней мере, видим фиксированный кадр камеры, и у нас есть 60 секунд до истечения времени ожидания.
Флаг, указывающий, виден ли скелет.
Теперь мы входим в основной цикл скрипта. Сначала мы отметим время в списке маркеров и очистим все координаты маркера.
Затем мы используем слушатель tf, чтобы получить список всех доступных кадров и проверить, можем ли мы видеть головной кадр.
Если у нас есть рамка заголовка, внешний блок try-Кроме будет успешным, и мы ищем преобразование между рамкой головы и фиксированной рамкой. Если поиск успешен, мы можем быть уверены, что обнаружили скелет, и мы установили флаг в True, чтобы мы могли выйти из внешнего цикла while.
Теперь мы можем перебрать все каркасные кадры и попытаться найти преобразование между каждым кадром и фиксированным кадром. Если поиск выполнен успешно, перевод и ротация возвращаются отдельно. Мы заботимся только о компоненте перевода (расположении источника кадра относительно фиксированного кадра), поэтому мы храним компоненты x, y и z в переменной позиции, которую мы инициализировали ранее как тип Point. Этот пункт затем добавляется в список маркеров.
Как только у нас есть маркер для каждого кадра, мы публикуем весь набор маркеров, а затем подождите один цикл, прежде чем начинать новый цикл.
Last updated
Was this helpful?