SLAM系统原理推导

1.SLAM 基础知识

  SLAM 系统框架如图1 所示。包括两个主要传感器:激光雷达与轮式里程计。其中激光雷达用来获取环境信息,通过激光扫描可以测量周围 360°环境的障碍物信息。轮式里程计则通过移动底盘的电机编码器持续获取机器人的里程信息。

  激光雷达的作用主要有两个方面:一方面可以为构图算法提供点云数据。当构图算法获取足够的点云数据后,即可构建出以机器人为中心,以雷达射程为半径的局部地图。另一方面可以通过系统观测模型修正贝叶斯滤波器的预测位姿,提高滤波估计的机器人位姿精度。轮式里程计主要作用则是为 SLAM 系统提供里程信息。通过轮式里程计运动学模型,可以将里程信息转化为机器人位姿变化信息,送入贝叶斯滤波器初步计算出预测位姿。 预测精度完全依赖于轮式里程计提供的数据精度。而轮式里程计的测量精度对于获取精确的机器人位姿来讲远远不够。因此,需要用到系统观测模型对预测结果进行修正。经过修正并加权求和得到的机器人位姿即为当前估计的最佳位姿。在已知最佳位姿的条件下,局部地图即可更新至全局地图中。全局地图进一步进行高斯模糊,构建新的观测模型。至此整个 SLAM系统形成完整的闭环系统。
在这里插入图片描述

1.1 SLAM 系统概率模型

  在 SLAM 系统框架中, 采用贝叶斯滤波器为 SLAM 系统的后端优化算法提供概率模型。 贝叶斯滤波的原理是基于已经发生的事件对未发生事件进行估计,求解未发生事件的最可能概率分布。贝叶斯滤波的推导如图 2 所示。
在这里插入图片描述
  在贝叶斯滤波器构建的 SLAM 概率模型基础上, 发展出了两大分支: 基于卡尔曼滤波的 SLAM 算法, 主要代表有 EKF-SLAM, UKF-SLAM 等; 以及基于粒子滤波的 SLAM 算法, 主要代表有 RBPF-SLAM, FastSLAM 等。 其中基于卡尔曼滤波的 SLAM 算法要求噪声必须服从高斯分布且系统非线性不能太大;相反基于粒子滤波的 SLAM 算法适用于非线性较大的系统, 但受限于粒子退化与粒子耗散这一对耦合问题。

1.2 里程计运动模型

  机器人底盘分为两轮差速底盘和三轮全向底盘。两轮差速底盘其结构简单,造价较低,并且建立的模型相对简单,因此被应用于各种类型的机器人生产中。两轮差速底盘的运动学模型如图 3 所示。
在这里插入图片描述
该模型将机器人的任意移动视为某一圆心做圆弧运动,其中 d 为两轮距离的二分之一, r 为底盘中心做圆弧运动的半径。设左轮速度为 v L v_{L} vL,右轮速度为 v R v_{R} vR, 底盘中心的角速度为 ω, 若已知 v L v_{L} vL, v R v_{R} vR,可以由式(1)计算出底盘运动中心的角速度 ω 和线速度 v。
在这里插入图片描述
  假设机器人在里程计数据更新的两时刻之间的极短时间 Δ t \Delta t Δt内作匀速运动,则相邻两时刻之间机器人位移由式(2)给出。
在这里插入图片描述
式中: dx ,dy , d θ d\theta dθ 分别为机器人坐标系下沿 x 轴方向位移,沿 y 轴方向位移,以及以 z 轴为旋转轴的逆时针旋转角度。式(2)给出的是在机器人坐标系下的位移。机器人坐标系与世界坐标系的关系是由机器人位姿联系起来的,如图 2-4 所示。 图中 ( x , y , θ ) \left ( x,y,\theta \right ) (x,y,θ)为机器人在世界坐标系下的位姿表示。
在这里插入图片描述
  可以通过机器人位姿 ( x , y , θ ) \left ( x,y,\theta \right ) (x,y,θ)将机器人在机器人坐标系的位移转换到世界坐标系中。最终计算的机器人运动模型由式(3)给出:
在这里插入图片描述

1.3 激光雷达测距模型

  激光雷达的测距模型主要有以下两种:三角测距与 TOF( Time of Flight)测距。其中基于三角测距模型的激光雷达实物图如图 5 a 所示。图中左边小孔为激光发射器,右边稍大的孔为接受激光的光学摄像头。 三角测距模型主要原理为三角形的角边角定理,激光发射器位置与摄像头光心以及扫描点构成的三角形如图 5 b 所示。
在这里插入图片描述
  图 5b 中 O 1 O_{1} O1点为激光发射器, O 2 O_{2} O2点为摄像头光心轴,光心轴旁边的三角形代表用来捕捉反射光斑的相机模型。激光发射器发射的激光由红色虚线表示,相机接收的反射激光由蓝色虚线表示。 A 点表示激光击中的障碍物位置,障碍物A 在成像平面上的位置用 A 1 A_{1} A1 表示。其中线段 O 1 O_{1} O

### ORB-SLAM2 的原理及架构 ORB-SLAM2 是一种基于特征点的视觉 SLAM 系统,其核心目标是在未知环境中实时构建环境的地图并估计相机的姿态。该系统通过多线程的方式实现高效运行,并支持单目、双目以及 RGB-D 相机输入。 #### 系统组成 ORB-SLAM2 主要由三个主要线程构成,分别是追踪 (Tracking)、局部建图 (Local Mapping) 和闭环检测 (Loop Closing)[^2]。以下是各模块的功能描述: 1. **追踪 (Tracking)** 跟踪模块负责实时计算当前帧中的相机姿态。它通过对图像中的特征点进行匹配来完成这一任务。具体来说,跟踪模块会尝试将当前帧中的特征点与地图中的已知特征点关联起来,从而推导出相机的位置和方向。 2. **局部建图 (Local Mapping)** 局部建图模块的主要功能是对新观测到的空间点进行处理,并将其加入全局地图中。此模块还会执行一些优化操作,比如剔除不稳定的特征点或更新关键帧之间的几何关系。 3. **闭环检测 (Loop Closing)** 闭环检测用于解决累积误差问题。当机器人返回之前访问过的地方时,闭环检测模块能够识别这种重访情况,并调整地图以消除漂移误差。这一步骤对于保持地图的一致性和准确性至关重要。 除了上述三大主线程外,ORB-SLAM2 还包含了其他辅助模块,例如地图初始化 (Map Initialization),用于创建初始地图;位置识别 (Place Recognition),帮助发现重复场景;以及整体的地图结构管理 (MAP)。 #### 架构图概述 虽然无法直接提供图片形式的架构图,但可以文字化描述如下: - 整体架构分为三大部分——追踪、局部建图和闭环检测。 - 输入数据流从摄像头进入后被送入追踪模块,在这里完成初步定位。 - 随后的空间点会被传递给局部建图模块进一步细化和完善。 - 同时,闭环检测持续监控是否存在环路闭合的可能性,一旦确认则触发相应的校正机制。 #### 单目 vs 双目/RGB-D 支持 需要注意的是,ORB-SLAM2 不仅继承了 ORB-SLAM 对于纯单目的支持,还扩展到了双目和 RGB-D 数据源上。这意味着不同类型的传感器都可以利用这套框架来进行同步定位与建图工作。 ```python # 下面是一个简单的伪代码表示如何调用 ORB-SLAM2 中的核心组件 class ORBSLAM2: def __init__(self): self.tracking = Tracking() self.local_mapping = LocalMapping() self.loop_closing = LoopClosing() def process_frame(self, frame): pose = self.tracking.run(frame) new_keypoints = self.local_mapping.update(pose, frame) self.loop_closing.check_and_correct(new_keypoints) # 初始化系统实例 slam_system = ORBSLAM2() # 处理每一帧数据 for frame in video_stream: slam_system.process_frame(frame) ``` 以上展示了简化版的 ORB-SLAM2 流程逻辑,实际应用中还需要考虑更多细节参数配置等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值