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訂閱主題

輸入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_

 

參考文獻:http://wiki.ros.org/pcl_ros?distro=indigo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM