1.问题提出
对于给定的原始点云,有时会在实际地面下方观察到一些噪声点,如下图1所示。不幸的是,R-GPF基于假设:在bin内最低部分的点是地面[16]来选择初始种子;因此,这些噪声可以被视为触发相应bin中欠分割问题的初始种子。

为了解决这个问题,通常通过拒绝z值小于用户定义的阈值的点来过滤掉这些点。这种过滤假设周围地面足够平坦。但是这种去噪方法也引发了一个严重问题,在陡坡环境中去除了一些真正的地面点,如图2(b)和(c)所示。因此,有必要区分实际地面点和噪声点。

2.解决办法
从图1中可以看出,通过反射在反射表面上,即车辆的引擎盖和车顶,或玻璃上,可以获得虚拟噪声点。而且,入射角度越小,产生的虚拟噪声点的z值越小。所以假定产生的噪声点来源于激光雷达靠下线束的激光。而且噪声点的强度值因为反射会低于正常点。
基于以上两点,RNR只检查一定数量的底部环,,以去除这些噪声点。相应地,RNR拒绝位于这些环中且高度低于去噪高度阈值
和强度低于去噪强度阈值
的点。因此,RNR有效地去除了噪声点,而实际地面点的损失可以忽略不计。特别地是,
由A-GLE自更新。
3.代码
这里的sensor_height_传感器(也就是雷达)高度不用十分精准,差不多就行了。
node_handle_.param("RNR_ver_angle_thr", RNR_ver_angle_thr_, -15.0);
node_handle_.param("RNR_intensity_thr", RNR_intensity_thr_, 0.2);
template<typename PointT> inline
void PatchWorkpp<PointT>::reflected_noise_removal(pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_nonground)
{
for (int i=0; i<cloud_in.size(); i++)
{
double r = sqrt( cloud_in[i].x*cloud_in[i].x + cloud_in[i].y*cloud_in[i].y );
double z = cloud_in[i].z;
double ver_angle_in_deg = atan2(z, r)*180/M_PI;
if ( ver_angle_in_deg < RNR_ver_angle_thr_ && z < -sensor_height_-0.8 && cloud_in[i].intensity < RNR_intensity_thr_)
{
cloud_nonground.push_back(cloud_in[i]);
noise_pc_.push_back(cloud_in[i]);
noise_idxs_.push(i);
}
}
if (verbose_) cout << "[ RNR ] Num of noises : " << noise_pc_.points.size() << endl;
}
本文难免有错误之处,欢迎大家评论区指正。
本文只做记录本人学习用途,如有侵权,请联系删除。
参考资料: