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
