pcl的初步使用(ROS)

ROS里面已经预装好了pcl,和一些与pcl之间的转换,我们接下来看看如何在ros里面使用pcl.。

总的来说,PCL包含了一个很重要得到数据结构,叫PointCloud,这是一个模板类,把点的类型作为模板参数。

下面是最重要的在点云里面的公共域

header 这个域是pcl::PCLHeader类型和指定点云的获取时间。

points:这个域是std::vector<PointT,..>类型,是点云存储的容器。PointT是类模板参数。

width:这个域指定点云的宽度在组织一个图像的时候,否则只有一个。

height:这个域指定点云的高度,没有指定则只有一个。

is_dense:这个域指定点云是否包含无效值(infinite或者NaN)

sensor_origin_:这个域是Eigen::Vector4f 类型,它定义 了传感器的获取姿势就一个区域的转换而言。

sensor_orientation_:这个域是Eigen::Quaternion类型,他定义了sensor作为一个旋转的角度而言。

了解了点云的数据结构以后,下面就可以了解不同点云的类型,pcl是怎么工作的,已及pcl与ROS间的关系。


不同的点云类型

前面所说的,pcl::PointCloud包含一个域,它作为点的容器,这个域是PointT类型的,这个域是PointT类型的是pcl::PointCloud类的模板参数,定义了点云的存储类型。PCL定义了很多类型的点,下面是一些最常用的:

pcl::PointXYZ 这是最简单的点的类型,存储着点的x,y,z信息。

pcl::PointXYZI:这个类型的点是和前面的那个很相似的,但是他也包含一个域描述了点的密集程度。另外还有两个其他的标准的特殊的点的类型:第一个是pcl::InterestPoint,它有一个域去存储长处而不是密集度。pcl::PointWithRange,存储了点的范围(深度).

pcl::PointXYZRGBA:这个类型的点存储了3D信息同时和RGB与Alpha(透明度)

pcl::PointXYZRGB

pcl::Normal:这是一个最常用的点的类型,它代表了给定点的 曲面法线(normal翻译为法线有点奇怪)和曲率的测量。

pcl::PointNormal:这个类型和前面那个一样。只不过它多了坐标(x,y,z)。他的变体有PointXYZRGBNormal和PointXYZINormal,就像名字所说的一样,前者包含颜色,后者包含密集度。


除了以上这些常用的点的类型,还有很多 标准的其他的PCL类型,比如PointWithViewpoint,MomentInvariants,Boundary,PrincipalCurvatures,Histogram.更重要的是在PCL里面除了这些类型,用户还可以自己定义自己的类型。


PCL里面的算法

PCL用一个很特别的设计模式贯穿整个库去定义点云处理算法。总体来说,上面这些类型的算法是高度配置的,为了开发他们的潜能,库必须要提供一个机制对用户来指定哪些参数是需要的,哪些是默认的。

为了解决这个问题,PCL的开发者决定去使每个算法属于一个特定共同点下的同层次的类。这个方式允许PCL开发者通过派生和添加参数值的方式,复用存在的算法。它也允许用户去提供参数值,剩余的是默认值。下面是一小段代码当使用PCL算法时看起来的样子:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::Po
intXYZ>); 
pcl::PointCloud<pcl::PointXYZ>::Ptr result(new pcl::PointCloud<pcl::P
ointXYZ>);
pcl::Algorithm<pcl::PointXYZ> algorithm;
algorithm.setInputCloud(cloud);
algorithm.setParameter(1.0);
algorithm.setAnotherParameter(0.33);
algorithm.process (*result);


PCL对ROS的接口

PCL对ROS的接口提供PCL数据结构的交流,通过通过ROS提供的以消息为基础的交流系统。为了这么做,有几个消息类型交流系统提供的去把点云和其他数据进行涵盖。为了结合这些数据类型,一系列的转换函数提供用来转换原始的PCL数据类型成消息型。一些最有用的message类型列举在下面。

std_msgs:Header:这不是真的消息类型,但是他用在Ros消息里面的每一个部分。它包含了消息被发送的时间和序列号和框名。PCL等于pcl::Header类型

sensor_msgs::PointCloud2:这是最重要的类型。这个消息通常是用来转换pcl::PointCloud类型的,然而,它是很重要的去了解pcl::PCLPointCloud2这个类型,因为前面版本的可能被废除。

pcl_msgs::PointIndices:这个类型存储属于点云里面的点的下标,在pcl里面等于pcl::PointIndices

pcl_msgs::PolygonMesh这个类型包括消息需要描述多边形网眼,就是顶点和边,在pcl里面等于pcl::PolygonMesh

pcl_msgs::Vertices:这个类型包含了一系列的顶点作为一个数组的下标,来描述一个多边形。在pcl里面等于pcl::Vertices

pcl_msgs::ModelCoefficients:这存储了一个模型的不同的系数,比如描述一个平面需要4个系数。在PCL里面等于pcl::ModelCoefficients

上面的数据可以从PCL转成ROS里面的PCL。所有的函数有一个类似的特征,意味着一旦我们知道这样去转换一个类型,我们就能学会转换其他的类型。下面的函数是在pcl_conversions命名空间里面提供的函数

void fromPCL(const <PCL Type> &, <ROS Message type> &);
void moveFromPCL(<PCL Type> &, <ROS Message type> &);
void toPCL(const <ROS Message type> &, <PCL Type> &);
void moveToPCL(<ROS Message type> &, <PCL
 Type> &);

这里,PCL类型必须被替换成先前指定的PCL类型和ROS里面相应的类型。sensor_msgs::PointCloud2有一个特定的函数集去执行转换

void toROSMsg(const pcl::PointCloud<T> &, sensor_msgs::PointCloud2 &);
void fromROSMsg(const sensor_msgs::PointCloud2 &, pcl::PointCloud<T>
&);
void moveFromROSMsg(sensor_msgs::PointCloud2 &, pcl::PointCloud<T> &);
你可能会对每个函数的不同感到奇怪还有它的move版本。其实是正常版本执行的是一个深拷贝(完全拷贝),而move版的是浅拷贝,并使源数据作废。


上面废话了这么多,可以来写代码了,不过小伙伴们不要激动,这不是虽然万恶的"hello world",但也没啥特殊的效果。

先建一个包

catkin_create_pkg chapter6_tutorials pcl_conversions pcl_ros pcl_msgs
sensor_msgs
然后再建一个cpp文件,叫pcl_sample的cpp文件

/*
*File Name pcl_sample
*Author         shukai
*Date           Mon Apr  4 09:29:48 CDT 2016
*Description    A simple pcl demo
*/


#include<ros/ros.h>
#include<pcl/point_cloud.h>
#include<pcl_ros/point_cloud.h>
#include<pcl_conversions/pcl_conversions.h>
#include<sensor_msgs/PointCloud2.h>


int main(int argc,char** argv)
{


ros::init(argc,argv,"pcl_sample");
ros::NodeHandle nh;
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2>("pcl_output",1);
sensor_msgs::PointCloud2 output;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = 100;
cloud->height= 1;
cloud->points.resize(cloud->width*cloud->height);

//Convert the cloud to ROS message
pcl::toROSMsg(*cloud,output);


pcl_pub.publish(output);
ros::spinOnce();
return 0;
}

这个程序的主要目的是建立一个有效的使用PCL的节点,同时看看编译有没有什么问题。

然后接着在CMakelist.txt里面加入以下的东西

寻找系统里面的PCL库

find_package(PCL REQUIRED)
include_directories(include ${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS}

然后下面是生成可执行文件和链接相应的库

add_executable(pcl_sample src/pcl_sample.cpp)
target_link_libraries(pcl_sample ${catkin_LIBRARIES} ${PCL_LIBRARIES})

最后用catkin_make就可以了


总结,ros里面可以用pcl的库,但是往往需要对其转换,比如上面的pcl::toROSMsg(*cloud,output);把pcl里面的pcl::PointCloud<pcl::PointXYZ>转换成ros里面的sensor_msgs::PointCloud2这个类型。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川大学计算机学硕分数线,川大计算机考研分数线

川大计算机考研分数线&#xff1f;2016高考志愿填写&#xff0c;高考考生家长有开端着手预备吗 厚学网收拾了对于普通高校招生填写志愿的有关诀窍&#xff0c;供考生和家长参阅。绝密:高考填报志愿有技巧!志愿填报需要注意的细节问题&#xff1a;语种有限制在咱们要学习的外语语…

pcl里面的3D特征

我这里不介绍pcl里面的类的命名规范&#xff0c;及点的类型。为什么呢?pcl里面类的命名规范&#xff0c;比较繁琐&#xff0c;而且主要是针对要对pcl这个库要开源的人士&#xff0c;而pcl里面的点的类型太多&#xff0c;足够满足你的要求。所以我们要走一条具有中国特色的pcl主…

html本地缓存未查看信息,不同用户看到了相同的信息-一次web系统缓存问题的解决...

最近负责的系统总是出现奇怪的缓存问题&#xff0c;在这里简单记录一下碰到的问题和踩到的坑。问题&#xff1a;用户反映使用不同账号A&#xff0c;B登录时&#xff0c;都出现账号A的页面信息(未邮寄账单提示)。如下所示&#xff1a;图1&#xff1a;未邮寄账单提示一 session缓…

pcl里面的法线估计

法线估计是一个很重要的特征&#xff0c;常常在被使用在很多计算机视觉的应用里面&#xff0c;比如可以用来推出光源的位置&#xff0c;通过阴影与其他视觉影响。 给一个几何表面&#xff0c;去推断给定点的法线方向&#xff0c;即垂直向量的方向往往是不容易的。然而&#xf…

pcl通过积分图来进行法线预测

首先&#xff0c;我们来看一下什么是积分图&#xff0c;我查了一下wiki&#xff0c;发现它的定义是这样的。 A summed area table is a data structure and algorithm for quickly and efficiently generating the sum of values in a rectangular subset of a grid. In the i…

个人计算机的防毒软件无法防御,在win10系统中无法启动defender防御软件的解决方法...

软件大小&#xff1a; 3.56 MB软件版本&#xff1a; 3.3.30.180软件类型&#xff1a;系统补丁查看详情直接下载win10系统是我们现在都在使用的系统&#xff0c;下面小编为大家在win10系统中无法启动defender防御软件的解决方法,希望可以帮助到你们。解决方法&#xff1a;1、根据…

pcl里面的点特征直方图(PFH)

表面法线和曲率可以好的代表一个点的几何特征。然而它们算得很快&#xff0c;而且算法简单&#xff0c;但是它们不能捕获细节&#xff0c;它们只是点的近邻的几何特征的近似估计。作为一个直接的结论&#xff0c;大多数的场景往往会包括很多有着相似特征的点&#xff0c;这会减…

为什么计算机休眠风扇还转,Win7系统进入睡眠模式后电脑风扇还在转的解决方法...

如果长时间离开电脑&#xff0c;可以让win7系统进“睡眠”模式&#xff0c;这样可以节省能源&#xff0c;延长硬盘寿命。但是有位用户说自己Win7系统进入睡眠模式后&#xff0c;依旧可以听到风扇还在转&#xff0c;怎么回事呢&#xff1f;其实这是因为Win7处在低耗能的状态&…

快速特征点直方图描述器(FPFH)

PFH的理论上的时间复杂度是O(nk的平方)&#xff0c;n是点的数量&#xff0c;k是最近邻的个数。对于实时系统来说&#xff0c;这压根就是不行的&#xff0c;所以作为PFH规划的简化版本&#xff0c;FPFH把计算复杂度减少成O(nk),但是还具有很好的和PFH差不多的区分能力。 第一步…

计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...

感谢悟空的邀请&#xff01;“通信行业那些事儿”&#xff0c;专业解读通信、网络类问题&#xff0c;希望我的回答能够给您启发&#xff0c;大家共同探讨、共同提高&#xff01;欢迎关注我&#xff01;楼主您好&#xff01;这个问题&#xff0c;我正好是通信行业的从业人员&…

点集的视点特征直方图的评估

VFH(Viewpoint Feature Histgram)视角特征直方图描述器&#xff0c;可以很直观的表现点的聚类在处理聚类识别与6DOF位姿估计。 下面的图像展示了一个VFH识别和位姿估计的例子。给一些训练集&#xff0c;除了左下角的那个杯子&#xff0c;用来学习&#xff0c;用左下角的杯子作…

计算机电路基础答案,计算机电路基础模拟试卷答案(B)

计算机电路基础》复习题型模拟试卷《计算机电路基础》模拟考试试卷答案(B)一、填空题(1) 场效应管3个电极G、D、S其功能与晶体三极管的 B、C、E 电极相对应&#xff0c;而N沟道和P沟道场效应管则分别类同于 NPN型、PNP型 两种类型的晶体三极管。(2) 触发器分为边沿触发和 脉冲 …

从一个深度图里面导出NARF特征

本节将显示如何提取出NARF关键点通过NARF描述器从一个深度图里面。 以下是一段代码 #include <iostream>#include <boost/thread/thread.hpp> #include <pcl/range_image/range_image.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/…

计算机综合症怎么治,电脑综合症的治疗方法有哪些?

眼保健操(1)操作时保证正确坐姿&#xff0c;尽可能保持自然的端坐位&#xff0c;将后背坐直&#xff0c;并保持颈部的挺直。两肩自然下垂&#xff0c;上臂贴近身体&#xff0c;手肘弯曲成90度&#xff0c;操作键盘或鼠标&#xff0c;应使手腕保持水平。电脑的摆放高度要适度&am…

惯性矩和偏心距描述器

这次我们将学会怎么使用pcl::MomentOfInertiaEstimation 这个类来获取以惯性矩和偏心距为基础的描述器。这个类也能提取坐标对称和定向包围的方形盒子。但是记住导出的OBB不是最小可能性的盒子。 下面介绍了该种方法的特征提取方式。第一次先算出点云矩阵的协方差&#xff0c;…

孕妇能长期在计算机屏幕前工作吗,怀孕了在电脑前工作怎么办

导读:我们自然界的一切物体&#xff0c;只要温度在绝对温度零度以上&#xff0c;都会以电磁波的形式不停地向外传送热量&#xff0c;这种传送能量的方式被称为辐射&#xff0c;我们生活中常见的就是受到电脑的辐射&#xff0c;怀孕期间应该避免电脑的辐射&#xff0c;不然就会对…

pcl里面的RoPs特征(Rotational Projection Statistics)

这次我们将使用pcl::ROPSEstimation这个类来导出点的特征。 下面是这个方法的特征提取方式。有一个网格和一个点集可以让我们来执行一些简单的操作。第一步&#xff0c;对于一个给定的兴趣点局部的表面将会被削平。局部表面包含了在半径内的点和三角形。对于给定的局部表面LRF…

mac os修改计算机名,如何修改Mac系统的个人用户名?

在Mac OS X中一旦建立一个用户&#xff0c;此用户的主目录的目录名将会是它的“短”名。更改登录名和主目录名从来都不简单&#xff0c;以前唯一的方法就是建立一个新用户&#xff0c;然后把所有的文件拷贝过去。Mac 修改用户是一件很悲剧的事&#xff0c;因为牵涉到很多地方的…

pcl使用通道滤波器来滤波

这次我们将展示一个简单的滤波的案例--把不符合的值去掉 代码 #include <iostream> #include <pcl/point_types.h> #include <pcl/filters/passthrough.h>intmain (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::Po…