ROS之pcl_ros

摘要:
1摘要:PCL(PointCloudLibrary)ROS接口堆,PCL_ROS是涉及n维点云和ROS中3D几何处理的3D应用的首选桥梁。这个包提供了运行ROS和PCL的接口和工具,包括nodelets、nodes和c++接口2https://github.com/ros-perception/perception_pcl.git(分支:indigo devel)3ROS

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
", msg->width, msg->height);
  BOOST_FOREACH (const pcl::PointXYZ& pt, msg->points)
    printf ("	(%f, %f, %f)
", 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

免责声明:文章转载自《ROS之pcl_ros》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇十一、ASP.NET BoilerplateUbuntu 安装mysql下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QT工程文件的条件编译选择与额外的编译参数配置

QTCreator打开.pro工程文件后,依据不同的构建套件创建项目组。在项目组中,点开构建步骤的“详情”,增加一个自己的宏定义,比如: DEFINES+=IMX_287 然后,我们在.pro文件中添加: contains(DEFINES,IMX_287){ # contains 'Embedded Linux' message( "C...

thrift的使用

yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel wget http://archive.apache.org/dist/thrift/0.9.0/thrift-...

UVA 11404 简单LCS模型DP 字典序比较

这个题目求某个字符串中含的最长的回文子串。 就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗? 直接按LCS的套路来就行了啊,只不过方式变了下,按上面的写法,又麻烦,又根本没利用的LCS的精髓思想 即,先从间隔0位开始做起,然后是间隔1位。。2.。。n-1位,d[i][j]代...

android编译系统的makefile文件Android.mk写法

(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件,即要编译的文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-dir) 上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。 (2)Android.mk中可以定义多个编...

ROS学习之启动文件

ROS学习之启动文件 启动文件就好比我们所有的嵌入式设备、系统等在开机启动时首先要执行的文件。我们一般用启动文件来执行一些准备工作。还有一个更好的功能是它可以同时执行多个节点。笔者通过学习对启动文件做了简要的总结。 0.1创建启动文件 0.1.1结构       和其他 ROS 文件一样,每一个启动文件都应该和一个特定的功能包关联起来。通常的命名方案是以....

关于安装ROS的资料备份

#关于rosdep update的解决方法常见的几种 1.排除网络问题 2.增加TIMEOUT的时间: 更改 /usr/lib/python2.7/dist-packages/rosdep2/下的三个文件sources_list.py、gbpdistro_support.py、rep3.py中的DOWNLOAD_TIMEOUT = 15.0值,改大一点就...