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): 使用如 NetVLADAnyLoc 或基于 DINOv2 的网络提取全图特征。
    • 突破点: 即使是“白天建图,晚上重定位”,或者“夏天建图,冬天重定位”,它也能识别出是同一个地方。
  • 可学习的特征匹配: 使用 SuperPoint + LightGlue 替代传统的 ORB 匹配。
    • 优势: 在纹理稀疏(白墙、玻璃)或剧烈运动模糊的情况下,匹配成功率比传统方法高出数倍。
  • 端到端神经重定位: iMapNice-SLAM。直接训练一个神经网络(或使用神经辐射场 NeRF),当你输入一张照片,它直接“预测”出当前的坐标。
 
3. 语义匹配(Semantic)
“语义导航”方向的核心,它让机器人像人一样认路。
  • 语义拓扑匹配: 机器人不再匹配成千上万的点,而是匹配“物体布局”。
    • 逻辑: “我的左边是一个冰箱,前方三个月是个沙发”,这种空间逻辑在环境杂乱、物体移动时极具鲁棒性。
  • 语义点云/八叉树地图: 在 RTAB-Map 或类似框架中,结合 YOLOv10 或 Mask R-CNN 过滤掉动态物体(行人、车辆),只在静态语义物体(柱子、门框)上进行重定位。
    • 代表作: GY-SLAMDS-SLAM
 
4. 隐式表示与新神经渲染派 (Implicit/3DGS) 2025 年异军突起的前沿技术,将地图表示为连续的函数或高斯点。
  • 3D Gaussian Splatting (3DGS) 重定位: 机器人不再保存粗糙的点云,而是保存一个“照片级”的可渲染地图。
    • 操作: 重定位时,系统生成一张当前位姿下的“虚拟照片”,与真实相机照片对比,通过反向传播直接优化出位姿。
  • NeRF-SLAM: 利用神经辐射场进行重定位,精度极高,能处理复杂的光影折射。
 

重定位的一般流程

  1. 特征提取: 从当前的传感器数据(图像或点云)中提取具有代表性的特征。
  1. 检索/候选帧筛选: 在地图数据库中搜索,找出与当前特征最像的几个历史场景(候选帧)。
  1. 几何校验: 对候选帧进行严格的几何匹配计算。例如,通过求解 PnP 问题或点云配准,计算出精确的变换矩阵。
  1. 位姿恢复: 如果校验通过且误差足够小,系统宣布重定位成功,并将位姿设置回跟踪模块。
 
 

重定位的一个尝试实验


💡
重定位方案:AMCL (2D) + RTAB-Map (3D) + 语义 Mask 过滤

一、环境和参数配置

在正式运行重定位之前,需要确保 D435i 的深度数据能被转化为 AMCL 可识别的“伪雷达”信号。
  1. 安装深度图转激光包:
      • 注意在package.xml中添加依赖
  1. 配置 .yaml 文件:
    1. D435i 驱动: 开启 realsense2_camera,确保输出 depthcolor 图像,并开启内置 IMU(可选但推荐)。
      可选:测试 D435i 驱动是否正常
      运行下述代码并执行参数检查
      d435i_launch.py
      • 转换节点: 配置 depthimage_to_laserscan.yaml,将扫描范围高度设置在机器人底盘上方(如 0.2m 处),这样模拟出的“激光”才能扫到墙壁而不是地板。
        •  

二、运行重定位流程

这一步的核心是让机器人知道自己在地图的哪个位置。
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 中的机器人坐标突然“闪”到地图中某个位置且不再漂移时,说明重定位成功。
     

    第三阶段:迈向语义导航

    重定位成功后,你需要将“位置”转化为“任务”。
    1. 加载语义模型:
      1. 在后台运行一个轻量级的目标检测模型(如 YOLOv10)。
    1. 坐标映射:
        • 当 YOLO 在图像中识别出“饮水机”时,结合 D435i 提供的深度值,计算出该物体相对于相机的 $(x, y, z)$。
        • 利用 RTAB-Map 此时提供的 Map -> Base_link 坐标变换,将物体的坐标转换到 全局地图坐标系 下。
    1. 发布导航目标:
      1. 使用 ROS 的 move_base 或 Nav2。如果你想去“饮水机”,程序通过查询语义数据库获得该坐标,发送 Goal 给导航堆栈。
     
     
    💡
    有关问题,欢迎您在底部评论区留言,一起交流~
    SLAM中地图的分类D435i通过RTAB-Map实现3D点云和2D建图
    Loading...