1 概要:PCL(Point Cloud Library)ROS接口堆,PCL_ROS是在ROS中涉及n维点云和3D几何处理的3D应用的首选桥梁。这个包提供运行ROS和PCL的接口和工具,包括nodelets、nodes和c++接口

2 源码地址: git  https://github.com/ros-perception/perception_pcl.git (branch: indigo-devel)

3 ROS nodelets

pcl_ros包括一些PCL filters包作为ROS nodelets。下面的连接提供使用这些接口的详细描述

4 ROS C++接口

pcl_ros扩展ROS C++客户端库,用来支持和PCL原始消息类型的消息传递,添加下面的头文件在你的ROS节点的源码中

#include <pcl_ros/point_cloud.h>

这个头文件允许你发布和订阅pcl::PointCloud<T>对象作为ROS消息。这好像ROS作为sensor_msgs/PointCloud2消息,与非PCL的ROS节点无缝连接。例如,你可以在一个节点中发布pcl::PointCloud<T>和在rviz中使用Point Cloud2 display可视化,它通过挂在到roscpp serialization infrastructure起作用。

注意:旧的形式——sensor_msgs/PointCloud已经不在PCL中支持。

4.1 发布点云

你可以发布点云,使用标准的ros::Publisher

复制代码
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>

typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;

int main(int argc, char** argv)
{
  ros::init (argc, argv, "pub_pcl");
  ros::NodeHandle nh;
  ros::Publisher pub = nh.advertise<PointCloud> ("points2", 1);

  PointCloud::Ptr msg (new PointCloud);
  msg->header.frame_id = "some_tf_frame";
  msg->height = msg->width = 1;
  msg->points.push_back (pcl::PointXYZ(1.0, 2.0, 3.0));

  ros::Rate loop_rate(4);
  while (nh.ok())
  {
    msg->header.stamp = ros::Time::now().toNSec();
    pub.publish (msg);
    ros::spinOnce ();
    loop_rate.sleep ();
  }
}
复制代码

4.2 订阅点云

你也可以订阅点云,使用标准的ros::Subscriber

复制代码
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
#include <boost/foreach.hpp>

typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;

void callback(const PointCloud::ConstPtr& msg)
{
  printf ("Cloud: width = %d, height = %d\n", msg->width, msg->height);
  BOOST_FOREACH (const pcl::PointXYZ& pt, msg->points)
    printf ("\t(%f, %f, %f)\n", pt.x, pt.y, pt.z);
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "sub_pcl");
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe<PointCloud>("points2", 1, callback);
  ros::spin();
}
复制代码

5 ROS节点

一些工具可以作为ROS节点运行。它们把ROS消息或包(bags)变为/读取 Point Cloud Data (PCD)文件形式。

5.1 bag_to_pcd

读取一个包文件,保存所有ROS点云消息在指定的PCD文件

5.1.1 用法

rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory>

这里,<input_file.bag>是一个要读取的包文件

<topic>是消息包中的话题,包括保存的消息

<output_directory> 是一个PCD文件的保存位置

5.1.2 示例

rosrun pcl_ros bag_to_pcd data.bag /laser_tilt_cloud ./pointclouds

5.2 把pcd转化为image

加载PCD文件,发布它作为一个ROS image消息,一秒发5次

5.2.1 发布话题

output (sensor_msgs/Image

一个从PCD文件中生成的图像流

5.2.2 用法

rosrun pcl_ros convert_pcd_to_image <cloud.pcd>

读取在<cloud.pcd>点云,以5Hz的频率发布ROS图像消息。

5.3 把点云转为图像

订阅一个ros点云话题和重发布图像消息。

5.3.1 订阅话题

input (sensor_msgs/PointCloud2)  一个点云转化为图像的消息流

5.3.2 发布话题

output (sensor_msgs/Image) 对应图像的消息流

5.3.3 示例

订阅/my_cloud topic和在/my_image话题重发布消息

rosrun pcl_ros convert_pointcloud_to_image input:=/my_cloud output:=/my_image

为了看见图像,使用

 rosrun image_view image_view image:=/my_image

5.4 pcd到pointcloud

加载一个PCD文件,把它发布为一个点云消息

5.4.1 发布话题

cloud_pcd (sensor_msgs/PointCloud2) :一个由PCD文件生成的点云消息流

5.4.2 参数

~frame_id (str, default: /base_link)  :对于发布数据的变换坐标系ID

5.4.3 用法

rosrun pcl_ros pcd_to_pointcloud <file.pcd> [ <interval> ]

5.4.4 示例

rosrun pcl_ros pcd_to_pointcloud point_cloud_file.pcd

or

rosrun pcl_ros pcd_to_pointcloud cloud_file.pcd 0.1 _frame_id:=/odom

第二个指令发布10次/秒 在/odom参考坐标系

5.5  pointcloud_to_pcd

订阅一个ROS话题,保存点云为PCD文件,每一个消息保存为一个独立的文件,名称由可选的前缀参数、消息的ROS时间和.pcd扩展名组成。

5.5.1订阅主题

输入sensor_msgs / PointCloud2

  • 点云流保存为PCD文件。

5.5.2参数

前缀str

  • 创建PCD文件名的前缀。

5.5.3例子

订阅/ velodyne / pointcloud2话题并将每条消息保存在当前目录中。文件名看起来像1285627014.833100319.pcd,具体名称取决于消息的时间戳。

 rosrun pcl_ros pointcloud_to_pcd input:=/velodyne/pointcloud2

在当前命名空间中设置prefix参数,将消息保存到名称为/tmp/pcd/vel_1285627015.132700443.pcd的文件中。

 rosrun pcl_ros pointcloud_to_pcd  input:=/my_cloud   _prefix:=/tmp/pcd/vel_