激光雷达作为自动驾驶最常用的传感器,经常需要使用激光雷达来做建图、定位和感知等任务。
而这时候使用降低点云规模的预处理方法,可以能够去除无关区域的点以及降低点云规模。并能够给后续的pcl点云分割带来有效的收益。
点云预处理
1.1 指定区域获取点云
在实际使用中,我们可以看出,虽然点云的分布范围较广,但大部分的点都集中的中间区域,距离越远点云越稀疏,相对的信息量也越小。
此外还能明显看到一些离群点,因此我们可以筛选掉一些较远的点,只保留我们感兴趣范围内的点。以下为保留 x 在 30m,y 在 15m,z 在 2m 范围内的点的效果:
template void removepointsoutsideregion(boost::shared_ptr& src_cloud_ptr, boost::shared_ptr& dst_cloud_ptr, const std::pair& x_range, const std::pair& y_range, const std::pair& z_range) { int num_points = src_cloud_ptr- >points.size(); boost::shared_ptr cloud_ptr(new pcl::pointcloud()); cloud_ptr- >points.reserve(num_points); for (const auto& pt : src_cloud_ptr- >points) { bool inside = (pt.x >= x_range.first && pt.x = y_range.first && pt.y = z_range.first && pt.z points.push_back(pt); } } dst_cloud_ptr = cloud_ptr;} // 或者使用cropbox来实现去除给定区域外的点 pcl::cropbox box_filter; box_filter.setinputcloud(cloud_ptr); box_filter.setmin(eigen::vector4f(keep_x_range.first, keep_y_range.first, keep_z_range.first, 1.0)); box_filter.setmax(eigen::vector4f(keep_x_range.second, keep_y_range.second, keep_z_range.second, 1.0)); box_filter.filter(*temp_cloud_ptr);1.2 去除给定区域的点
在某些情况下,我们也会需要去除给定区域内部的点,比如在自动驾驶中激光扫描的区域有一部分来自搭载激光雷达的车子本身
template void filterpointswithinregion(boost::shared_ptr& src_cloud_ptr, boost::shared_ptr& dst_cloud_ptr, const std::pair& x_range, const std::pair& y_range, const std::pair& z_range, bool remove) { int num_points = src_cloud_ptr- >points.size(); boost::shared_ptr cloud_ptr(new pcl::pointcloud()); cloud_ptr- >points.reserve(num_points); for (const auto& pt : src_cloud_ptr- >points) { bool inside = (pt.x >= x_range.first && pt.x = y_range.first && pt.y = z_range.first && pt.z points.push_back(pt); } } dst_cloud_ptr = cloud_ptr;}// passthrough: 可以指定点云中的点的某个字段进行范围限制,将其设为 true 时可以进行给定只保留给定范围内的点的功能 pcl::passthrough pass_filter; bool reverse_limits = true; pass_filter.setinputcloud(filtered_cloud_ptr); pass_filter.setfilterfieldname(x); pass_filter.setfilterlimits(-5, 5); pass_filter.getfilterlimitsnegative(reverse_limits); // reverse the limits pass_filter.filter(*filtered_cloud_ptr); pass_filter.setfilterfieldname(y); pass_filter.setfilterlimits(-2, 2); pass_filter.getfilterlimitsnegative(reverse_limits); // reverse the limits pass_filter.filter(*filtered_cloud_ptr); pass_filter.setfilterfieldname(z); pass_filter.setfilterlimits(-2, 2); pass_filter.getfilterlimitsnegative(reverse_limits); // reverse the limits pass_filter.filter(*filtered_cloud_ptr);1.3 点云下采样
1.3.1 栅格化采样
这里第一点介绍栅格化的下采样,在 pcl 中对应的函数为体素滤波。栅格化下采样大致的思路是计算整体点云的中心。
通过计算每个点到中心的距离结合要求的分辨率计算栅格对应的坐标,并入其中,最后遍历每个包含点的栅格计算其中点的几何中心或者取该栅格中心加入目标点云即可。
pcl::voxelgrid voxel_filter; voxel_filter.setleafsize(0.1, 0.1, 0.1); voxel_filter.setinputcloud(cloud_ptr); voxel_filter.filter(*filtered_cloud_ptr);1.3.2 点云所在区域密度规律滤波
该方法直接基于点云分布密度进行去噪,直观的感受是可以根据点云中每个点所在区域判断其是否是噪声,一般来说噪声点所在区域都比较稀疏。
pcl::radiusoutlierremoval::ptr radius_outlier_removal( new pcl::radiusoutlierremoval(true)); radius_outlier_removal- >setinputcloud(cloud_ptr); radius_outlier_removal- >setradiussearch(1.0); radius_outlier_removal- >setminneighborsinradius(10); radius_outlier_removal- >filter(*filtered_cloud_ptr);1.3.3 点云所在区域分布规律滤波
除了根据稠密意以外还可以根据距离来筛选滤波,每个点计算其到周围若干点的平均距离,如果这个平均距离相对于整体点云中所有点的平均距离较近,则认为其不是噪点
// pcl built-in radius removal pcl::statisticaloutlierremoval<pcl::pointxyz>::ptr statistical_outlier_removal( new pcl::statisticaloutlierremoval<pcl::pointxyz>(true)); // set to true if we want to extract removed indices statistical_outlier_removal->setinputcloud(cloud_ptr); statistical_outlier_removal->setmeank(20); statistical_outlier_removal->setstddevmulthresh(2.0); statistical_outlier_removal->filter(*filtered_cloud_ptr);1.3.4 根据点云是否可以被稳定观察到筛选
loam 中对点云中的点是否能形成可靠特征的一个判断标准是它能否被稳定观察到。
loam 中着重提了这两种情况的点是不稳定的:
特征成平面和扫描线近乎平行特征扫描到的其中一端被另一个平面挡住,这部分的点也不稳定template void filter_occuluded_points(boost::s
偷偷教你几个运算放大器使用小技巧
人工智能、大数据、区块链等新技术为法律的创新和进化提供了新机遇
智能机器人和自动化物流系统在烟草行业中的应用
多功能食品安全检测仪的具体使用步骤介绍
凌科芯安发布8位多接口防盗版加密芯片LKT4103
激光雷达点云预处理介绍
三星带有弹出式摄像头的折叠屏智能机设计专利曝光
电源纹波测试的正确方法
紫光展锐专利荣获我国知识产权领域最高奖项金奖
华为发布2020年三季度业绩:收入6713亿元
如何通过CAN的HUB来实现3个CAN节点的环形网络通信
Intel CEO确认双核心Atom上网本处理器
我训练了一个模型,让开发板认识自己
艾德克斯IT6412双通道双极性直流电源面向测试的几种应用
我国蜂窝物联网模组产业发展情况如何
赋能学前教育服务领跑平台,智慧幼教背后的人脸识别技术
2020年半导体行业的发展轨迹如何?
5G网络在近边缘和雾天的汽车应用
iPhone8什么时候上市,或许会提前因为量产已经提前到6月
976nm泵浦源的光纤激光器光光转化效率可达85%