SLAM Scan-Matching/Registration

本文详细介绍了SLAM(Simultaneous Localization and Mapping)及其核心算法之一的ICP(Iterative Closest Point)。探讨了SLAM的概念、定位方法及评估指标,并深入解析了ICP算法的工作原理、实现步骤与优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概念

  • SLAM:它根据两帧扫描数据,基于环境的外形和扫描匹配来计算刚体变换。
  • 仅仅基于里程计传感器(Odometry Sensors provided by wheel encoders)或IMU传感器创建的地图是不准确的,因为里程计传感器存在累计误差,所以LDS(Laser Distance Sensor)使用Scan-Matching/Registration算法使新扫描的激光数据与已有地图或激光扫描数据重新对齐,从而获得更加准确的机器人位姿(Pose)和地图(Map)。
  • Scan-Matching性能评估指标
    • 计算量
    • 结果的直观性
  • Scan-Matching问题描述
    这里写图片描述

1.1 SLAM定位方法

  • SLAM定位方法流派:概率方法(probabilistic methods)、
  • 概率方法
    • Extended Kalman Filter (EKF)
    • Particle filter
      • Monte-Carlo (stochastic)
      • Olson (brute-force)
      • Hough (analysis-oriented)
    • Maximum Likelihood
  • 匹配法 (Scan Matching):通过匹配两帧点云数据(即把两帧点云数据对齐)来计算机器人的刚体变换
    • ICP及各种变体
    • Scan-to-Scan
    • Scan-to-Map
    • Feature-based
    • RANSAC for outlier rejection
    • Correlative matching
    • Iterative Dual Correspondence

2. 迭代最近点 Iterative closest Point (ICP)

  • 基本原理:试图迭代地找到两次扫描之间的变换(平移TT+旋转R),以使两次扫描(scan frame)的最近邻居之间的距离最小化。
  • 算法组成:对应点搜索和位姿求解。它的目的是寻求点集之间的匹配关系,求解的结果是两点集之间的平移及旋转量。
  • 实现方法:没有特征提取的条件下,把两次scan frame进行对齐
  • 缺点速度慢 (因为需要使用所有的点云(point cloud)数据来找到最优变换)
  • 输入
    • 参考激光扫描数据
    • 新的激光扫描数据
  • 输出
    • 匹配的精确度(the accuracy of the matching)
    • 扫描匹配的协方差矩阵(covariance of the scan matching):常用于做闭环检测(loop closing)
  • a

2.1 实现步骤

  • 1) moving
    通过变换矩阵(初始变换矩阵通过Odom或IMU计算得到、其它时候为上一次的迭代结果),使两个Scan frame位于同一个坐标系
  • 2) matching
    为每一个new scan frame 中的点在reference scan frame中找到一个距离最近的点(逐点搜索或kd-tree optimized search)
  • 3) weighting
    根据一定的标准(匹配的距离大小、指定点的不确定性)为每个激光点赋予不同的权重,因为它不能提高收敛速度,一般很少使用
  • 4) rejection
    由于移动和遮挡,两个scan frame不可能完全相同,假设有80%是相同的激光点。其它20%为异常点(如距离过大被认为是误匹配、多个新激光点匹配到同一个旧的激光点,则只保留距离最小的激光点),则把它们拒绝掉
  • 5)minimization
    • 它返回使两次扫描误差最小的变换矩阵
    • 最小化常使用点到线段的距离(point-to-segment distance), 因为每次观察同一个位置,激光点不一定是同一个点,但这些点总是在同一条直线上
    • 最小化点到点的距离(point-to-point)将导致坏的收敛或收敛速度慢
    • 误差最小化可通过CholeskydecompositionCholeskydecomposition实现
  • Loop以上5步,直到满足以下任一条件为止:
    • 收敛(converges)
    • 结果振荡
    • 达到最大迭代次数

2.2 Metric-based ICP (MbICP)

  • 目标:通过improve matching算法来提高性能
  • 基本原理:发现一个变换使用距离dd最小
  • 算法:与ICP相比,只有计算距离的公式有变化(考虑了旋转因素)
    这里写图片描述
    • L是一个与长度等同的设计参数,通过取L=3L=3较佳

    2.3 协议差矩阵(Covariance Matrix)

    • 用途:用于描述ICP匹配输出的变换的准确度(accuracy)
    • 2D空间
      • 每一个Pose有三个参数(x,y,θ)(x,y,θ)
      • 协方差矩阵为3×33×3
    • 3D空间
      • 每一个Pose有三个参数(x,y,z,α,β,γ)(x,y,z,α,β,γ)
      • 协方差矩阵为6×66×6
    • 计算方法
      • Bruteforce Method
      • Closed Form Covariance of a Minimization Algorithm
    • a
    • a
    • a
### 可能原因分析 进程异常退出并返回 `exit code -11` 表明程序发生了段错误(Segmentation Fault)。这通常是由于访问非法内存地址引起的。以下是可能导致此问题的具体原因: #### 1. 配置文件路径不正确 如果配置文件路径设置有误,可能会导致程序无法加载必要的参数,从而引发崩溃。例如,在命令中指定的 `TUM3.yaml` 和 `ORBvoc.txt` 文件路径可能有问题[^1]。 #### 2. 动态链接库缺失或版本冲突 如果 `libtorch` 或其他依赖项未正确安装到项目目录下的 `Thirdparty` 文件夹中,则可能导致动态链接失败,进而触发段错误。确保已按照说明将 `libtorch` 解压至正确的路径。 #### 3. 输入数据格式不符合预期 输入的数据流(如摄像头图像)可能存在格式不符的情况。例如,使用的 YAML 文件中的相机校准参数与实际硬件设备不匹配,也可能引起程序崩溃。 #### 4. 内存泄漏或越界访问 代码内部可能存在未经初始化的指针、数组越界等问题,这些问题通常难以通过静态检查发现,但在运行时会表现为段错误。 --- ### 排查方法 为了定位具体问题,可以采取以下措施: #### 使用调试工具 GDB 可以通过 GNU 调试器 (GDB) 来捕获详细的堆栈信息: ```bash gdb --args ./ORB_SLAM3_Vocabulary/Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/TUM3.yaml ``` 启动后执行 `run` 命令让程序运行直到发生崩溃。一旦出现段错误,使用 `bt` 查看完整的调用堆栈信息[^2]。 #### 检查日志输出 许多 SLAM 系统会在控制台打印诊断消息。仔细阅读这些日志可以帮助识别潜在的问题源。特别注意是否有任何警告提示关于资源不可用或者参数解析失败的信息。 #### 单元测试核心组件 尝试单独验证各个模块的功能性。比如先确认词汇表 (`ORBvoc.txt`) 是否能够被成功读取;再逐步加入传感器模型定义部分直至整个系统正常工作为止。 --- ### 示例修复脚本 假设问题是因缺少某些环境变量造成的,下面是一个简单的 Bash 脚本来帮助自动化检测和修正常见错误条件: ```bash #!/bin/bash # 设置必要环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libtorch/library/folder # 执行目标应用程序, 并重定向标准错误以便后续分析 ./ORB_SLAM3_Vocabulary/Examples/Monocular/mono_tum \ /absolute/path/to/Vocabulary/ORBvoc.txt \ /absolute/path/to/Examples/TUM3.yaml 2>error.log || cat error.log ``` 上述脚本不仅设置了所需的共享对象搜索路径,还记录了所有 stderr 输出以供进一步审查。 --- ### 总结建议 综合以上讨论可知,解决此类问题的关键在于细致入微地跟踪每一个环节的状态变化情况,并利用现代软件开发实践所提供的强大辅助手段来加速这一过程。务必逐一排除可能性,最终锁定根本诱因所在位置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值