pcl

如何在ROS中使用PCL—数据格式(1)

别来无恙 提交于 2019-12-25 01:52:18
在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud sensor_msgs::PointCloud2 pcl::PointCloud<T> 关于PCL在ros的数据的结构,具体的介绍可查 看 wiki.ros.org/pcl/Overview 关于sensor_msgs::PointCloud2 和 pcl::PointCloud<T>之间的转换使用 pcl::fromROSMsg 和 pcl::toROSMsg sensor_msgs::PointCloud 和 sensor_msgs::PointCloud2之间的转换 使用 sensor_msgs::convertPointCloud2ToPointCloud 和 sensor_msgs::convertPointCloudToPointCloud2 . 那么如何在ROS中使用PCL呢? (1)在建立的包下的CMakeLists.txt文件下添加依赖项 在package.xml文件里添加: <build_depend>libpcl-all-dev</build_depend> <run_depend>libpcl-all</run_depend> 在src文件夹下新建.cpp文件 #include <ros/ros.h> // PCL specific includes

PCL采样一致性算法

和自甴很熟 提交于 2019-12-23 04:27:52
在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心,同时实现了五种类似与随机采样一致形算法的随机参数估计算法,例如随机采样一致性算法(RANSAC)最大似然一致性算法(MLESAC),最小中值方差一致性算法(LMEDS)等,所有估计参数算法都符合一致性原则。在PCL中设计的采样一致性算法的应用主要就是对点云进行分割,根据设定的不同的几个模型,估计对应的几何参数模型的参数,在一定容许的范围内分割出在模型上的点云。 (1)RANSAC随机采样一致性算法的介绍 RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。 数 据分两种:有效数据(inliers)和无效数据(outliers)。偏差不大的数据称为有效数据,偏差大的数据是无效数据。如果有效数据占大多数,无 效数据只是少量时,我们可以通过最小二乘法或类似的方法来确定模型的参数和误差;如果无效数据很多(比如超过了50%的数据都是无效数据),最小二乘法就 失效了,我们需要新的算法

PCL点云随机采样一致性分割算法

巧了我就是萌 提交于 2019-12-23 01:06:25
最近在学习点云的分割算法,目前了解到有两种分割算法,一种是聚类分割算法,一种是随机采样一致性算法,聚类算法上篇文章已经有所提及。今天分析下随机采样一致性算法,然后代码理解; RANSAC随机采样一致性算法介绍 RANSAC是”RANdom SAmple Consensus(随机抽样一致)”的缩写,随机采样一致性算法是一种概率性的算法,有时为了提高有效数据的概率,需要增加迭代次数, 数据一般分为两种:有效数据(inliers)和无效数据(outliers),和目标数据相差不大的数据为有效数据,相差比较大的数据为无效数据。 如果有效数据占据大多数的话,无效数据只有一少部分,我们可以通过最下二乘法或者类似的方法进行确定模型的参数和误差,如果无效数据很多,最下二乘法就失效了,需要新的算法进行。 RANSAC算法的概述 RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点。通过下述的方法进行验证: 有一个模型适用于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。 然后,用所有假设的局内点去重新估计模型

PCL Ransac 点云平面拟合 将三维不平整表面投影到一个平面 C++代码(没有用绘制平面的内部函数)

自古美人都是妖i 提交于 2019-12-22 20:45:11
参考链接(投影):https://blog.csdn.net/soaryy/article/details/82884691 参考链接(Ransac拟合):https://blog.csdn.net/weixin_41758695/article/details/85322304 利用开源的点云库PCL,使用VS2015完成的C++代码,测试文件(.obj)已经在本站(csdn)上传资源,供大家交流,如有问题欢迎多提宝贵意见 对于不平整表面,利用ransac平面拟合,然后将三维不平整表面(或者曲面)近似为一个平面,并将表面上的点投影到该平面,并且显示出来,如图所示,白色为原始点云,绿色为拟合的平面 依据公式: 代码如下 #define _CRT_SECURE_NO_WARNINGS #include <glut.h> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkInteractionStyle); #include <iostream> #include <string> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/io/obj_io.h> #include <pcl

PCL采样一致性算法

此生再无相见时 提交于 2019-12-21 14:15:51
在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心,同时实现了五种类似与随机采样一致形算法的随机参数估计算法,例如随机采样一致性算法(RANSAC)最大似然一致性算法(MLESAC),最小中值方差一致性算法(LMEDS)等,所有估计参数算法都符合一致性原则。在PCL中设计的采样一致性算法的应用主要就是对点云进行分割,根据设定的不同的几个模型,估计对应的几何参数模型的参数,在一定容许的范围内分割出在模型上的点云。 (1)RANSAC随机采样一致性算法的介绍 RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的 算法 ——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。 数 据分两种:有效数据(inliers)和无效数据(outliers)。偏差不大的数据称为有效数据,偏差大的数据是无效数据。如果有效数据占大多数,无 效数据只是少量时,我们可以通过最小二乘法或类似的方法来确定模型的参数和误差;如果无效数据很多(比如超过了50%的数据都是无效数据),最小二乘法就 失效了,我们需要新的算法

rgbdslam_v2运行踩坑实录,并用realsense-d435i跑通

。_饼干妹妹 提交于 2019-12-21 09:49:43
准备工作 rbgdslam_v2 github地址 按照github ,实验环境Ubuntu 16.04, ROS kinetic 如果你电脑安装PCL版本是1.7,那么请直接跳到错误1,如果你也不知道有没有,或者版本多少,那么就跟着我的博客走下去吧 git clone https://github.com/felixendres/rgbdslam_v2.git cd rgbdslam_v2 source install.sh 接着会提示 This script puts all code into ‘/home/damon/Code’. Edit this script to change the location. Press enter to continue, Ctrl-C to cancel 按着步骤走编译出来的东西会被放在~/Code/rgbdslam_catkin_ws 这时候 source ~/Code/rgbdslam_catkin_ws/devel/setup.bash 到这里,rgbdslam_v2已经安装成功 运行,跑数据 首先得下载数据集,tum数据集地址在 这里 可能会下载比较慢,可以找找镜像或者百度云. 错误1 直接运行 roslaunch rgbdslam rgbdslam.launch 会报错 ROS_MASTER_URI = http:/

pcl最小图割(pcl::MinCutSegmentation)算法

霸气de小男生 提交于 2019-12-21 07:30:22
背景知识: 最小割算法是图论中的一个概念,其作用是以某种方式,将两个点分开,当然这两个点中间可能是通过无数的点再相连的。 图一 此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=<V,E>表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。 此处的Graph和普通的Graph稍有不同。 普通的图 分为有向图和无向图;由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。 而 GraphCuts图 是 在普通图的基础上多了2个顶点 ,这2个顶点分别用符号**”S” 和 ”T”**表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。 第一种顶点和边是:第一种普通顶点对应于图像中的每个像素。每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边。这种边也叫n-links。 第二种顶点和边是:除图像像素外,还有另外两个终端顶点,叫S(source:源点,取源头之意)和T(sink:汇点,取汇聚之意)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边。这种边也叫t-links。 参考文章 pcl中的最小图割: pcl官方文档中把点云最小图割算法分成了三个步骤: 1

PCL可视化点云【颜色特征】

寵の児 提交于 2019-12-21 01:54:31
以颜色 区别深度 为了更加直观的显示点云,将不同的深度值显示为不同的颜色。 #include <iostream> #include <pcl/point_types.h> #include <pcl/io/ply_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/io/io.h> using namespace std; using namespace pcl; using namespace io; int main() { PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>); if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 读取.ply文件 cerr << "can't read file bunny.pcd" << endl; return -1; } boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); pcl::visualization:

PCL点云曲面重建(1)

末鹿安然 提交于 2019-12-20 05:35:25
在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过对周围的数据点进行高阶多项式插值来重建表面缺少的部分, (1)用最小二乘法对点云进行平滑处理 新建文件resampling.cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/kdtree/kdtree_flann.h> //kd-tree搜索对象的类定义的头文件 #include <pcl/surface/mls.h> //最小二乘法平滑处理类定义头文件 int main (int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ()); pcl::io::loadPCDFile ("bun0.pcd", *cloud); // 创建 KD-Tree pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>); // Output has the PointNormal

如何增加新的PointT类型

大憨熊 提交于 2019-12-19 12:58:41
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=286 为了增加新的 point类型,首先需要进行定义,例如: struct MyPointType { float test; }; 然后,你得确保你的代码包含了 PCL中特定的类 /算法的模板头文件的实现,它将和你的新 point类型 MyPointType共同使用,例如,你想使用 pcl::PassThrough。你只需要使用下面的代码即可: #include <pcl/filters/passthrough.h> #include <pcl/filters/impl/passthrough.hpp> // the rest of the code goes here 如果你的代码是库的一部分,可以被他人使用,需要为你自己的 MyPointType类型进行显示实例化。 实例 下面的代码段创建了包含XYZ数据的新point类型,连同一个的test的浮点型数据,这样满足存储对齐。 #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> struct MyPointType //定义点类型结构 { PCL_ADD_POINT4D; // 该点类型有4个元素