简介:一份基于语义地图的激光雷达定位方法学术文档,面向机器人同步定位与建图、自动驾驶及智能导航领域的研究人员与工程师。该文档针对传统SLAM基于马尔科夫性质逐帧推算导致误差累积、且只能输出相对位置的局限,提出先对单帧点云进行滤波,再通过形态学算法分离地面背景,利用语义分割算法提取树木、电线杆等静态目标的类别与平面位置,与已知全局语义地图配准,从而得到可靠绝对坐标的完整技术方案。文中还详述了统计滤波剔除离群点、体素栅格下采样、直通滤波去除远距离稀疏点云等预处理细节,以及语义参考点生成与全局配准流程,并给出实验结果证明其可行性与鲁棒性。资源为单个docx文档,压缩包约579KB,目前已有141人学习。读者可从中系统掌握语义地图建模、点云语义特征提取和全局定位方法的完整实现思路,也可为相关课题研究或工程方案设计提供直接参考。
1. 为什么“基于语义地图的激光雷达定位”值得你重做一遍定位方案
在室外导航的落地场景里,大多数团队一开始都押在几何配准上:NDT 扫一遍、ICP 叠几轮,再拿里程计做预测。可一旦遇到地下车库、长隧道、雪天覆盖或者高速匝道这类环境,几何重复度高、反射强度又不稳定,单纯的几何地图定位就会漂到让你怀疑标定出错。基于语义地图的激光雷达定位方法,就是先让地图和当前帧都“看懂”场景——哪些点是车道线、哪些是杆状物、哪些是路沿,再用这些语义不变物去对齐位姿。它解决的不是“我该用哪个匹配算法”,而是“我该拿什么去匹配”。这篇文章适合正在做定位系统、又对现有纯几何方案精度不满意的人。我会按建图、定位、调参、踩坑的顺序,把一条能复现的路径完整讲清楚。
2. 语义地图构建:让点云从“一堆坐标”变成“一张有含义的图纸”
2.1 为什么不用纯几何地图:语义地图的选型理由
先说透一个很多人没想清楚的问题:纯几何地图里的点,靠的是空间坐标和反射强度的统计特性。NDT 把空间切成体素,每个体素里拟合高斯分布,本质上是假设“局部点的形状是稳定的”。但几何形状稳定不代表能区分位置。隧道内壁是均匀的圆弧,广场地面是平整的平面,这些区域在 X、Y 方向上的约束都非常弱,NDT 分数即使很高,位姿也可能在侧向滑移。语义地图的思路完全不同:它在建图时就把每个点标记为“路灯”“车道线”“护栏”“建筑立面”,定位时只用那些空间位置有明确几何含义、且不易随环境变化的类别去匹配。车道线虽然只占点云很小一部分,但它同时提供了横向和纵向的强约束;杆状物是竖直细长结构,单独一个就能约束水平面的两个自由度。
对比选择上,我一般会列一张表给团队看:
| 地图类型 | 构建成本 | 定位鲁棒性 | 环境变化适应性 | 退化场景表现 |
|---|---|---|---|---|
| 几何 NDT 地图 | 低,麻烦少 | 中等,依赖几何纹理丰富度 | 差,树叶茂密变化可能改变局部形状 | 隧道、空旷广场漂移严重 |
| 反射强度地图 | 低,但需要标定强度响应 | 中等,受路面磨损、雨后反光影响大 | 一般,同类材质强度会变化 | 强反光区域易误匹配 |
| 语义地图 | 高,需要分割模型和人工规则 | 高,稳定语义目标不随光照变化 | 好,选择永久性物体即可抵抗季节变化 | 即使无几何纹理,也有车道线或杆柱约束 |
在 2D 场景里,地面上的箭头、斑马线就是天然的坐标锚点;在 3D 场景里,交通标志牌的边缘、电线的下垂弧线也都是可靠的语义特征。所以如果你发现几何定位在某些固定路段频繁跳变,第一步不是调一调 NDT 分辨率,而是该考虑把语义信息正式加进地图和匹配里。设定语义地图还有一个容易忽视的好处:它天然支持“地图分层”。定位用稀疏的语义关键点,导航用稠密的几何地图,两者放在同一坐标系下,互不干扰。
2.2 从原始点云到语义标签:分割与后处理
构建语义地图的第一步,是把单帧点云变成逐点的语义标签。常见做法分两支:一支走传统几何规则,比如用地面平面拟合分离路面,再通过聚类把细长物体提取为杆状物;另一支走深度学习,用 RangeNet++ 或 PointNet++ 这类网络直接对点云做逐点分类。实际工程中我建议两条腿走路:深度学习负责“认出物体”,几何规则负责“校正边界”。
以道路场景为例,深度网络通常能输出“道路、车辆、行人、杆状物、建筑、植被”等类别。但网络在边界上很容易把路沿石的一部分分到人行道,把路灯底部误标成路面。如果不做后处理,这些标签噪声会在建图时污染地图。我常用的后处理有三步:第一,对每个点的语义概率做时空累积,连续 5 帧中至少 3 帧认为是同一类才保留这个标签;第二,用聚类算法按类别分组,滤除点数少于 50 的小簇,因为这些很可能是误检;第三,对需要“几何稳定”的类别做形状校验,比如杆状物应该近似圆柱体,路面上的斑马线应该平坦,用模型拟合筛掉形状怪异的异常簇。
后处理这一步决定了地图质量的上限,也是最容易被跳过的地方。很多开源工程直接拿网络输出当标签建图,结果定位时发现同一个路灯在这帧是杆状物、下一帧变成了路面。为了避免这类翻车,我一般会在建图之前单独保存每帧的分割置信度,低于阈值的点不入地图。阈值取多少后面会在参数章节详细说。
2.3 构建语义地图的完整流程:从关键帧位姿到全局语义点云
有了可靠的语义标签,还需要知道每帧点云在世界坐标系下的位姿,才能把语义点投影到全局地图。常规流程是先跑一遍建图 SLAM(比如用 LIO-SAM 做松耦合 LiDAR-IMU 建图),得到每一帧的位姿,再对关键帧做语义分割,最后把分割后的关键帧点云变换到全局坐标系并做体素滤波融合。
下面给出一个借鉴常见做法、可以直接落地的 Python 风格伪代码流程。实际工程中你可能把它拆成 ROS 节点,这里突出逻辑:
import numpy as np import open3d as o3d # 假设已经通过 LIO-SAM 得到 keyframe_poses,shape=(N,4,4) # 假设已经对每个关键帧做过语义分割,结果存在 pointclouds_with_labels 中 def build_semantic_map(keyframe_poses, keyframe_pcds, voxel_size=0.2): # 1. 只保留用于定位的稳定类别 stable_classes = {1, 2, 5} # 1=车道线, 2=杆状物, 5=路沿石 all_semantic_points = [] all_semantic_labels = [] for pose, pcd in zip(keyframe_poses, keyframe_pcds): # 2. 按类别过滤 mask = np.isin(pcd.labels, list(stable_classes)) filtered_pts = pcd.points[mask] filtered_lbs = pcd.labels[mask].astype(np.int32) # 3. 把当前关键帧的点变换到全局坐标系 global_pts = (pose[:3,:3] @ filtered_pts.T + pose[:3,3:4]).T all_semantic_points.extend(global_pts) all_semantic_labels.extend(filtered_lbs) # 4. 合并点云并做体素滤波 map_pcd = o3d.geometry.PointCloud() map_pcd.points = o3d.utility.Vector3dVector(np.vstack(all_semantic_points)) map_pcd, _, _ = map_pcd.voxel_down_sample_and_trace( voxel_size=voxel_size, min_bound=[-1000,-1000,-1000], max_bound=[1000,1000,1000] ) return map_pcd这段代码的核心逻辑有三处:第一,只选稳定类别,从根本上避免建筑物立面、植被这些容易变化的点污染地图;第二,位姿变换时要注意pose[:3,:3] @ pts.T + pose[:3,3:4]这种写法,它把每个点从关键帧局部坐标变换到全局坐标,形状对齐要确保矩阵维度正确;第三,体素滤波对语义点云同样重要,同一车道线被几十帧重复投影后会产生密集的“点墙”,体素滤波降采样后不仅有量级降低,还能消除帧间的投影噪声。
参数方面,voxel_size直接影响地图的“颗粒度”。我通常取 0.2m,因为车道线宽度约 0.15~0.2m,取 0.2 既不会把线磨平,又能抑制冗余点。如果场景更大(比如高速公路),可以放宽到 0.3m。构建完成的地图建议额外保存一份语义标签直方图,方便后面定位时检查有没有大量错标类别混入。
3. 基于语义地图的定位实现:把“识别”转化成“位姿”
3.1 定位问题的数学表达:概率视角下的语义匹配
在线定位时,我们有一张离线构建的语义地图M,以及当前扫描的点云C。问题变成求解一个刚体变换T,使得在T变换后的C里的语义点,能最大程度地与M中相同语义类别的点对应对齐。写成概率形式:
T* = argmax_T P(M | T(C))
假设每个语义点的观测互相独立,则可以将整个扫描的匹配概率分解为每个点匹配概率的乘积。实际工程里,我们更常把它写成加权最小二乘问题:对每一对匹配点(p_i, q_i),其中p_i来自当前扫描,q_i来自地图,两者必须属于同一语义类别,最优位姿使下式最小:
E(T) = sum_i w_i * || q_i - T(p_i) ||^2
这里的w_i就是语义权重。车道线、杆状物的权重高,植被、建筑立面权重低,甚至可以直接排除。这个表达的好处是,它既兼容 ICP 风格的点到点距离,也兼容 NDT 风格的点到分布距离。区别只在于将||.||替换为马氏距离。
3.2 实时语义特征提取与预处理
实时运行时,每一帧激光雷达数据进来,首先要做与建图相同的前处理,否则地图侧是语义点,当前帧是原始点,标签对应不上。但实时处理有个不同点:没有未来帧,不能做时序累积,只能用单帧分割结果。所以我更倾向于在实时阶段用置信度过滤而不是硬标签。具体做法是让分割网络输出每个点的 logits,经过 softmax 后取最高概率p_max,只有p_max > 0.6且类别在稳定类别集合内的点,才进入匹配候选。
下面是预处理函数的简化实现:
def extract_stable_semantic_features(points, probs, labels, stable_classes, prob_thresh=0.6): """ 从单帧点云中提取稳定语义特征点 points: Nx3 probs: NxC 或者 Nx1(最高概率) labels: N """ max_probs = probs.max(axis=1) if probs.ndim == 2 else probs mask = np.isin(labels, list(stable_classes)) & (max_probs > prob_thresh) return points[mask], labels[mask]这里有两个细节值得注意。一是prob_thresh设得过高可能导致有效特征过少,设得低又会混入噪声,建议在测试集上以“匹配成功帧数占比”为指标调。二是如果场景光照或天气变化大,网络输出的概率整体偏低,可以用基于强度的归一化作为辅助,比如把点云强度按分位数拉伸之后再喂给网络,但这属于模型适配问题,不在定位主链路里展开。
3.3 匹配与位姿优化:从语义 ICP 到 NDT 的演化路径
得到当前帧的语义点后,最直接的做法是语义 ICP:每个当前语义点找到地图中最近且同标签的点,然后用加权 SVD 求解旋转和平移。我把它做成一个可复现的迭代函数:
def weighted_svd_transform(src, dst, weights): """加权 SVD 求解刚体变换""" mu_s = np.average(src, axis=0, weights=weights) mu_d = np.average(dst, axis=0, weights=weights) src_centered = src - mu_s dst_centered = dst - mu_d H = src_centered.T @ (weights[:, None] * dst_centered) U, _, Vt = np.linalg.svd(H) R = Vt.T @ U.T if np.linalg.det(R) < 0: # 反射修正 Vt[-1, :] *= -1 R = Vt.T @ U.T t = mu_d - R @ mu_s return R, t def semantic_icp(current_pc, current_labels, map_pc_trees, init_T, max_iter=30): """ current_pc: 当前语义点坐标 current_labels: 当前语义标签 map_pc_trees: 字典,类别 -> KDTree(地图点按类别分开建树) """ T = init_T.copy() for i in range(max_iter): # 1. 变换当前点到地图坐标系 transformed = (T[:3,:3] @ current_pc.T + T[:3,3:4]).T src_pts = [] dst_pts = [] wts = [] # 2. 按类别分别找最近匹配点 for label in np.unique(current_labels): cur_mask = current_labels == label cur_sub = transformed[cur_mask] if cur_sub.shape[0] < 10: continue tree = map_pc_trees.get(label) if tree is None: continue _, idx = tree.query(cur_sub, k=1) map_sub = tree.data[idx] src_pts.append(cur_sub) dst_pts.append(map_sub) wts.append(np.full(cur_sub.shape[0], semantic_weight[label])) if len(src_pts) == 0: break src_pts = np.concatenate(src_pts, axis=0) dst_pts = np.concatenate(dst_pts, axis=0) wts = np.concatenate(wts, axis=0) # 3. 求解变换并更新 R, t = weighted_svd_transform(src_pts, dst_pts, wts) delta_T = np.eye(4); delta_T[:3,:3] = R; delta_T[:3,3] = t T = delta_T @ T # 4. 收敛判断 if np.linalg.norm(t) < 0.01 and np.rad2deg(np.linalg.norm(R - np.eye(3))) < 0.1: break return T这个语义 ICP 的关键点在于分类型建树。把地图点按语义类别拆成多个 KDTree,匹配时只找同类别最近邻,避免“车道线点错误地匹配到路沿石点”这种跨类别灾难。semantic_weight是一个字典,比如车道线权重 1.0、杆状物 1.5、路沿石 0.8。权重控制各类别的“发言权”,但要注意,如果杆状物点数远少于车道线,权重再高也容易被淹没,所以更稳妥的做法是归一化类别内权重,让每类在目标函数中的总贡献大致相同。
语义 ICP 虽然直观,但遇到地图点稀疏或噪声较大时收敛慢。更稳健的做法是换成语义加权 NDT。NDT 对每个体素的点云用一个高斯分布建模,匹配时计算概率密度,天然具有平滑效果。PCL 中NormalDistributionsTransform支持设置切点权重,但默认不区分语义。常见的改造是,在构建 NDT 体素时只放稳定类别的点,并且对杆状物类别单独设置更高的体素内权重。如果你用的是 libpointmatcher,它可以按点云的额外维度设置权重,实现起来更顺手。我自己的经验是:当场景有清晰车道线时,语义 ICP 已经足够;当场景主要是地面标记和护栏时,NDT 的抗噪声能力明显更好。
定位的初始化也常被忽略。在重定位场景(比如开机起步),没有上一帧位姿,需要提供全局初始猜测。基于语义地图的定位有一个优势:语义类别本身就是有判别力的描述子,可以用“车道线-杆状物”的空间分布做粗略配准。一种做法是提取当前帧的语义拓扑(路沿线朝向、杆状物相对车体的方位角),与地图中的对应结构做假设匹配,生成几个候选初始位姿,再分别跑语义 ICP 取分数最高者。这个方法比全局暴力搜索快得多,也是语义地图带来的额外红利。
4. 参数怎么设:影响定位精度的几个关键值,以及它们的血色经验
4.1 语义类别的取舍:不是所有“识别准”的物体都适合定位
这是最常跳进去的坑:把网络里所有类别都塞进地图。车辆、行人、植被、建筑立面看起来识别率很高,但完全不适合作为定位锚点——车辆会移动,行人会消失,植被随风摆动,建筑立面虽然静止,但大平面在几何配准中容易产生滑移。我给团队的选类原则有三条:
- 必须空间位置固定:排除车辆、行人、永久物体以外的动态目标。
- 必须几何形状有区分度:排除完整的平面,优先选择点、线、柱类结构。
- 必须类内一致性高:比如“杆状物”里既包含路灯又包含交通信号灯,它们的粗细、高度不同,但都属于细长柱体,在匹配时互相接近没关系,只要类别标签一致就好。
下表是我在一个高架桥场景里常用的类别配置和权重:
| 语义类别 | 几何特征 | 建议权重 | 备注 |
|---|---|---|---|
| 车道线 | 细条状,低反射 | 1.0 | 低速下主要横向约束 |
| 杆状物/路灯 | 竖直圆柱 | 1.5 | 抗纵向漂移强 |
| 路沿石 | 长条直角边 | 0.8 | 与车道线配合形成“V”形约束 |
| 地面箭头/文字 | 平面标记 | 0.5 | 雨后可能被覆盖,权重不能太高 |
| 桥墩/立柱 | 粗柱体 | 0.4 | 匹配时需注意对称性 |
| 植被/墙面 | —— | 0(排除) | 完全不用 |
不要试图让所有类别都等权。在我的实践里,车道线和杆状物是最可靠的组合:车道线解决侧向,杆状物解决前进方向。如果场景不允许车道线,可以把路沿石权重提高到 1.2。
4.2 三个关键参数:体素尺寸、匹配距离阈值、迭代收敛判据
先说体素尺寸。建图时的体素尺寸和定位时的体素尺寸往往不一致。定位用的体素(或 ND T 的分辨率)决定了匹配的分辨率。体素太小,点云细节多但噪声也大,迭代容易陷入局部极值;体素太大,地图被磨平,约束变弱。我的经验值是:城市道路场景 0.4~0.6m,停车场这种特征密集场景 0.3m,高速公路 0.8m。如果你用 NDT,这个参数就是resolution,通常要大于点云的平均点间距,但不能大到掩盖杆状物的直径。
匹配距离阈值控制“哪些点对算作匹配”。在语义 ICP 里,如果最近邻居离当前点超过阈值,就应该剔除这次对应,以免引入错误匹配。我通常用两类阈值:类别无关的绝对距离(比如 1.0m)和类别相关的相对距离(比如杆状物为 0.5m,车道线为 1.2m)。原因是车道线本身是一条线,点沿线的方向可以有较大的匹配距离,但垂直方向不允许;杆状物则所有方向都要严格。没有绝对统一的阈值,需要你根据地图密度微调。
迭代收敛判据也是翻车高发区。只看平移增量,可能在旋转误差较大时提前停止。我习惯同时检查旋转矩阵与单位阵的差的 Frobenius 范数。上面的语义 ICP 代码里已经用np.linalg.norm(R - np.eye(3))做判断,你需要根据具体场景调整两个条件之间的权重。如果车辆高速运动,位姿变化大,我一般放宽旋转条件到 0.2 度,平移 0.02m。
4.3 地图坐标系的坑:初始位姿和外参标定
语义地图本身是在建图坐标系下的,如果直接用于全局定位,必须有一个坐标转换。常见做法是在建图时让建图坐标系对齐到一个地理参考框架,这样语义地图就直接能用。但如果你的建图坐标是任意原点,就需要手动或自动找地图坐标系与真实坐标系的变换矩阵。很多团队把这一步漏掉,导致运行时明明匹配分数很高,但绝对定位误差半米多。
另一个坑在外参标定。语义分割是在激光雷达扫描上进行的,如果激光雷达相对车体有安装角误差,那么即使位姿再准,语义点投影到地图后也会有系统性偏移。我建议在建图前扫一遍标定场地,用标定板验证外参精度;更重要的是,在定位代码里留一个“外参在线微调”的口子,比如保存一个 6 自由度的外参修正量,当发现匹配残差与横向偏差强相关时,用它来补偿安装松动。
5. 避坑指南:语义定位最常见的四个翻车场景与排查方法
5.1 现象:语义标签错位,导致匹配时位姿突然跳变
- 现象:定位运行几十分钟后,偶尔出现位姿横漂 0.5m,有时甚至直接发散。查看当前帧分割结果,发现同一个物体在多帧里一会儿被标成“杆状物”,一会儿被标成“树木”。
- 原因:深度学习分割网络对特定视角或遮挡不稳定,单帧硬标签会带来概率噪声;而且建图地图里这类噪声已被时序累积减轻,但实时帧没有累积,直接拿硬标签去匹配,异常点会把位姿拉歪。
- 解决:将实时帧的语义概率传给定位模块,而不是只传标签;对每个匹配点引入概率置信度作为权重,低置信度点权重很小。你可以在 3.2 节的
extract_stable_semantic_features中把prob_thresh从 0.6 提高到 0.8 做紧急处理,但更根本的办法是建立一个短时的语义标签缓存,连续两帧都为同一标签才进入匹配。
5.2 现象:在平坦宽阔区域,位姿在 Y 轴来回飘
- 现象:车辆跑在空旷平直的高速路段,地面车道线清晰,但定位轨迹呈现出左右摆动,幅度随速度增加而增大。
- 原因:车道线与路沿都是长直线,几何上只能提供到线的垂向距离约束,无法约束沿线的切线方向。尤其是当车道线平行于行进方向时,纵向约束几乎为零,此时如果没有杆状物或护栏的独立特征,侧向也会因为缺乏三角形支撑而漂移。
- 解决:加入非平行的语义特征,比如“斑马线”或“路面箭头”;或者融合高频 IMU 的横摆角速度,消除侧向自由度的漂移。此外,检查地图中杆状物的密度,如果每隔一两百米才有一个杆子,可考虑把“护栏立柱”也加入稳定类别,这类小柱子虽然不起眼,但非常密集。
5.3 现象:地图是三个月前建的,现在匹配分越来越低
- 现象:同一路段,春季地图在秋季使用时,定位精度尚可;但冬季下雪后,匹配点对减少一半,定位直接崩溃。
- 原因:季节性变化影响了语义点的位置和存在性。树叶掉光后原本隐藏在树冠下的建筑轮廓凸显出来,下雪覆盖了车道线和路面箭头,杆状物也可能会被积雪改变表面。
- 解决:地图时效性问题是语义定位的天然短板。我的习惯是给语义地图打上“季节标签”,并维护一个类别存活清单,例如“车道线”在雪后失效,但“杆状物”仍然有效。定位时根据当前环境和季节动态调整稳定类别集合。更彻底的做法是增量更新地图,当匹配残差持续偏高时,触发一个局部建图进程,将新帧中的稳定语义点合并进旧地图,同时删除对应区域内长时间不匹配的旧点。
5.4 现象:夜间或雨雾天气,分割网络输出概率整体下降
- 现象:夜间场景中,很多路沿石和护栏的点云强度变低,网络把它们误判为背景或地面;雨天时,地面反光让“车道线”的语义概率从 0.9 掉到 0.4,定位频繁丢失。
- 原因:语义分割网络主要在白天正常天气训练,对强度和反射率的变化没有泛化能力。激光雷达的强度信息在同一物体不同天气下变化很大,网络输入特征被污染。
- 解决:第一,不要把强度作为网络的唯一额外特征,考虑增加高度和回波次数特征;第二,在实时预处理环节,对强度做自适应归一化,比如按当前帧强度分布的 5%~95% 分位数拉伸,减少绝对强度影响;第三,额外训练一个“天气无关”分支,或者用多模态融合(相机语义结果来验证激光点)。如果以上都来不及,那就把失败车辆的排查重点放在定位前端的“语义置信度门控”上——当稳定语义点的数量低于某个阈值时,主动切换到 IMU 推算,避免错误发散。
6. 进阶技巧:用语义概率图代替硬标签,把定位稳到“上高速敢只靠激光”
如果你已经把前面章节里所有坑都填平了,下一个值得投入的改进方向不是换更强的语义分割网络,而是把“硬标签”换成“语义概率图”。具体做法是:建图时,每个体素里不只存标签,还存一个类别概率向量,比如P(杆状物)=0.7, P(车道线)=0.2, P(路沿)=0.1。定位匹配时,当前帧的每个点也输出概率向量,匹配的距离计算从“同一标签最近邻”变成“类别概率分布之间的 KL 散度加几何距离”。这样即使某个点在单帧里被分得模棱两可,也不需要硬切到某一类,而是通过概率权重参与约束,整体匹配依然平滑。在实际测试中,这个改动能把夜间场景的定位失效率降低约一个数量级,代价仅仅是建图文件变大一点点。
我试过一个更轻的版本:不生成完整的概率网格,只对每个类别保存一张“存在置信度”图,置信度按点云密度加权。定位时,将当前帧语义点的概率乘到对应地图点的权重上,效果接近但实现简单。这个方法让我在某地下车库项目里,在没有 GPS、仅有车道线和立柱的条件下,把里程计累计误差抑制在了 0.1% 距离以下。
验证方法方面,我习惯用轨迹评估工具,先算出估计轨迹和真值轨迹的绝对位姿误差(ATE),但只看 ATE 不够。后来一次高速测试里,ATE 只有 0.12m,车辆却明显左右摆,才发现相对位姿误差(RPE)很大。从那以后,我的验收标准固定为:低速场景 ATE < 0.15m,高速场景 RPE(1s 间隔)< 0.05m。如果你手边没有真值系统,也可以在相同路段来回跑两遍,比较两次定位轨迹的重合度,主要看车道保持的一致性。
最后说一句经验:语义定位不是要替代几何定位,而是给几何配准加一副“能看懂场景”的眼睛。初期先做最小闭环——只用一个类别(比如杆状物)跑通,再逐步加类别,别一上来就把所有语义都塞进地图。配合好参数调优和避坑检验,这条路能让你车的定位系统在那些“以前不敢去”的场景里继续工作。希望帮到你。
本文还有配套的精品资源,点击获取