深夜十一点,新手外卖骑手小陈接到一单送往老城区深处的披萨订单。导航地图只显示主干道,而那片街区的路灯坏了一半,巷子七拐八弯,墙面斑驳难辨。小陈的车顶上装着一盏 360° 旋转的灯笼——激光雷达,它不断向四周发射光线,再根据光线返回的时间,在黑暗的屏幕上“点亮”周围的一切:墙角的转角、路沿的棱线、店铺招牌的平面。问题是:灯笼只能告诉他“周围有什么”,却无法告诉他“我在哪里、我该往哪走”。他需要在黑暗中一边感知环境,一边记住来路,顺手画出整片街区的地图——这就是同时定位与建图(SLAM)要解决的问题。 LOAM 和 LeGO-LOAM 是两张经典的“看图找路”答卷。LOAM 的做法是:从每一圈灯笼光斑中挑出最显眼的“墙角尖点”和“平墙面点”作为路标,然后通过把两帧光斑中的路标对齐,推算出车子的移动量,一边前进一边把零散的路标拼成整张街区图。LeGO-LOAM 则更像一个有经验的骑手:先分辨出哪些光斑属于“地面”,哪些属于“墙面”,把占一半的无效信息直接丢掉,再用“先粗对齐、再精对齐”的两步走策略,让计算量大幅下降,哪怕车上那台性能平平的嵌入式电脑也能跑得飞快。这两个算法,就是用一束光在陌生街区里实时回答“我在哪”和“这里长什么样”的经典开源方案。
对 AI 从业者而言,LOAM 与 LeGO-LOAM 是理解激光雷达感知、点云配准与轻量化工程的必修课——掌握它们,等于拿到了机器人定位建图技能树的第一把钥匙。
可视化演示
展示LiDAR-SLAM(LOAM/LeGO-LOAM)三大核心:特征提取与配准(边缘点EDG高曲率+平面点PLN低曲率→点到线P2L/点到面P2F双通道ICP)、LeGO-LOAM地面分割(地面GND角度分割+非地面OBJ聚类C1-C3逐簇特征)、LOAM vs LeGO-LOAM对比(LOAM双频率10Hz+1Hz vs LeGO地面分割+两步优化10倍加速),三模式切换理解激光SLAM全貌。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+C1+'
SLAM基础
深夜的老城区,小陈把披萨车停在巷口。他摇下车窗,车顶的激光雷达开始“哒哒哒”地旋转——每一圈旋转,都像一盏灯笼把周围三百六十度的墙壁、电线杆、路肩依次照亮,形成一个由成千上万个光点组成的“点云”。“我现在到底在哪条巷子?”这个问题,小陈自己回答不了,地图也回答不了。SLAM(Simultaneous Localization and Mapping,同时定位与建图) 要解决的就是这个著名的“先有鸡还是先有蛋”问题:要知道自己在哪,需要一张地图;要画出一张地图,又需要知道自己在哪。
激光雷达给出的点云,就是“灯笼照亮的环境”。每个点包含三维坐标 \((x, y, z)\),还可能带有反射强度。这些点本身没有语义,只是“那里有东西”。但大量点组合起来,墙面的延伸、路沿的走向、电线杆的孤立形状就浮现出来了。要让这些点有意义,我们还需要一个数学框架:坐标系与位姿。位姿用六个量描述——三维位置 \( (x,y,z) \) 加三维旋转 \( (\text{roll}, \text{pitch}, \text{yaw}) \),它回答了“车头朝哪、车身在哪”。
LOAM(LiDAR Odometry and Mapping)和 LeGO-LOAM(Lightweight and Ground-Optimized LOAM)是两种解决思路。LOAM 像一个细心的测绘员,每一帧点云都认真挑特征、做配准,精度高但计算量大;LeGO-LOAM 则像熟悉街区的老骑手,先把地面这层“无用信息”剥掉,再用两步走策略快速对齐,轻巧省电。它们共享同一个内核——特征提取 + 扫描匹配,这正是后面几节要展开的“送餐秘诀”。
小陈收回目光,心里有数了:所谓 SLAM,就是让车自己当“测绘员兼导航员”,边开边画地图,再靠地图确认自己位置。LOAM 与 LeGO-LOAM 的区别,则像是“精装手绘地图”与“轻便速写地图”的差别——目的地相同,但路线风格与油耗完全不同。
- 旋转矩阵\(\mathbf{R}\) 表示车子在三维空间中的朝向变化,比如车头左转 30° 对应的就是一个特定的旋转矩阵。
- 平移向量\(\mathbf{t}\) 表示车子在世界坐标系中的位置偏移,比如“向前走了 2 米、向右挪了 0.3 米”。
- 齐次变换把旋转和平移拼成一个 \(4 \times 4\) 的矩阵,就能用一次矩阵乘法同时完成“旋转+平移”,方便连续变换。
特征点提取
小陈开始观察周围的“路标”:墙角——灯笼光打上去,左边亮、右边暗,光点序列在这里“折断”;墙面——光点均匀铺开,平滑地延伸到远方;电线杆——孤零零一个点柱,周围空荡荡。他要从几千个光点中,快速判断哪些点像“墙角”,哪些点像“墙面”,这正是 特征提取 要做的事。LOAM 的作者想到一个巧妙的度量——曲率。
什么是点云里的曲率?通俗说,就是“这个点附近的点,分布得有多弯折”。把某个点和它左右各 5 个邻居放在一起看:如果这些点大致排成一条直线,说明这里很平缓,是平面点;如果排列剧烈转折,说明这里是尖角,是边缘点。LOAM 用下面的公式定量计算每个点的曲率:
其中 \(\mathbf{X}_{(k,i)}\) 是第 \(k\) 帧扫描中第 \(i\) 个点的坐标,\(\mathcal{S}\) 是它在同一扫描线上左右各 5 个邻居的集合。这个分数的分子是“邻居点与中心点的向量之和的模长”,分母是“中心点到原点的距离与邻居数量的乘积”,起归一化作用。曲率 \(c\) 越大,说明该点局部形状越尖锐。
算出曲率后,LOAM 从一帧点云中挑出曲率最大的一批点作为边缘点(对应墙角、电线杆边缘),挑出曲率最小的一批点作为平面点(对应平整墙面、地面)。为了保证路标在空间中分布均匀、避免“只看左边不看右边”,算法还会把一条扫描线分成若干小段,每段最多选固定数量的特征点——这个技巧叫 特征筛选。
小陈满意地点点头:原来“找路标”不是靠眼睛乱瞅,而是靠量化“弯折程度”。曲率大的是墙角尖点,曲率小的是平墙点位——有了这些清晰的路标,后面的配准才能有的放矢。
- 取邻居点集把当前点前后各 5 个同线激光点取出来,组成邻域集合 \(\mathcal{S}\)。这就像小陈观察一个路口时,只看它前后几步的路况。
- 计算偏差向量之和用中心点坐标逐一减去邻居点坐标,然后求和。若邻居环绕得均匀,向量会相互抵消;若中心点在拐角,偏移量集中在同一方向,和就会很大。
- 归一化除以邻居数量和中心点到雷达的距离,消除点数多少和远近带来的影响,使曲率在不同距离下可比。
扫描匹配
小陈向前骑了 2 米,车顶灯笼又转了一圈。两圈光斑都照到了同一个墙角,但角度不同、距离不同,墙角在两次扫描中的坐标也变了。扫描匹配要回答的问题就是:这两帧点云之间的相对位姿变化是多少?换句话说,怎么把第二帧“叠”到第一帧上,让同一个墙角严丝合缝地重合?
LOAM 的匹配策略非常直接——点到线 与 点到面。对当前帧的每个边缘点,在上一次扫描中找到最近的两个边缘点,连成一条直线(这就是“墙角线”),然后计算当前点到这条线的距离;对当前帧的每个平面点,在上一帧中找到最近的三个平面点,构成一个平面(这就是“墙面”),然后计算当前点到这个平面的距离。距离越小,说明配准越准。这两类距离的数学表达是:
这里 \(d_{\mathcal{E}}\) 是点到线距离,\(d_{\mathcal{H}}\) 是点到面距离。寻找最近邻居的过程叫 最近邻搜索,常用的加速数据结构是 KD-Tree——它把点云按空间分块存储,查询时只搜邻近区块,避免“大海捞针”。有了距离度量,剩下的就是 位姿优化:通过迭代调整位姿 \(\mathbf{T}\),让所有特征点的点到线、点到面距离之和最小。
小陈试着把两帧光斑中相同的墙角线、墙面“叠”在一起,一旦叠上,旋转和平移就都算出来了——这就是逐帧的“里程计”。他每前进一段,就做一次这样的叠图,再把新帧拼到已有地图上,地图随之扩展,“我在哪”也不断被更新。
- 建立对应关系对当前帧每个边缘特征点,在上一帧特征集合中用 KD-Tree 找到最近的两个点 \(j, l\),构成一条空间直线。这是配准的“锚点”。
- 计算叉积求距离利用向量叉积的几何意义——两个向量的叉积模长等于它们围成的平行四边形面积,除以底边长度,就得到点到直线的垂距。
- 点到面距离平面点与三个平面点构成四面体,体积除以底面积即为高,也就是点到平面的距离。
地面分割
小陈骑到一条笔直的大路上,车顶灯笼扫出一大片光点——这些光点几乎全部落在地面上。地面点虽然数量庞大,却对“认路标”帮助不大:它们太平坦、太相似,很难提供区分度。更重要的是,如果让这些地面点参与配准,它们会占据大量计算资源,还可能把位姿“拉偏”。LeGO-LOAM 的核心改进,就是在特征提取之前先做一件干脆利落的事——把地面分割出来,直接丢掉。
怎么判断一个点是地面点?LeGO-LOAM 的思路异常质朴:看相邻两个激光点的“夹角”。把雷达坐标系下的两个相邻点 \(p_1, p_2\) 连成一条线,如果这条线与水平面的夹角接近 0°,说明前方地面是平的;如果夹角很大,说明那里可能是墙面或者物体。具体来说,算法将单根激光线按角度分成若干段,在每段内从左到右比较相邻点,计算两点之间的竖直夹角 \(\theta\):
当 \(\theta\) 小于某个阈值(论文中常用约 \(10^\circ\)),就判定这两个点属于同一块平坦地面,将它们标记为地面点。一轮扫描结束后,所有地面点从点云中被移除,剩下的点云主要包含墙面、树干、车辆、行人等“立体目标”。这一操作在 LeGO-LOAM 的论文中称为 地面提取(ground removal)。
分割完地面后,LeGO-LOAM 采用 两步优化:第一步只用地面点约束,估计出俯仰角、横滚角和高度 \(z\)(因为地面提供了极强的平面约束);第二步用剩余的非地面特征点,估计出完整六自由度位姿。这样一来,粗位姿为精配准提供了良好初值,迭代更快更稳。又因为地面点占比很大(在室外环境通常超过 50%),移除它们后特征数量骤减,整体计算量显著下降——这就是 LeGO-LOAM 名字中 “Lightweight(轻量)” 的由来。
小陈恍然:原来“会送餐的老骑手”和“生涩新手”的差距在这里——老骑手会先扫一眼脚下,分清哪些是“路”、哪些是“墙”,把大半无效信息直接忽略,剩下的路标少而精,反而更容易对上。这正是 LeGO-LOAM 的精髓:先分地面,再做配准。
- 相邻点高度差计算两个相邻激光点之间的高度差值 \(p_{2z} - p_{1z}\)。地面平坦时,这个差值变化平缓。
- 水平距离计算两点在水平面内的投影距离,作为夹角计算的分母。距离越远,同样的高度差对应的夹角越小。
- 求夹角并判断用反正切函数求出倾角 \(\theta\),当它小于阈值时,两点共面于地面。
系统框架与工程实践
当小陈把车开进商业街,路口的墙角、屋檐、路牌、栏杆纷至沓来。单靠一帧点云已经满足不了定位需求,他需要一个完整的“系统流程”来支撑持续作业。LOAM 的系统架构是经典的双模块并行:一个 里程计模块 以较高频率(约 10 Hz)做逐帧配准,负责“我动到了哪里”;一个 建图模块 以较低频率(约 1 Hz)将去畸变后的点云与局部地图配准,负责“地图长什么样”。两个模块像流水线工人与总设计师的分工:工人每秒钟汇报十次位置,设计师每秒精修一次地图。
在真实环境中,雷达在扫描过程中车辆还在运动,导致一帧点云内部存在“运动畸变”——就像小陈打着方向盘转弯时拍照片,照片里的墙面会歪斜。IMU 去畸变 正是解决这一问题的关键:IMU(惯性测量单元)以高频(100~500 Hz)测量角速度和加速度,通过积分可以推断出扫描周期内每个激光点对应的位姿,从而把所有点都“校正”到扫描起始时刻的坐标系下。此外,IMU 还能为位姿优化提供良好的初始值——小陈心里先有一个“大概朝哪转”,配准时就更容易收敛到正确解。
工程部署中还有两个不可忽视的环节:关键帧策略 与 参数标定。如果把每一帧点云都保留下来,地图会迅速膨胀到内存爆炸;于是只在位姿变化超过阈值时选取“关键帧”,如同拍 Vlog 只保留关键镜头。参数标定则包括雷达与 IMU 的外参(两者的相对位姿)、雷达内参(束数、角分辨率)、以及各种阈值——这些参数设置不当,再好的算法也会“水土不服”。LeGO-LOAM 在此基础上更进一步,利用了地面分割后的特征数下限机制:当一帧中的特征点过少时(例如在空旷广场中央),直接跳过优化步骤,沿用上一帧的位姿变换——“没路标时,宁可不猜,也别乱猜”。
小陈看着系统监视器上的数字:里程计模块每秒刷新 10 次位姿,建图模块每秒精修 1 次地图,IMU 在后台默默校正着每一帧的畸变。他终于明白,一套能跑在真车上的 SLAM 系统,不是单靠一个“聪明算法”,而是多个模块像送餐团队一样各司其职、紧密配合。
大场景定位建图实战
小陈的披萨车终于驶出老城区,奔向新开发区——那里道路宽阔、楼宇整齐,但依然没有现成地图。他要在真实环境中完成一次完整的“扫街建图”。这套 实战流水线 可以分为几步:数据采集 → 预处理 → 里程计 → 建图 → 回环检测 → 全局优化。
第一步,数据采集与设备选型。室外大场景通常选用 16 线或 32 线激光雷达,配合 IMU 和轮式里程计,构成多传感器融合的“感知套件”。数据采集时要注意车速稳定、避免急转弯,给算法留出足够的特征观测时间。第二步,预处理与外参标定。把激光雷达与 IMU 的外参、时间戳对齐都校准好,否则去畸变和融合会引入系统性误差。第三步,运行里程计与建图模块:LeGO-LOAM 先做地面分割,再用两步优化估算位姿,同时将非地面点云累积进局部地图。第四步,关键帧与回环检测。车辆绕回起点时,算法通过识别相似的场景特征,发现“我曾经来过这里”,进而构建一个回环约束。
回环检测的价值,在于修正长时间行驶累积的漂移。单靠逐帧配准,误差会像“喝醉的人走路”一样越偏越远;一旦识别出回环,算法就能把当前位姿与历史位姿之间的累积误差“拉回来”,这个环节称为 位姿图优化。最后,把所有关键帧和回环约束放入图优化框架,得到全局一致的地图——这就是最终交付的“高清街区图”。LeGO-LOAM 在优化中还整合了地面约束,让全局地图的平整度更高。
小陈跑完一整圈回到起点,系统提示“回环检测成功,全局优化完成”。屏幕上,一条完整闭合的街区轨迹浮现出来,道路、墙面、路沿错落有致。他长舒一口气:从黑暗巷道的一盏灯笼,到一张可以反复使用的街区地图,他刚刚见证了 LiDAR-SLAM 的真实力量。
AI 应用场景
自动驾驶车辆的实时定位
阶段:感知与定位
解决的问题:在 GPS 信号较弱的高架桥下、地下停车场或城市峡谷中,传统卫星定位误差可达数米甚至直接失效。LOAM/LeGO-LOAM 通过激光雷达点云配准,在几百毫秒内输出厘米级位姿变化,让自动驾驶车在“不知道 GPS 在哪”的情况下依然清楚自己在车道中的位置。
具体案例:一辆 L4 级自动驾驶出租车驶入隧道,GPS 信号中断。车载 LeGO-LOAM 系统立即接管定位任务,通过地面分割剔除隧道地面的大部分点云,用两侧墙壁上的平面点和路面边缘线做配准,以 10 Hz 频率持续输出位姿。车辆平稳通过 800 米隧道后,GPS 重新搜到信号时,航向偏差不超过 0.3 米。
园区物流机器人的轻量建图
阶段:环境建模与路径规划
解决的问题:室内外混合的物流园区中,小型机器人往往只有嵌入式低功耗平台,无法运行重量级 SLAM。LeGO-LOAM 的轻量化设计(地面分割 + 特征数下限 + 两步优化)让它在这类平台上成为首选建图方案。
具体案例:某电商仓库部署了 20 台园区配送机器人,每台配备 16 线激光雷达和低算力工控机。工程师基于 LeGO-LOAM 搭建建图系统:机器人在园区内巡航一圈,通过地面分割快速排除大面积地面点,仅用墙面、门口立柱和货架边缘完成特征匹配,生成一张 200m × 150m 的全局地图,CPU 占用率低于 40%。后续机器人即可基于这张地图实现自主导航。
矿山与大型园区的测绘建模
阶段:数据采集与三维重建
解决的问题:矿山、堆料场等区域地形起伏大、地表特征单一,传统人工测绘效率低且存在安全风险。LiDAR-SLAM 的建图能力能在车辆行驶中同步完成高精度三维地图构建,而地面分割机制天然适合处理大范围平坦地形。
具体案例:一座露天矿山使用搭载 32 线激光雷达的巡检车进行周界扫描。LeGO-LOAM 的地面拟合模块将矿坑底部与坡道分离,非地面点云(边坡、设备、围栏)被清晰重建。一周内完成整个矿区约 0.5 平方公里的三维地图,测量精度达到 ±5 cm,效率比传统全站仪测量提高 8 倍以上。
Python 演示
import numpy as npfrom collections import deque class LiDARFeatureExtractor: """简化版 LOAM 风格特征提取与配准演示""" def __init__(self, n_neighbors=5, curv_thresh=0.5): self.n_neighbors = n_neighbors self.curv_thresh = curv_thresh self.points = None self.curvature = None self.edge_index = None self.plane_index = None def build_synthetic_scan(self, n=300, noise=0.01): """生成模拟点云:一段直线墙 + 一个拐角""" t = np.linspace(-1.5, 1.5, int(n * 0.7)) wall = np.stack([t, np.zeros_like(t), np.ones_like(t) * 0.3], axis=1) corner = np.stack([np.full(int(n * 0.3), 1.5), np.linspace(0, 1.0, int(n * 0.3)), np.zeros(int(n * 0.3))], axis=1) pts = np.vstack([wall, corner]) pts += np.random.normal(0, noise, pts.shape) self.points = pts return pts def compute_curvature(self): """计算每个点的局部曲率:邻居点到中心点偏差向量的模长""" n = len(self.points) curv = np.zeros(n) for i in range(n): dists = np.linalg.norm(self.points - self.points[i], axis=1) nearest = np.argsort(dists)[1 : self.n_neighbors + 2] diff = self.points[i] - self.points[nearest] curv[i] = np.linalg.norm(diff.sum(axis=0)) / (len(nearest) + 1e-6) self.curvature = curv return curv def extract_features(self): """曲率最大的点->边缘点(墙角),曲率最小的点->平面点(墙面)""" self.compute_curvature() curv = self.curvature self.edge_index = np.argsort(curv)[-20:] self.plane_index = np.argsort(curv)[:20] return self.edge_index, self.plane_index def align_simple(self, src, dst): """最简 ICP:用质心对齐估计平移(仅演示流程)""" src_c = src.mean(axis=0) dst_c = dst.mean(axis=0) return dst_c - src_c if __name__ == "__main__": fe = LiDARFeatureExtractor() pts = fe.build_synthetic_scan() edge_idx, plane_idx = fe.extract_features() print("点云总数:", len(pts)) print("曲率最大(边缘点)索引: ", edge_idx[:5]) print("曲率最小(平面点)索引: ", plane_idx[:5]) print("边缘点平均曲率: {:.4f}".format(fe.curvature[edge_idx].mean())) print("平面点平均曲率: {:.4f}".format(fe.curvature[plane_idx].mean())) hack = pts + np.array([0.25, -0.1, 0.02]) print("对齐估计平移: ", np.round(fe.align_simple(pts[edge_idx], hack[edge_idx]), 4))
curv[i] = np.linalg.norm(diff.sum(axis=0)) / (len(nearest) + 1e-6)这一步对应论文中的曲率公式:邻居偏差向量和的模长越大,说明局部越尖锐。nearest = np.argsort(dists)[1 : self.n_neighbors + 2]用距离排序找到每个点的最近邻居,模拟 KD-Tree 最近邻搜索的效果。self.edge_index = np.argsort(curv)[-20:]取曲率最大的 20 个点作为边缘特征点。self.plane_index = np.argsort(curv)[:20]取曲率最小的 20 个点作为平面特征点。def build_synthetic_scan(self, n=300, noise=0.01)构建一面直线墙加一个拐角的模拟点云,对应巷道的“墙面”与“墙角”。
常见误区
误区我刚开始学 LOAM 时,以为曲率大的点就是点云比较密集的位置,觉得只要数一数周围点的数量,密集的地方就该选为边缘点。
正解曲率度量的是“几何形状的弯折程度”,而不是点的密度。想象站在墙角:左边是墙面的点、右边是另一面墙的点,两侧点云的排列方向被“折断”,偏差向量方向一致,求和后模长很大;而站在一面平整的大墙前,邻居点围绕中心均匀环绕,偏差向量互相抵消,模长很小。这正是公式中“向量之和”的几何含义。只看密度会漏掉真正的拐角,还会把噪声点当成特征。
为何常见:直观上“拐角处点云更密”容易误导新手,而且论文公式中的归一化分母包含邻居数量,容易被误读成“密度指标”。
误区LeGO-LOAM 是 LOAM 的“轻量版”,轻量嘛,肯定牺牲了精度,所以在大场景高精度建图时应该优先选 LOAM。
正解LeGO-LOAM 的核心是用地面分割减少计算量、用两步优化提升收敛稳定性,它并不必然以牺牲精度为代价。在包含大量地面点的室外场景中,地面约束反而能抑制俯仰和高度方向的漂移,让精度与 LOAM 相当甚至更稳。它的主要限制是在缺少地面的场景(如室内天花板为主的环境)中优势减弱,而不是“精度低”。
为何常见:“轻量”二字容易让人联想到“缩水”;另外很多人没注意到两步优化中地面约束对位姿的正面作用。
误区我总以为回环检测就是相邻两帧点云做一次配准,把误差消掉,所以建图完成后自然就没有累积漂移了。
正解扫描匹配解决的是“相邻帧之间的相对位姿”,它只保证局部一致,误差会像醉汉走路一样逐帧累积。回环检测解决的是“我曾来过这里”的全局识别——当车辆回到曾经到过的区域时,把当前帧与历史关键帧做匹配,形成一个“回环约束”,再通过位姿图优化把长期累积的漂移“拉回正轨”。两者是“局部”和“全局”的分工。
为何常见:从名字看两者都涉及点云匹配,且都改定位误差,初学者容易把“局部配准”和“全局优化”混为一谈。
误区LOAM 不是纯 LiDAR SLAM 吗?那应该只用激光雷达点云就能完成定位建图,IMU 只是锦上添花的东西。
正解虽然 LOAM 的核心前端是点云配准,但 IMU 承担着两个关键职责:一是运动畸变校正——在单帧扫描期间车辆依然在运动,需要用 IMU 高频积分推断每个激光点的位姿,将点云“掰直”;二是为配准提供初始位姿,避免优化陷入局部极小值。在剧烈运动或快速转弯场景中,没有 IMU 的 LOAM 特征匹配容易发散。
为何常见:许多教程聚焦点云配准公式,把 IMU 模块一笔带过,读者便误以为它无足轻重。
误区LeGO-LOAM 的地面分割就是把地面点从点云里删除,删掉之后地面信息就再也不用了,纯属减少计算量的投机取巧。
正解地面点被移除后依然发挥着重要作用——第一步优化中,地面点在提取时已经被标记,专门用于约束俯仰角、横滚角和高度 z,相当于给位姿一个“地面锚”;在全局建图和回环环节中,地面约束也会参与位姿图优化,提升地图平整度。所以地面信息不是被扔掉,而是被“专职化”了。
为何常见:看代码时看到 ground_removal 函数名就以为一删了之,忽略了下游步骤仍然引用地面点标签的细节。
面试题
Q1. LOAM 中提取边缘点依据的核心指标是?
- A.点云反射强度
- B.局部曲率大小← 正确答案
- C.点到雷达的距离
- D.点的邻域密度
答案:B。LOAM 用曲率刻画“局部弯折程度”,曲率大的点选为边缘点,曲率小的选为平面点。反射强度、距离和密度都不是特征区分的依据。
Q2. LeGO-LOAM 最核心的预处理步骤是?
- A.回环检测
- B.地面分割← 正确答案
- C.全局优化
- D.图像特征提取
答案:B。LeGO-LOAM 的 "G" 即 Ground-Optimized,其精髓是先分割地面、剔除大量地面点,再用两步优化做位姿估计,从而大幅减少计算量。
Q3. 点到线距离计算中,寻找最近两个边缘点常用的加速结构是?
- A.哈希表
- B.二叉搜索树
- C.KD-Tree← 正确答案
- D.红黑树
答案:C。KD-Tree 是点云最近邻搜索的经典加速结构,它把三维空间递归划分成子空间,查询时只访问邻近区域,避免遍历全部点。哈希表不擅长范围近邻查询。
Q4. LOAM 系统中里程计模块与建图模块的关系是?
- A.里程计频率低、建图频率高
- B.两者频率一致
- C.里程计高频逐帧配准、建图低频精修地图← 正确答案
- D.建图模块输出给里程计做初值
答案:C。LOAM 中里程计模块约 10 Hz 逐帧配准估计位姿,建图模块约 1 Hz 与局部地图匹配精修,两个模块并行,前者保障实时性、后者保障地图质量。
Q5. 关于地面分割,下列说法正确的是?
- A.通过相邻激光点倾角判断是否属于地面← 正确答案
- B.地面点被移除后不再参与任何优化
- C.地面点在第一步优化中约束俯仰角、横滚角和高度← 正确答案
- D.地面分割只适用于 32 线以上雷达
答案:AC。LeGO-LOAM 基于相邻点倾角判定地面,地面点会被剥离但仍参与第一步优化估计俯仰、横滚和高度,因此 B 错误。地面分割方法与线束数量无关,16 线雷达同样使用,D 错误。
Q6. IMU 在 LOAM 中的核心作用不包括?
- A.提供初始位姿
- B.消除单帧运动畸变
- C.直接输出全局地图← 正确答案
- D.辅助高速运动下的配准
答案:C。IMU 提供高频角速度和加速度,用于去畸变和初始位姿估计,但不直接参与建图。地图由激光点云累积生成,IMU 不输出地图。
Q7. LeGO-LOAM 采用两步优化策略,第一步主要使用哪类点?
- A.全部非地面点
- B.地面点← 正确答案
- C.边缘特征点
- D.随机采样点
答案:B。第一步用地面点估计俯仰、横滚和高度,因为地面提供了极强的平面约束,能快速锁定三个自由度;第二步用非地面特征点估计完整六自由度位姿。
Q8. 关于回环检测与全局优化,下列说法正确的是?
- A.回环检测可修正逐帧配准累积的漂移← 正确答案
- B.回环约束直接替代逐帧扫描匹配
- C.位姿图优化利用回环约束调整历史轨迹← 正确答案
- D.回环检测与相邻帧配准解决同一层问题
答案:AC。回环检测识别“曾来此地”,产生全局约束,位姿图优化用该约束把漂移拉回,因此 A、C 正确。回环约束是补充而非替代逐帧匹配,D 混淆了局部与全局两个层次。
Q9. 点云曲率公式中,分母的作用是?
- A.放大噪声
- B.归一化,消除点数与距离影响← 正确答案
- C.加快计算速度
- D.提高点云密度
答案:B。分母包含邻域点数与中心点到雷达的距离,让不同距离、不同采样密度下的曲率可比较。它不起放大噪声、加速或增密作用。
Q10. 室外空旷广场场景中,LeGO-LOAM 的主要应对策略是?
- A.增大特征提取阈值
- B.特征数不足时跳过优化沿用上一位姿← 正确答案
- C.强制退化为 2D SLAM
- D.关闭 IMU 输入
答案:B。LeGO-LOAM 设定了每帧特征数下限,当广场中央特征点不足时,直接跳过优化,沿用上一帧位姿,避免乱猜。这是工程鲁棒性的典型处理,而非增大阈值或降维。