前言
工作中需要用到去地面算法,调研发现pathwork++去地面效果比较好,但是在实际使用中依然无法解决遇到的问题,这里进行源码不同模块的理解,提升自己算法思维和算法开发能力。
1 Reflected Noise Removal (RNR )反射噪声去除
在激光雷达进行感知时,存在地面的异常噪点,RNR的原理论文中的表述如图1,认为在地面以下存在虚假的噪点,原理不进行赘述,直接分析实现函数。
2 RNR实现函数
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_ && // RNR_ver_angle_thr_ RNR垂直角度阈值,-20.0
z < -sensor_height_ - 0.8 && // sensor_height_传感器相对地面安装高度,
cloud_in[i].intensity < RNR_intensity_thr_) // RNR_intensity_thr_ RNR强度过滤阈值, 0.2
{
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;
}
3 理解与测试
个人理解
- 传感器在车辆顶部安装,如果为2米,则-2.8米以下的点云才有可能被视为噪点,实际场景对应于好几层的高楼,在地面上的倒影
- 强度过滤需要根据不同传感器的特性考虑,测试用的livox和ouster等的强度规律不同,
- 角度阈值主要考虑远处的障碍物,比如要实现60米的感知,则地面以下60×tan(20°)= 21.8米的点才会过滤
实际使用感受
测试场景为井下的巷道,采用多种激光点云数据融合,存在较多的上下坡,且地面不平整
- 这种方法近似假设了地面是相对平整的,对于非常低的噪点才有用,如果相对高度低于-2.8米,则完全无效。
- 采用较小的映射阈值时,在下坡时,会把一定的地面点过滤掉,并不是过滤掉噪点
- 这里的噪点并没有考虑对应的地面以上的映射,在一定范围内是否有实际的真实点
4 源码链接
码云链接
码云gitee](https://gitee.com/zhong----zheng/patchwork-plusplus)
git clone 下载
git clone git@gitee.com:zhong----zheng/patchwork-plusplus.git