第二章 可通行性栅格生成(RANSAC方法)

请添加图片描述

系列文章目录

上一篇发的图其实最后的结果其实更差,对于工地部分并没有识别出来是不可通行区域,由于之前的更多在高度等集合特征入手,对于边缘会稍微敏感一些,而这种工地部分的点云其实并没有很多的几何高度变化,而对于小车来说又是不可通行的,这里结合了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;                     //将这些栅格标记变为白色
    }

虽然在平路上效果看着还可以,但是有很多隐藏的问题,后续会慢慢解决。
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢躺着玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值