系列文章目录
上一篇发的图其实最后的结果其实更差,对于工地部分并没有识别出来是不可通行区域,由于之前的更多在高度等集合特征入手,对于边缘会稍微敏感一些,而这种工地部分的点云其实并没有很多的几何高度变化,而对于小车来说又是不可通行的,这里结合了RANSAC做一个补充判断之后才有最后的结果
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、RANSAC的使用
这部分在PCL中有成套的使用,如果想换方法或者模型的可以在PCL官网上找,或者其他教学上也挺多的。
//法向量
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); //智能指针声明kd tree与法线
pcl::IndicesPtr indices(new std::vector<int>); //声明一个索引指针
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
pcl::SACSegmentationFromNormals<pcl::PointXYZ, pcl::Normal> seg_normal; //分割对象
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;//创建法线估计对象
normal_estimator.setSearchMethod (tree);//设置搜索方法
normal_estimator.setInputCloud (pc);//设置法线估计对象输入点集
normal_estimator.setKSearch (20);// 设置用于法向量估计的k近邻数目 setRadiusSearch
// normal_estimator.setRadiusSearch (10);
normal_estimator.compute (*normals);//计算并输出法向量
seg_normal.setOptimizeCoefficients (true);
seg_normal.setModelType (pcl::SACMODEL_NORMAL_PLANE);
seg_normal.setNormalDistanceWeight (0.1); //权重与距离成正比,与角度成反比。
seg_normal.setMethodType (pcl::SAC_MSAC);
seg_normal.setMaxIterations (2000);
seg_normal.setDistanceThreshold (0.07); //z_thred
seg_normal.setInputCloud (pc);
seg_normal.setInputNormals (normals);
seg_normal.segment(*inliers, *coefficients);
- ModelCoefficients:用于存储模型系数(例如平面的方程参数)。
- PointIndices:用于存储内点的索引,这些内点与模型相符。
- SACSegmentation:用于执行随机采样一致性(RANSAC)算法进行模型分割。
- ExtractIndices:用于从点云中提取指定索引的点。
二、使用步骤
过滤提取所有不是拟合平面上的点云
extract.setInputCloud(pc);
extract.setIndices(inliers); //提取所有符合的平面点索引
extract.setNegative(true);
extract.filter(*cloud_outliers); //非地面点云
将这些不是地面点所在的栅格全都打上标签
for(int i = 0; i < cloud_outliers->size(); i++){
pt = cloud_outliers->points[i];
inx = pt.x * ARRAY_NX + pt.y;
measured_grid.erase(inx);
*(occ_grid+inx) = 1; //将这些栅格标记变为白色
}
虽然在平路上效果看着还可以,但是有很多隐藏的问题,后续会慢慢解决。