10.10 Узлы PCL и трехмерные облака точек

Библиотека облаков точек (PCL) - это обширный проект, включающий множество мощных алгоритмов обработки облаков точек. Это особенно полезно для роботов, оснащенных камерой RGB-D, такой как Kinect at Xtion Pro, или даже более традиционной стереокамерой. Хотя детали использования PCL выходят за рамки этого тома, мы можем хотя бы коснуться некоторых основ.

На момент написания этой статьи основным API для PCL был C ++. Если вы уже являетесь опытным программистом C ++, вы можете сразу начать с отличных учебных пособий на веб-сайте PCL. Для энтузиастов Python теперь доступен предварительный набор привязок Python. Между тем, пакет pcl_ros предоставляет несколько nodelets для обработки облаков точек с использованием PCL без необходимости писать какой-либо код вообще. По этой причине мы кратко рассмотрим несколько функций, которые мы можем выполнять на облаках точек с помощью pcl_ros. (Вы также можете найти полный список доступных nodelets pcl_ros в руководствах по pcl_ros в ROS Wiki.)

10.10.1 Проходной фильтр

Первый узел PCL, который мы рассмотрим, - это фильтр PassThrough. Этот фильтр удобен, если вы хотите ограничить свое внимание той частью изображения, которая попадает в определенный диапазон глубины. Мы будем использовать этот фильтр в нашем приложении Person Follower в следующей главе, так как мы хотим, чтобы робот следил только за теми объектами, которые находятся на определенном расстоянии.

Прежде чем попробовать фильтр, давайте посмотрим на файл запуска passthrough.launch в каталоге rbx1_vision / launch:

<launch>
<!-- Start the nodelet manager -->
<node pkg="nodelet" type="nodelet" name="pcl_filter_manager" args="manager" output="screen" />
<!-- Run a passthrough filter on the z axis -->
<node pkg="nodelet" type="nodelet" name="passthrough" args="load pcl/PassThrough pcl_filter_manager" output="screen">
<remap from="~input" to="/camera/depth_registered/points" /> <remap from="~output" to="/passthrough" />
<rosparam>
filter_field_name: z filter_limit_min: 1.0 filter_limit_max: 1.25 filter_limit_negative: False
</rosparam>
</node>
</launch>

Файл запуска сначала загружает nodele pcl_filter_manager, а затем passthroughnodelet. Прошедший через ноль выводит ряд параметров, описанных ниже:

  • filter_field_name: обычно это будет либо x, y, либо Z, чтобы указать оптическую ось, которая должна быть отфильтрована. Под "фильтром" мы подразумеваем, что только точки в пределах минимальных и максимальных пределов (определенных далее) будут сохранены. Помните, что ось z указывает на камеру и является тем, что мы обычно подразумеваем под глубиной.

  • filter_limit_min: минимальное значение (в метрах), которое мы примем.

  • filter_limit_max: максимальное значение (в метрах), которое мы примем.

  • filter_limit_negative: если установлено значение True, то сохраняйте только то, что находится вне пределов фильтра.

В примере файла запуска мы установили минимальные и максимальные пределы на 1,0 и 1,25 метра соответственно. Это означает, что будут сохраняться только точки, которые находятся на расстоянии от 3 до 4 футов от камеры.

Обратите внимание, что в файле запуска задается тема облака входных точек: / camera / deep_registered / points и theoutputtopicto / passthrough. Это имя выходной темы необходимо, когда вы хотите просмотреть результаты в RViz.

Чтобы увидеть результат, начните с запуска соответствующего драйвера для вашей глубинной камеры:

Для Microsoft Kinect:

$ roslaunch freenect_launch freenect-registered-xyzrgb.launch

Для камер Asus Xtion, Xtion Pro или Primesense 1.08 / 1.09:

$ roslaunch openni2_launch openni2.launch depth_registration:=true

ПРИМЕЧАНИЕ. Здесь мы включаем регистрацию глубины, чтобы изображение глубины и изображение RGB были правильно выровнены попиксельно. Регистрация обычно желательна, если вы планируете использовать компоненты RGB и глубины изображения и связанного облака точек.

В другом терминале запустите сквозной фильтр:

$ roslaunch rbx1_vision passthrough.launch

Затем запустите RViz с помощью предоставленного файла конфигурации PCL:

$ rosrun rviz rviz -d `rospack find rbx1_vision`/pcl.rviz

Когда RViz установлен, посмотрите на панель «Дисплеи» слева. По умолчанию следует проверять Original PointCloud, и вы должны увидеть облако точек с цветовой кодировкой на главном экране. Используйте мышь, чтобы вращать облако и просматривать его под разными углами. Вы также можете увеличивать и уменьшать масштаб облака точек, используя колесо прокрутки мыши.

Чтобы увидеть результат фильтра Passthrough, снимите флажок Original PointCloud и проверьте Passthrough. Тема отображения PassThrough должна быть установлена ​​на / passthrough. Если нет, нажмите на поле Тема и выберите его из списка.

Поскольку мы установили пределы расстояния для довольно узкого окна, не пугайтесь, если вы не видите точек в RViz при выборе экрана PassThrough. Однако, встаньте перед камерой и двигайтесь к ней и от нее, и вы должны увидеть, как ваше изображение появляется и исчезает, когда вы проходите через пределы фильтра.

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

$ rosrun rqt_reconfigure rqt_reconfigure

затем выберите проходной узел. Если вы отметили галочку в поле filter_limit_negative, теперь вы должны найти «дыру» между пределами расстояния. Теперь все, что находится за вашими пределами, должно быть видно, но когда вы пройдете через дыру, вы исчезнете.

Кстати, вы можете изменить способ отображения глубины для данной темы облака точек, изменив тип Color Transformer, указанный в параметрах отображения PassThrough. Например, выбор RGB8 вместо оси будет отображать фактические значения цвета в пикселях, в то время как настройка оси использует карту глубины с цветовой кодировкой. Рекомендуемая настройка для стиля: Точки. Вы можете попробовать другие варианты здесь, но вы, вероятно, обнаружите, что они значительно замедляют ваш компьютер, если у вас нет очень мощной машины.

10.10.2 Объединение более одного проходного фильтра

Мы можем объединить несколько фильтров PassThrough в одном файле запуска. В частности, мы можем наложить ограничения на все три измерения и создать прямоугольник так, чтобы были видны только точки внутри прямоугольника. Результатом является своего рода 3D-фокус внимания. Если мы установим для параметра thefilter_limit_negative значение True для каждого фильтра, будут видны только точки вне поля.

В качестве примера рассмотрим файл запуска passthrough2.launch в каталоге rbx1_vision / launch. Файл запуска включает в себя три экземпляра проходного узла, по одному для каждого оптического измерения x, y и z. Обратите внимание, что каждый нодлет должен иметь уникальное имя, поэтому мы назвали их passthrough_x, passthrough_y и passthrough_z. Затем мы устанавливаем минимальные / максимальные ограничения расстояния для каждого фильтра, чтобы создать коробку нужного размера. Обратите внимание, как тема ввода последующего фильтра установлена ​​как тема вывода предыдущего. Окончательный результат всех трех фильтров по-прежнему публикуется в разделе / ​​passthrough, поэтому вы можете использовать тот же файл конфигурации RViz, чтобы увидеть его. Завершите предыдущий файл passthrough.launch и запустите:

$ roslaunch rbx1_vision passthrough2.launch

Теперь передвигайтесь перед камерой, и вы сможете определить границы проходной рамки. Вы также можете поиграть с настройками в rqt_reconfiguretocreatefilterboxes ofdifferentsize. (Примечание: rqt_reconfigure не обновляет автоматически список узлов при запуске нового узла. Поэтому вам придется выйти из rqt_reconfigure и снова вызвать его.)

10.10.3 Фильтр Voxel Grid

Второй фильтр, который мы рассмотрим, это фильтр VoxelGrid. Облака точек от камер высокого разрешения содержат очень большое количество точек и могут потребовать много ресурсов процессора для обработки. Чтобы уменьшить нагрузку и обеспечить более высокую частоту кадров, фильтр VoxelGrid сокращает входное облако, используя параметры, указанные в файле запуска. В результате получается новое облако точек с гораздо меньшим количеством точек. Давайте посмотрим на файл запуска voxel.launch, находящийся в каталоге rbx1_vision / launch:

<launch>
<!-- Start the nodelet manager -->
<node pkg="nodelet" type="nodelet" name="pcl_manager" args="manager" output="screen" />
<!-- Run a VoxelGrid filter to clean NaNs and downsample the data -->
<node pkg="nodelet" type="nodelet" name="voxel_grid" args="load pcl/VoxelGrid pcl_manager" output="screen">
<remap from="~input" to="/camera/depth_registered/points" /> <remap from="~output" to="/voxel_grid" />
<rosparam>
filter_field_name: z filter_limit_min: 0.01 filter_limit_max: 3.5 filter_limit_negative: False leaf_size: 0.05
    </rosparam>
  </node>
</launch>

Обратите внимание, что первые четыре параметра идентичны фильтру PassThrough и ведут себя одинаково. Четвертый параметр leaf_size определяет грубость сетки выборки. Значение 0,05 означает, что исходное облако точек отбирается каждые 5 см для получения выходного облака.

Если вы все еще используете файл запуска passthrough2 из предыдущего раздела, прекратите его сейчас. Если драйвер камеры еще не запущен, откройте его сейчас, используя соответствующий файл запуска для вашей камеры, как описано в предыдущем разделе.

Если у вас еще не запущен RViz с файлом конфигурации pcl.rviz, запустите его сейчас:

$ rosrun rviz rviz -d `rospack find rbx1_vision`/pcl.rviz

Наконец, запустите фильтр VoxelGrid:

$ roslaunch rbx1_vision voxel.launch

Чтобы просмотреть результат фильтра VoxelGrid, снимите флажки с отображений Original PointCloud и PassThrough в RViz и установите флажок рядом с VoxelGrid. Вы должны увидеть довольно редкое облако. Это особенно очевидно, если вы увеличиваете облако с помощью колеса прокрутки мыши. Вы также можете alsouserqt_reconfigure изменить leaf_size на лету и наблюдать результат в RViz.

Last updated