1. SLAM问题的本质
SLAM 的全称是即时定位与地图构建( Simultaneous Localization and Mapping),解决的是一个“鸡生蛋还是蛋生鸡”的经典问题:
一个机器人身处一个未知环境,它需要:
麻烦的是,这两件事互相依赖:精确的地图需要精确的位姿来构建,而精确的位姿又需要精确的地图来计算。
SLAM的核心就是利用传感器数据(通常是激光雷达、摄像头、里程计等)来同时解决这两个相互依赖的问题。
2. EKF-SLAM
在FastSLAM出现之前,主流的解决方案是 EKF-SLAM(基于扩展卡尔曼滤波的SLAM),EKF-SLAM的思路:
将机器人的位姿(位置和方向 [x, y, θ])和地图中所有路标点的位置( [mx1, my1], [mx2, my2], …),全部拼接成一个巨大的状态向量,使用扩展卡尔曼滤波来估计这个巨大状态向量的均值和协方差(不确定性),但是EKF-SLAM有一些难题:
- 计算复杂度高:状态向量的维度是 3 + 2N(N是路标数量)。每次更新(来了新的传感器数据)的计算复杂度是 O(N²),当地图很大(N很大)时,计算会变得非常缓慢,无法实时运行。
- 数据关联脆弱:如果错误地将一个观测关联到了错误的路标(数据关联错误),整个滤波器可能会发散,导致完全错误的结果。
- 线性化误差:EKF对非线性模型进行一阶线性化近似,在非线性程度高的场景(如急转弯)会引入较大误差。
3. FastSLAM
FastSLAM算法的开创性在于它采用了 RBPF 的方法,对SLAM问题进行了分解,认为SLAM问题中的机器人的路径(位姿轨迹)和地图,在给定路径的条件下,是条件独立的,举例来理解:
- 想象:蒙着眼在一个房间里走路,每隔一步就伸手触摸一下周围的东西来猜房间的布局。
- 路径:从起点到当前们置走过的所有位置(s1, s2, s3, …, st)。
- 地图:脑海中根据在不同位置摸到的东西构建出的房间模型。
- 关键点:如果已经准确地知道了你每一步的精确位置(即整个路径),那么构建地图就变得简单,只需要把在每个位置上感知到的物体,以其绝对位置添加到地图上即可,整个地图的估计可以分解为对每个路标的独立估计。
FastSLAM利用这个思想,将SLAM问题分解为两个问题:
- 机器人路径估计:使用粒子滤波来估计机器人的轨迹,每个粒子都代表一条可能的历史路径假设。
- 地图估计:在每条给定的路径假设下,地图中的每个路标都是条件独立的,因此,为每个粒子、每个路标维护一个独立的扩展卡尔曼滤波器。
这种分解将复杂度从 O(N²) 降低到了 O(N log N),这是一个巨大的提升。
4. FastSLAM 1.0 算法详解
FastSLAM主要有两个版本:1.0和2.0,先从更直观的1.0开始。一个粒子包含了以下信息:
- 地图:由一组EKF组成,每个EKF负责估计一个路标的位置和不确定性。
- 权重:w[k],表示这条路径假设正确的可能性。
算法流程是一个典型的粒子滤波循环,分为四个步骤:
4.1 采样(运动更新)
- 输入:控制命令ut(例如,从里程计得到的“前进1米,左转10度”)。
- 操作:对于上一个时刻的每个粒子 [k],根据运动模型采样一个新的位姿,添加到该粒子的路径历史中。
- 效果:粒子云散开,表示在考虑了新的控制指令后,机器人可能所在的位置范围增加了(不确定性增加)。
4.2 观测更新(测量更新)
- 输入:传感器观测 z_t(例如,激光雷达测到的多个路标的距离和角度)。
- 操作:对于每个粒子 [k] 和每一个观测到的路标 i进行数据关联,首先,采用最大似然关联,粒子判断这个观测 z_t 来自于地图中的哪个已知路标,或者一个新路标,即为观测计算它与地图中所有已知路标的匹配概率,选择概率最高的那个。如果概率都低于阈值,则认为是一个新路标并初始化它;如果关联到已知路标 j,则使用这个观测 z_t 去更新该粒子内部负责路标 j 的那个EKF。(每个粒子的地图都是独立维护的)
- 效果:每个粒子根据自己的路径历史和自己维护的地图,对观测做出解释,并更新自己地图中路标位置的信度(均值和协方差)。
4.3 计算重要性权重
不是所有粒子都是平等的,有的粒子提出的路径假设更能解释所有的观测数据,它就应该拥有更高的权重。
- 操作:计算每个粒子 [k] 的新权重 wt[k],权重的正比于 在当前位姿下,看到实际观测值 z_t 的似然概率,即
这个概率可以根据粒子中EKF的协方差来计算,简单说,如果观测值和粒子地图的预测值越吻合,这个粒子的权重就越高。
4.4 重采样
经过几轮迭代后,少数粒子的权重会非常高,而绝大多数粒子的权重会趋近于零,这意味着计算资源被浪费在了那些不可能的假设上。
- 操作:根据粒子的权重分布,丢弃低权重的粒子,复制高权重的粒子,复制后,所有新粒子的权重被重置为相同的值(如 1/N)。
- 风险:重采样可能导致粒子耗散,即丢失了合理的路径假设多样性。
至此,一个循环结束,得到了t时刻的粒子集合,它们代表了机器人的位姿和地图的后验概率分布估计。
5. FastSLAM 2.0 的改进
FastSLAM 1.0的一个主要问题是它在采样阶段没有考虑最新的观测信息,它只根据运动模型(里程计)来采样,这相当于瞎猜,然后再用观测来修正权重,如果运动噪声很大,这种方法效率很低,需要大量粒子才能覆盖可能性。
FastSLAM 2.0的核心改进是:在采样新位姿时,融入最新的观测信息。
这被称为最优重要性采样,通过观测 z_t 来缩小采样范围,使得提出的位姿假设更有可能接近真实位置,这使得算法效率大大提高,在相同粒子数下,精度远高于1.0版本。当然,计算这个提议分布本身也更复杂一些。
6. 总结
优势:
- 计算高效:巧妙分解,将复杂度降至 O(N log N),能处理大规模环境。
- 多假设性:粒子滤波天然支持多模态分布,能处理“从两个相似走廊中选一个”这类歧义问题。
- 地图表示:易于构建任何类型的地图(特征地图、栅格地图等)。
劣势与挑战:
- 粒子耗散:重采样可能导致粒子多样性丧失,如果正确的路径假设在初期权重不高,可能会被永久丢弃。
- 数据关联:数据关联错误对FastSLAM是灾难性的。一旦关联错误,会更新错误的路标,并给粒子一个错误的高权重。
- 参数调整:粒子数量、运动噪声模型等需要仔细调整。
希望这份详细解析能为你打开FastSLAM的大门。