news 2026/8/21 18:47:14

揭秘 MULLS 的 4 个鲁棒性技巧:地面分割、运动补偿、动态物体移除与距离反比采样

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘 MULLS 的 4 个鲁棒性技巧:地面分割、运动补偿、动态物体移除与距离反比采样

揭秘 MULLS 的 4 个鲁棒性技巧:地面分割、运动补偿、动态物体移除与距离反比采样

【免费下载链接】MULLS🤔 MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square [ICRA 21]项目地址: https://gitcode.com/gh_mirrors/mu/MULLS

MULLS(Versatile LiDAR SLAM via Multi-metric Linear Least Square,ICRA 2021)是一套高效、低漂移、多场景通用的激光雷达 SLAM 开源方案,既能跑实时里程计,也能完成建图与回环优化。对新手来说,MULLS 最值得学习的不是"它跑得多准",而是它如何通过一组工程化技巧让 LiDAR SLAM 在城市场景、高速路段、复杂路口里保持鲁棒。本文从源码层面拆解 MULLS 提升鲁棒性的 4 个关键技巧:地面分割、运动补偿、动态物体移除与距离反比采样,帮你快速理解这套系统的设计思路。

技巧一:基于网格双阈值的快速地面分割

地面点在每一帧点云中占比极高,如果全部参与配准,不仅计算量大,还会干扰特征匹配。MULLS 采用了一种"双阈值"网格地面分割策略,核心实现在 cfilter.hpp 的fast_ground_filter函数中,大致流程是:

  1. 构建 2D 网格:把点云按水平面投影到网格,统计每个格子的最低点(min_z);
  2. 邻域比较:若某格子的最低点与 8 邻域最低点相差超过阈值 1,则该格子整体视为非地面;
  3. 格内二次筛选:其余格子中,高于格内最低点阈值 2 的点归为非地面,剩余归为地面。

这套思路比直接 RANSAC 拟合平面更快、对坡度更宽容,还能顺带估计地面法向量(支持固定半径、k 近邻、格内 RANSAC 三种方式)。分割后地面点会被随机降采样,非地面点则进入下一步的特征提取,为后续多度量配准提供干净输入。

技巧二:基于匀速运动模型的点云运动补偿

旋转式激光雷达一帧扫描需要几十毫秒,车辆在这段时间内的位移会让点云产生"运动畸变"(scan distortion),高速行驶时尤为明显。MULLS 用匀速运动模型做运动补偿,实现在 cfilter.hpp 的simple_motion_compensationapply_motion_compensation中。

原理很直观:假设帧间运动已知,则每个点根据其扫描时刻的比例系数 s 做线性插值——最早扫到的点畸变最大、补偿最多,最后扫到的点几乎不动。插值用四元数球面线性插值(slerp)完成,旋转和平移分别处理。代码还针对不同雷达做了适配:Velodyne HDL-64 从 x 轴负方向起扫、Hesai Pandar 从 y 轴负方向起扫,通过scan_begin_ang参数区分;若点云自带时间戳,也可以走simple_motion_compensation_with_timestamp按真实时间比例补偿。这一步直接决定了配准初值的质量,是低漂移的关键前提。

技巧三:双重动态物体移除策略

行驶中的车辆、行人会在地图上留下"鬼影",把动态点误当作静态特征参与配准,是 LiDAR SLAM 漂移的主要来源之一。MULLS 提供两层动态物体移除手段:

  • 基于语义掩码的前置剔除:在 Semantic KITTI 数据上,cfilter.hpp 的filter_with_dynamic_object_mask_pre直接利用神经网络预测的语义标签,把 moving-car、moving-person 等动态类别(标签 252–259)在进入特征提取前就过滤掉;
  • 基于局部地图的后验剔除:这才是 MULLS 的亮点。map_manager.cpp 的map_based_dynamic_close_removal把当前帧的非地面点与局部地图做 kd-tree 最近邻搜索:若某点到地图最近邻的距离落在异常区间(过近或过远),就判定它属于动态物体并删除。由于配准前地图已建好,这套方法不依赖额外传感器,纯 LiDAR 也能稳定工作。

此外,scanner_filter 还会剔除车体自身的点与地面以下的"鬼点",进一步净化输入。

技巧四:距离反比采样让远处点不"消失"

激光雷达点云密度随距离急剧衰减——近处密密麻麻、远处稀稀拉拉。如果均匀降采样,远处本就不多的点会被进一步"稀释",导致配准约束不足。MULLS 的距离反比采样(distance inverse sampling)专门解决这个问题,参数入口在 cfilter.hpp 的extract_semantic_pts中:

distance_inverse_sampling_method: 0=关闭,1=线性权重,2=二次权重 standard_distance: 权重为 1 的参考距离(默认 15 米)

实现时以标准距离 / 点到雷达距离作为采样权重:近处点被更狠地降采样,远处点则尽量保留,且二次权重比线性权重更激进。这样配准时远近特征点分布更均衡,长距离场景(如高速公路)的鲁棒性明显提升。想体验的话,在 run_mulls_slam.sh 指定的配置文件中即可调整对应参数,不同场景还有现成配置可参考,比如 lo_gflag_list_kitti_urban.txt 与 lo_gflag_list_kitti_highway.txt。

快速上手体验

这 4 个技巧共同撑起了 MULLS 的鲁棒性,而体验它们并不难。仓库自带 16 帧示例数据(demo_data目录),无需任何配置即可运行:

git clone https://gitcode.com/gh_mirrors/mu/MULLS sh script/run_mulls_slam.sh # 跑完整 SLAM sh script/run_mulls_reg.sh # 跑两帧点云配准

小结

地面分割减少计算干扰、运动补偿消除畸变、动态物体移除防止漂移、距离反比采样均衡特征分布——这 4 个技巧环环相扣,让 MULLS 在保持高效的同时具备低漂移、多场景通用的能力。对于正在学习 LiDAR SLAM 的你,与其对着公式发愁,不如直接读读 cfilter.hpp 与 map_manager.cpp 里这些短小精悍的实现,很快就能把工程上的鲁棒性思维带进自己的项目。

【免费下载链接】MULLS🤔 MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square [ICRA 21]项目地址: https://gitcode.com/gh_mirrors/mu/MULLS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 18:45:48

NATS.Net JetStream入门:5步创建Stream与Consumer实现消息持久化

NATS.Net JetStream入门:5步创建Stream与Consumer实现消息持久化 【免费下载链接】nats.net The official C# Client for NATS 项目地址: https://gitcode.com/gh_mirrors/na/nats.net NATS.Net 是 NATS 官方推出的 C# 客户端库,支持 .NET Standa…

作者头像 李华
网站建设 2026/8/21 18:44:00

Windows 更新反复失败?WUReset 一键重置修复指南

Windows 更新反复失败?WUReset 一键重置修复指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Windows 更新失败…

作者头像 李华
网站建设 2026/8/21 18:42:29

PLC直线插补

插补常见的两种方式是直线插补和圆弧插补,插补运动至少需要两个轴参与。SMART PLC从V2.7版本后有支持轴组的直线插补指令。 1、SMART PLC轴组对象 SMART PLC组态脉冲轴,给每个轴发送一个脉冲,每个轴的脉冲当量有电机特性,丝杠螺距等决定,不同的轴单个脉冲运动距离可能不同…

作者头像 李华