Подглава 10.10 PCL Nodelets и 3D Point Clouds

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

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

10.10.1 Фильтр PassThrough

Первым узлом 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>

Файл запуска сначала загружает нодлет pclfilter_manager, а затем passthroug нодлет. Нодлет passthroug принимает несколько параметров, описанных следующим образом:

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, а тему вывода - /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 установлен, посмотрите на панель Displays слева. По умолчанию следует проверять Original PointCloud, и вы должны увидеть облако точек с цветовой кодировкой на главном экране. Используйте мышь, чтобы вращать облако и просматривать его под разными углами. Вы также можете увеличивать и уменьшать масштаб облака точек, используя колесо прокрутки мыши.

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

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

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

$ rosrun rqt_reconfigure rqt_reconfigure

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

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

10.10.2 Объединение нескольких фильтров PassThrough

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

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

$ roslaunch rbx1_vision passthrough2.launch

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

10.10.3 Фильтр VoxelGrid

Второй фильтр, который мы рассмотрим, это фильтр 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. Вы должны увидеть довольно редкое облако. Это особенно очевидно, если вы увеличиваете облако с помощью колесика прокрутки мыши. Вы также можете использовать rqt_reconfigure, чтобы изменить leaf_size на лету и наблюдать результат в RViz.

Last updated