0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

激光雷达点云预处理介绍

麦辣鸡腿堡 来源:古月居 作者:lovely_yoshin 2023-11-27 18:11 次阅读

激光雷达作为自动驾驶最常用的传感器,经常需要使用激光雷达来做建图、定位和感知等任务。

而这时候使用降低点云规模的预处理方法,可以能够去除无关区域的点以及降低点云规模。并能够给后续的PCL点云分割带来有效的收益。

点云预处理

1.1 指定区域获取点云

在实际使用中,我们可以看出,虽然点云的分布范围较广,但大部分的点都集中的中间区域,距离越远点云越稀疏,相对的信息量也越小。

此外还能明显看到一些离群点,因此我们可以筛选掉一些较远的点,只保留我们感兴趣范围内的点。以下为保留 x 在 30m,y 在 15m,z 在 2m 范围内的点的效果:

template < class PointType >void removePointsOutsideRegion(boost::shared_ptr< pcl::PointCloud< PointType > >& src_cloud_ptr,                               boost::shared_ptr< pcl::PointCloud< PointType > >& dst_cloud_ptr,                               const std::pair< double, double >& x_range,                               const std::pair< double, double >& y_range,                               const std::pair< double, double >& z_range) {    int num_points = src_cloud_ptr- >points.size();    boost::shared_ptr< pcl::PointCloud< PointType > > cloud_ptr(new pcl::PointCloud< PointType >());    cloud_ptr- >points.reserve(num_points);    for (const auto& pt : src_cloud_ptr- >points) {        bool inside = (pt.x  >= x_range.first && pt.x < = x_range.second && pt.y  >= y_range.first &&                       pt.y < = y_range.second && pt.z  >= z_range.first && pt.z < = z_range.second);        if (inside) {            cloud_ptr- >points.push_back(pt);        }    }    dst_cloud_ptr = cloud_ptr;} // 或者使用CropBox来实现去除给定区域外的点 pcl::CropBox< pcl::PointXYZ > 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 < class PointType >void filterPointsWithinRegion(boost::shared_ptr< pcl::PointCloud< PointType > >& src_cloud_ptr,                              boost::shared_ptr< pcl::PointCloud< PointType > >& dst_cloud_ptr,                              const std::pair< double, double >& x_range,                              const std::pair< double, double >& y_range,                              const std::pair< double, double >& z_range,                              bool remove) {    int num_points = src_cloud_ptr- >points.size();    boost::shared_ptr< pcl::PointCloud< PointType > > cloud_ptr(new pcl::PointCloud< PointType >());    cloud_ptr- >points.reserve(num_points);    for (const auto& pt : src_cloud_ptr- >points) {        bool inside = (pt.x  >= x_range.first && pt.x < = x_range.second && pt.y  >= y_range.first &&                       pt.y < = y_range.second && pt.z  >= z_range.first && pt.z < = z_range.second);        if (inside ^ remove) {            cloud_ptr- >points.push_back(pt);        }    }    dst_cloud_ptr = cloud_ptr;}// PassThrough: 可以指定点云中的点的某个字段进行范围限制,将其设为 true 时可以进行给定只保留给定范围内的点的功能 pcl::PassThrough< pcl::PointXYZ > 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< pcl::PointXYZ > 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< pcl::PointXYZ >::Ptr radius_outlier_removal(        new pcl::RadiusOutlierRemoval< pcl::PointXYZ >(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&lt;pcl::PointXYZ&gt;::Ptr statistical_outlier_removal(        new pcl::StatisticalOutlierRemoval&lt;pcl::PointXYZ&gt;(true)); // set to true if we want to extract removed indices    statistical_outlier_removal-&gt;setInputCloud(cloud_ptr);    statistical_outlier_removal-&gt;setMeanK(20);    statistical_outlier_removal-&gt;setStddevMulThresh(2.0);    statistical_outlier_removal-&gt;filter(*filtered_cloud_ptr);

1.3.4 根据点云是否可以被稳定观察到筛选

LOAM 中对点云中的点是否能形成可靠特征的一个判断标准是它能否被稳定观察到。

LOAM 中着重提了这两种情况的点是不稳定的:

  • 特征成平面和扫描线近乎平行
  • 特征扫描到的其中一端被另一个平面挡住,这部分的点也不稳定
template < typename PointType >void filter_occuluded_points(boost::s
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48129

    浏览量

    740210
  • 激光雷达
    +关注

    关注

    961

    文章

    3662

    浏览量

    186786
  • 自动驾驶
    +关注

    关注

    773

    文章

    13060

    浏览量

    163241
  • 点云
    +关注

    关注

    0

    文章

    58

    浏览量

    3725
收藏 人收藏

    评论

    相关推荐

    激光雷达是自动驾驶不可或缺的传感器

    看到这种低成本的激光雷达,从研发、样品到商用,可能会比原来预想的周期更快。因为不是一家激光雷达公司在努力,而是整个产业链都在努力。是在同一空间倡导系下表达目标空间分布和目标表面特性
    发表于 09-08 17:24

    激光雷达分类以及应用

    激光雷达实际上是一种工作在光学波段(特殊波段)的雷达,它的优点非常明显:1、具有极高的分辨率:激光雷达工作于光学波段,频率比微波高2~3个数量级以上,因此,与微波雷达相比,
    发表于 09-19 15:51

    常见激光雷达种类

    单线激光雷达特点:结构简单、扫描速度快、分辨率高、可靠性高、成本低。单线激光雷达实际上就是一个高同频激光脉冲扫描仪,加上一个一维旋转扫描。单线激光雷达虽然原理简单但是可以有效、高频的测
    发表于 09-25 11:30

    激光雷达面临的机遇与挑战

    机遇激光雷达在智能机器生态系统中有很多机遇。与使用二维图像相比,能够更容易的被计算机使用,用于构建物理环境的三维形象——二维图像是人脑最容易理解的数据,而对于计算机来说,
    发表于 09-26 14:30

    固态激光雷达

    `我们已经对单线激光雷达司空见惯,其旋转线扫的测量方式导致造成寿命问题和价格居高不下。 因此,北醒研发了CE30,它是一款具有大视场角的固态激光雷达。它可同时输出132°水平视场、9度垂直视场范围内
    发表于 01-04 10:18

    激光雷达

    `我们已经对单线激光雷达司空见惯,其旋转线扫的测量方式导致造成寿命问题和价格居高不下。 因此,北醒研发了CE30,它是一款具有大视场角的固态激光雷达。它可同时输出132°水平视场、9度垂直视场范围内
    发表于 01-11 09:21

    北醒固态设计激光雷达

    ``一年一度的国际消费类电子产品展览会(CES)已经完满收官,短短的几天时间里,我们见识了Intel无人飞机灯光秀、百度无人车、移动行李箱等众多“黑科技”。而北醒不仅展示了性能卓越的固态激光雷达,在
    发表于 01-25 09:36

    北醒固态激光雷达

    ``一年一度的国际消费类电子产品展览会(CES)已经完满收官,短短的几天时间里,我们见识了Intel无人飞机灯光秀、百度无人车、移动行李箱等众多“黑科技”。而北醒不仅展示了性能卓越的固态激光雷达,在
    发表于 01-25 09:38

    固态设计激光雷达

    ``一年一度的国际消费类电子产品展览会(CES)已经完满收官,短短的几天时间里,我们见识了Intel无人飞机灯光秀、百度无人车、移动行李箱等众多“黑科技”。而北醒不仅展示了性能卓越的固态激光雷达,在
    发表于 01-25 09:41

    激光雷达除了可以激光测距外,还可以怎么应用?

    简单的3D雷达,获取三维数据呢?目前市面上主流的有2种方式:1、采用线状激光器,将原先的一个变成一条线型光;2、使用一个2D激光雷达扫描,同时在另一个轴进行旋转,从而扫描出3D信息;
    发表于 05-11 15:33

    【北醒TFmini-S 测距/避障激光雷达传感器免费试用连载】基于FPGA平台的YOLO-Complex数据加速

    )/显示控制等内容。目前正在研究项目是基于FPGA ZCU102平台的算法开发(YOLO-Complex),希望借助北醒TFmini-S 测距/避障激光雷达传感器可以进行特定场景的
    发表于 05-28 17:32

    激光雷达知多少:从技术上讲讲未来前景

    激光雷达产业迅速扩大。 地基激光雷达 地基激光雷达可以获取林区的3D信息,利用
    发表于 07-14 07:56

    激光雷达

    想了解行业国内做固态激光雷达的厂家,激光雷达里面是怎么样的啊
    发表于 01-17 15:29

    FMCW激光雷达与dTOF激光雷达的区别在哪?

    FMCW激光雷达与dTOF激光雷达的区别在哪?
    发表于 07-23 13:22

    激光雷达数据分割算法的嵌入式平台上的部署实现

    点击上方“AI算法修炼营”,选择“星标”公众号精选作品,第一时间送达这篇文章是激光雷达数据分割算法的嵌入式平台上的部署实现。主要的创新有两
    发表于 12-21 08:28