在ROS系统中使用PCL教程_第1页
在ROS系统中使用PCL教程_第2页
在ROS系统中使用PCL教程_第3页
在ROS系统中使用PCL教程_第4页
在ROS系统中使用PCL教程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在ROS系统中使用PCL教程在ROS中点云的数据类型在ROS中表示点云的数据结构有:sen sor_msgs: Poin tCloudsen sor_msgs: Poin tCloud2p cl: Poin tCloudvT禾 R p cl: Poi ntCloudvT 和 p cl:toROSMsg禾 R sen sor_msgs: Poi ntCloud2关于PCL在ros的数据的结构,具体的介绍可查看 /pcl/Overview关于 sensor_msgs:PointCloud2禾口 pcl:PointCloudvT之间的转换之间的转使用 pcl:fromROSM

2、sg sen sor_msgs: Poi ntCloud 换_使用 sen sor_msgs:c on vert Poin tCloud2T oPoin tCloudsen sor_msgs:co nvert Poi ntCloudT oP oi ntCloud2.那么如何在ROS中使用PCL呢?(1 )在建立的包下的CMakeLists.txt文件下添加依赖项findpackage(catkin REQUIRED COMPONENTS roscpp厂 os pystdnsgssersor_pisgscv_bridgetnage_traris potpcl_coiwesionspcl_ros在

3、package.xml文件里添加:lib pcl-vbuild_de pen dlib pcl-all-devv/build_de pend allv/ru n_depend在src文件夹下新建.cpp文件#includevros/ros.h/ PCL sp ecific includes#include #include vp cl_conversions/pcl_conversions.h#include vp cl/poin t_cloud.h#include vp cl/point_typ es.h ros:Publisher pub; void cloud_cb ( const se

4、nsor_msgs:PointCloud2ConstPtr& input) / Create a container for the data.sensor_msgs: Po intCloud2 out put;/ Do data p rocessing here.out put = *input;/ Publish the data.pub.p ublish (out pu t); int main ( int argc, char* argv) / Initialize ROSros:init (argc, argv, my_p cl_tutorial ); ros:NodeHandle

5、nh;ros:Subscriber sub = nh.subscribe ( input , 1, cloud_cb);output , 1);pub = nh.advertise ( / Sp inros:s pin ();在CMakeLists.txt 文件中添加:add_executable(exa mple src/exa mpl e.c pp) target_link_libraries(exa mple $catkin_LIBRARIES) catkin_make之后生成可执行文件,roslaunch op enni_launch op enni.launchrosrun ros_

6、slam exa mple inp ut:=/camera/de pth/points运行以下命令这是打开kinect发布的命令运行我们生成的文件运行RVIZ可视化以下,添加了程序发布的点云的话题既可以显示。同时也 可以使用PCL自带的显示的函数可视化(这里不再一一赘述)$ rosru n rviz rviz在RVIZ中显示的点云的数据格式sensor_msgs:PointCloud2;那么如果我们想实现对获取的点云的数据的滤波的处理,这里就是进行一个 简单的体素网格采样的实验同样在src文件夹下新建.CPP文件,然后我们的程序如下。也就是要在回调 函数中实现对获取的点云的滤波的处理,但是我们

7、要特别注意每个程序中的 点云的数据格式以及我们是如何使用函数实现对ROS与PCL的转化的。程序如下/*关于使用 sensor_msgs/PointCloud2 ,*/#include/ PCL的相关的头文件#include #include vp cl_conversions/pcl_conversions.h#include vp cl/poin t_cloud.h#include vp cl/point_typ es.h#include vp cl/filters/voxel_grid.h/申明发布器-ros: Publisher p ub;/回调函数void cloud_cb ( con

8、st sensor_msgs:PointCloud2ConstPtr& input)/ 特别注意的是这里面形参的数据格式 /声明存储原始数据与滤波后的数据的点云的格式P cl: PCLP ointCloud2* cloud = new p cl: PCL PointCloud2;式 p cl: PCLP ointCloud2Const Ptr cloud Ptr(cloud);p cl: PCLP ointCloud2 cloud_filtered;/转化为PCL中的点云的数据格式p cl_conversions:t oP CL(*i np ut, *cloud);p cl:VoxelGrid

9、v pci: PCLP ointCloud2 sor;/滤波的头文件/原始的点云的数据格/存储滤波后的数据格式/进行一个滤波处理/实例化滤波sor.setIn pu tCloud (cloud Ptr);/ 设置输入的滤波sor.setLeafSize ( 0.1 , 0.1 , 0.1); /设置体素网格的大小sor.filter (cloud_filtered);/ 存储滤波后的点云/再将滤波后的点云的数据格式转换为ROS下的数据格式发布出去sensor_msgs: PointCloud2 out put;/声明的输出的点云的格式pcl_conversions:fro mP CL(clou

10、d_filtered, out put);/ 第一个参数是输入,后面的是输出/发布命令pub.p ublish (out pu t);int main ( int argc, char* argv) /初始化ROS节点ros:init (argc, argv,my_p cl_tutorial);ros:NodeHandle nh;/声明节点的名称/为接受点云数据创建一个订阅节点ros:Subscriber sub = nh.subscribe ( input , 1, cloud_cb); /创建 ROS 的发布节点pub = nh.advertisevsensor_msgs:PointClo

11、ud2 ( output , 1); / 回调 ros:spin (); -看一下结果如图,这是在 RVIZ中显示的结果,当然也可以使用 PCL库实现可 视化(注意我们在rviz中显示的点云的数据格式都是sen sor_msgs: Poi ntCloud2这是PCL点云库中定义的一种的数据格式,在要区另 I厂 p cl: PCLP oi ntCloud2RVIZ中不可显示,)的举例应用。这一类型的数据格式是PCL库中关于使用 pcI/PointCloud定义的一种数据格式这里面使用了两次数据转换从sen sor_msgs/Poin tCloud2 p cl:ModelCoefficie nts

12、s.代码P cl/Poi ntCloudvTp cl_msgs:ModelCoefficie nt#include vros/ros.h/ PCL sp ecific includes#include vsensor_msgs/ Po intCloud2.h#include vp cl_conversions/pcl_conversions.h#include vp cl/ros/conversions.h/关于平面分割的头文件#include#include vp cl/poin t_cloud.h#include vp cl/point_typ es.h vp cl/sa mpl e_co

13、nsensus/model_t yp es.h/分割模型的头文件/采样一致性的方法/ransac分割法#include vp cl/sa mpl e_consensus/method_t yp es.h#include vp cl/segmentation/sac_segmentation.h ros:Publisher pub; void cloud_cb ( const sensor_msgs:PointCloud2ConstPtr& input) - -/ 将点云格式为sensor_msgs/PointCloud2格式转为 pcl/PointCloudp cl: PointCloudv

14、pel: PointXYZ cloud;p cl:fromROSMsg (*in put, cloud);/ 关键的一句数据的转换p cl:ModelCoefficients coefficients;/ 申明模型的参数pcl:Pointindices inliers;/申明存储模型的内点的索引/创建一个分割方法P cl:SACSegmentationv pel: PointXYZ seg;/这一句可以选择最优化参数的因子seg.setOptimizeCoefficients ( true ); /以下都是强制性的需要设置的 seg.setModelTy pe (p cl:SACMODEL_

15、PLANE);/ 平面模型seg.setMethodT ype (p cl:SAC_RANSAC);/分割平面模型所使用的分割方法seg.setDistanceThreshold ( 0.01);/ 设置最小的阀值距离seg.setin pu tCloud (cloud.makeShared ();/ 设置输入的点云boost sharedptrseg.segment (inliers, coefficients);/cloud.makeShared()仓 U建一个/把提取出来的内点形成的平面模型的参数发布出去P cl_msgs:ModelCoefficients ros_coefficien

16、ts;p cl_conversions:fro mP CL(coefficients, ros_coefficients); pub.p ublish (ros_coefficients); - int main ( int argc, char* argv) / Initialize ROSros:init (argc, argv,my_p cl_tutorial);ros:NodeHandle nh;/ Create a ROS subscriber for the input po int cloudros:Subscriber sub = nh.subscribe ( input ,

17、1, cloud_cb);/ Create a ROS p ublisher for the out put model coefficientspub = nh.advertisevpcl_msgs:ModelCoefficients (output , 1);/ Spin-ros:s pin ();提取点云中平面的参数并且发布岀去PCL对ROS的接口的总结比如:P cl:toROSMsg(*cloud,out put);cloud转换成ros里面的提供的以消息为基础的转ROSPCL数据类型成消息型。一些最实现的功能是将pel 里面的 Pcl:Pointcloudvpel:PointXYZs

18、en sor_msgs: Poin tCloud2 out put这个类型。PCL对ROS的接口提供 PCL数据结构的转换,通过通过 换系统系统。这有一系列的转换函数提供用来转换原始的 有用常用的的 message类型列举在下面。Ros消息里面的每一个部分。它包pcl:Header 类型std_msgs : Header: 这不是真的消息类型,但是用在 含了消息被发送的时间和序列号和框名。PCL等于voidvoidvoidvoidvoidvoidvoidvoidvoidvoidvoidvoidvoidvoid这是最重要的类型。这个消息通常是用来转换pci: PCL Poin tcioud2这个

19、类型也很重要,因为前面版本的sen sor_msgs: Poin tCioud2:pci: Poi ntCioud类型的,可能被废除。p ci_msgs: Pointin dices:p ci:Pointin dicesp ci_msgs: Po iygo nM eshpci 里面等于 pci:PoiygonMeshpci_msgs:Vertices:这个类型包含了一系列的顶点作为一个数组的下标,来描述一个多边形。在 pci里面等于 Pci:Verticespci_msgs:ModeiCoefficie nts:这存储了一个模型的不同的系数,比如描述一个平面需要4个系数。在 PCL里面等于 P

20、ci:ModeiCoefficients上面的数据可以从PCL转成ROS里面的PCL。所有的函数有一个类似的特征,意味着一旦我们知道这样去转换一个类型,我们就能学会转换其他的类型。下面的函数是在pci_c on versio ns命名空间里面提供的函数下面的函数是在pci_c on versio ns 命名空间里面提供的函数copyl mageMetaData (const sen sor_msgs:Image &image, p ci:P CLImage &p cl_image)copyP CLImageMetaData (const p ci: PCLImage &p ci_image,

21、sen sor_msgs:lmage &image)copyPCLPoin tCIoud2MetaData (co nst pcl:PCLPoin tCIoud2 &pci_p c2, sen sor_msgs:Poin tCIoud2 &pc2)这个类型存储属于点云里面的点的下标,在pci里面等于这个类型包括消息需要描述多边形网眼,就是顶点和边,在copyPoin tCioud2MetaData (const sen sor_msgs:Poin tCioud2 &p c2, p ci: PCLP oi ntCloud2 &p ci_pc2)fromPCL (const p ci: PCLIm

22、age &p ci_image, sen sor_msgs:Image &m age)fromPCL (const std:vector &pcl_pfs, std:vector &pf s)fromPCL (con st pci: PCLPoin tCloud2 &p cl_ pc2, sen sor_msgs: Poin tCloud2 &p c2)moveFromPCL (p ci: PCLImage &p ci_image, sen sor_msgs:Image &image)moveFro mPCL (p cl: PCL Poin tCloud2 &pcl_pc2, sen sor_

23、msgs: Poin tCloud2 &pc2)moveT oPCL (se nsor_msgs:lmage &image, p cl:P CLImage &p cl_image)moveT oPCL (se nsor_msgs: Poin tCIoud2 &p c2, p cl: PCLPoin tCIoud2 &pcl_p c2)moveT oPCL (p cI_msgs:ModeICoefficie nts &mc, p cI:ModeICoefficie nts &p cl_mc)toPCL (const sen sor_msgs:Image &image, p cl:P CLImag

24、e &p cl_image)toPCL (const sen sor_msgs: Poin tCIoud2 &pc2, p cl: PCLP oi ntCloud2 &pcl_p c2)总结出来就是void fromPCL (const vPCL Type& vROS Message typ e &);void moveFromPCL ( &);void toPCL (const vROS Message type& vPCL Type&);void moveToPCL (vROS Message type& vPCL Type&);PCL类型必须被替换成先前指定的PCL类型和ROS里面相应的

25、类型。sensor_msgs: PointCioud2有一个特定的函数集去执行转换void toROSMsg (const pci:PointCioudvT& sensor_msgs:PointCioud2 &);ROS 的点云 sensor_msgs:PointCloud2 类型void fromROSMsg (const sensor_msgs:PointCloud2 & pci:PointCloudvT&);中的 pci:PointCloudvT类型void moveFromROSMsg (sensor_msgs:PointCloud2 & pci:PointCloudvT&);pci:

26、 PointCloudvT类型转换为转为PCL转换为记录关于我们运行 rosla unch openni_launch openn i.la unch命令时生成的话题以及这些话题的数据类型便于后期的处理,只有知道它们的数据结构,才能很好的对数据进行处理,我们观察到使用rost op ic list的所有话题的列表,当然其中也有一些不经常使用的话题类型,比如下面这些话题是我们经常使用 的/camera/de pth/image/camera/de pth/image_raw/camera/de pth/points/camera/ir/image_raw/camera/rgb/image_col

27、or/camera/rgb/image_raw发布的话题:image_raw (se nsor_msgs/lmage) :未处理的原始图像 使用命令查看 sensor_msgs/lmage的数据camera_i nfo(se nsor_msgs/Camera Info):包含了相机标定配置以及相关数据 gs/ReqtonOfIrterest rot xoffs色t y_offset height widthROS格式点云或包与点云数介绍几个ROS节点运行的几种工具。他们的作用是 据(PCD文件格式之间的相互转换。(1) bag_to_ped用法:rosr un p cl_ros bag_t o

28、_pcd vinpu t_file.bag vtop ic vout pu t_directory读取一个包文件,保存所有ROS点云消息在指定的PCD文件中。(2) convert_pcd_to_image用法:rosr un p cl_ros con vert_ pcd_to_image vcloud .pcd加载一个PCD文件,将其作为 ROS图像消息每秒中发布五次。(3) con vert_ poin tcloud_to_image用法:rosr un p cl_ros con vert_ poin tcloud_to_image inpu t:=/my_cloud out pu t:=

29、/my_image查看图像: rosru n image_view image_view image:=/my_image订阅一个ROS的点云的话题并以图像的信息发布出去。(4) Pcd_to_pointcloud用法:rosr un p cl_ros p cd_t o_poin tcloud vfile .p cd vi nterval ? vfile .pcd is the (required) file n ame to read.? vin terval is the (op ti on al) nu mber of sec onds to slee p betwee n messag

30、es. If vin terval is zero or not sp ecified the message is p ublished once.加载一个PCD文件,发布一次或多次作为ROS点云消息(5) pointcloud_to_pcd例如: rosr un p cl_ros p oi ntcloud_to_ pedinpu t:=/velody ne/poin tcloud2订阅一个ROS的话题和保存为点云PCD文件。每个消息被保存到一个单独的文件,名称是由一个可自定义的前缀参数,ROS时间的消息,和以PCD扩展的文件。那么我们使用一个简单的例子来实现在ROS中进行平面的分割,同时注

31、意到使关于使用 p cl/PointCloudvT式这里面使用了两次从 p cl:ModelCoefficients用的数据转换的使用的举例应用。这一类型的数据格式是PCL库中数据转换从 sensor_msgs/PointCloud2 到 至 y P cl_msgs:ModelCoefficients./*定义的一种数据格pcl/PointCloudvT和*/ #include /ROS#include / PCL sp ecific includes#include #include vp cl_conversions/pcl_conversions.h#include vp cl/ros/

32、conversions.h#include vp cl/poin t_cloud.h#include vp cl/point_typ es.h#include vp cl/io/pcd_io.h/关于平面分割的头文件/分割模型的头文件/采样一致性的方法/ransac分割法#include vp cl/sa mpl e_consensus/model_t yp es.h #include vp cl/sa mpl e_consensus/method_t yp es.h #include vp cl/segmentation/sac_segmentation.h ros:Publisher pu

33、b; void cloud_cb ( const sensor_msgs:PointCloud2ConstPtr& input) - -/ 将点云格式为sensor_msgs/PointCloud2 格式转为 pcl/PointCloudp cl: PointCloudv pel: PointXYZ cloud;/关键的一句数据的转换/申明模型的参数p cl:fromROSMsg (*in put, cloud);p cl:ModelCoefficients coefficients;p cl: Po intindices inliers;/申明存储模型的内点的索引/创建一个分割方法p cl:SACSegmentation seg;/这一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论