type
status
date
slug
summary
tags
category
icon
password
重定位
什么是重定位?
在正常的SLAM运行中,机器人通过增量式(Incremental)的方法,根据上一时刻的位置推算当前位置。但这种方式在以下情况会失效:
- 跟踪丢失(Tracking Lost): 运动太快、光照剧烈变化、或者传感器被遮挡,导致系统无法跟上当前的坐标。
- 冷启动(Cold Start): 机器人开机时,已知有地图,但不知道自己站在地图的哪个角落。
- 绑架机器人问题(Kidnapped Robot Problem): 机器人在运行中被强行移动到另一个地方,位姿发生突变。
重定位的目标: 在不参考上一时刻位姿的情况下,仅凭当前的一帧(或几帧)观测数据,估计出机器人在全局地图中的位姿。
重定位的核心技术分类
重定位的核心是位置识别(Place Recognition),目前主流的方法如下:
1. 特征匹配 (The Classical Hand-crafted)
这是工业界(如扫地机器人、工业 AGV)最稳健的方案,强调数学严谨性和计算效率。
- 视觉词袋 (BoW/DBoW): 将图像特征(ORB/SURF)编码成“视觉单词”,通过数据库检索相似帧。
- 代表作: ORB-SLAM3 的重定位模块 DBoW3。
- 激光几何描述子: 将 3D 点云压缩为 2D 特征图(如 Scan Context)或利用极坐标特征(如 LiDAR-Iris)。
- 特点: 即使在没有光照的环境下,只要空间几何结构(墙壁、柱子)没变,就能极速找回位置。
- RANSAC + PnP/ICP: 在初步匹配后,利用随机采样一致性(RANSAC)剔除误匹配,通过 PnP(视觉)或 ICP(激光)解算精确位姿。
2. 深度学习 (Learning-based)
2024-2026 年的绝对主流,解决了传统方法“怕光照变化、怕视角差异”的痛点。
- 全局描述子检索 (VPR): 使用如 NetVLAD、AnyLoc 或基于 DINOv2 的网络提取全图特征。
- 突破点: 即使是“白天建图,晚上重定位”,或者“夏天建图,冬天重定位”,它也能识别出是同一个地方。
- 可学习的特征匹配: 使用 SuperPoint + LightGlue 替代传统的 ORB 匹配。
- 优势: 在纹理稀疏(白墙、玻璃)或剧烈运动模糊的情况下,匹配成功率比传统方法高出数倍。
- 端到端神经重定位: 如
iMap或Nice-SLAM。直接训练一个神经网络(或使用神经辐射场 NeRF),当你输入一张照片,它直接“预测”出当前的坐标。
3. 语义匹配(Semantic)
“语义导航”方向的核心,它让机器人像人一样认路。
- 语义拓扑匹配: 机器人不再匹配成千上万的点,而是匹配“物体布局”。
- 逻辑: “我的左边是一个冰箱,前方三个月是个沙发”,这种空间逻辑在环境杂乱、物体移动时极具鲁棒性。
- 语义点云/八叉树地图: 在 RTAB-Map 或类似框架中,结合 YOLOv10 或 Mask R-CNN 过滤掉动态物体(行人、车辆),只在静态语义物体(柱子、门框)上进行重定位。
- 代表作: GY-SLAM、DS-SLAM。
4. 隐式表示与新神经渲染派 (Implicit/3DGS)
2025 年异军突起的前沿技术,将地图表示为连续的函数或高斯点。
- 3D Gaussian Splatting (3DGS) 重定位: 机器人不再保存粗糙的点云,而是保存一个“照片级”的可渲染地图。
- 操作: 重定位时,系统生成一张当前位姿下的“虚拟照片”,与真实相机照片对比,通过反向传播直接优化出位姿。
- NeRF-SLAM: 利用神经辐射场进行重定位,精度极高,能处理复杂的光影折射。
重定位的一般流程
- 特征提取: 从当前的传感器数据(图像或点云)中提取具有代表性的特征。
- 检索/候选帧筛选: 在地图数据库中搜索,找出与当前特征最像的几个历史场景(候选帧)。
- 几何校验: 对候选帧进行严格的几何匹配计算。例如,通过求解 PnP 问题或点云配准,计算出精确的变换矩阵。
- 位姿恢复: 如果校验通过且误差足够小,系统宣布重定位成功,并将位姿设置回跟踪模块。
重定位的一个尝试实验
重定位方案:AMCL (2D) + RTAB-Map (3D) + 语义 Mask 过滤
一、环境和参数配置
在正式运行重定位之前,需要确保 D435i 的深度数据能被转化为 AMCL 可识别的“伪雷达”信号。
- 安装深度图转激光包:
- 注意在package.xml中添加依赖
- 配置
.yaml文件: - 转换节点: 配置
depthimage_to_laserscan.yaml,将扫描范围高度设置在机器人底盘上方(如 0.2m 处),这样模拟出的“激光”才能扫到墙壁而不是地板。
D435i 驱动: 开启 realsense2_camera,确保输出 depth 和 color 图像,并开启内置 IMU(可选但推荐)。
可选:测试 D435i 驱动是否正常
运行下述代码并执行参数检查
d435i_launch.py
二、运行重定位流程
这一步的核心是让机器人知道自己在地图的哪个位置。
1. 手持模式下静态tf
2.启动地图服务器
- 使用
map_server加载你之前用 RTAB-Map 导出的.yaml栅格地图。
- 启动
amcl节点。
- 操作: 在 RVIZ 中使用 "2D Pose Estimate" 在地图上大致标出机器人当前的位置。AMCL 会散布“粒子”并通过模拟激光不断修正。
2. 启动 RTAB-Map 定位模式 (3D 精修)
启动 RTAB-Map 时,关键参数必须设置正确:
args := "--delete_db_on_start"千万不要加。
localization := true:告诉系统只定位,不更新地图。
rtabmap_args := "--Mem/IncrementalMemory false --Mem/InitWMWithAllNodes true":IncrementalMemory false:关闭增量建图。InitWMWithAllNodes true:启动时将整个地图装入工作内存,提高全局重定位成功率。
3. 触发重定位 (Relocalization)
- 特征匹配: 慢慢转动机器人,让 D435i 看到地图中曾经出现过的特征点。
- 状态观察: 当 RTAB-Map 终端显示
Loop closure detected!或者 RVIZ 中的机器人坐标突然“闪”到地图中某个位置且不再漂移时,说明重定位成功。
第三阶段:迈向语义导航
重定位成功后,你需要将“位置”转化为“任务”。
- 加载语义模型:
在后台运行一个轻量级的目标检测模型(如 YOLOv10)。
- 坐标映射:
- 当 YOLO 在图像中识别出“饮水机”时,结合 D435i 提供的深度值,计算出该物体相对于相机的 $(x, y, z)$。
- 利用 RTAB-Map 此时提供的 Map -> Base_link 坐标变换,将物体的坐标转换到 全局地图坐标系 下。
- 发布导航目标:
使用 ROS 的 move_base 或 Nav2。如果你想去“饮水机”,程序通过查询语义数据库获得该坐标,发送 Goal 给导航堆栈。
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/2e8c7b13-c6a7-80b9-9e59-ec84b93271c3
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts









