ROS之pcl_ros
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订阅主题
- 点云流保存为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_
参考文献:http://wiki.ros.org/pcl_ros?distro=indigo