EKF—SLAM推导

SLAM与EKF详解

转自   http://blog.youkuaiyun.com/qq_30159351/article/details/53408740

这是SLAM最传统的基础,是SLAM最原始的方法,虽然现在使用较少,但是还是有必要了解。

What’s Kalman Filter

这是一个贝叶斯滤波器,估计线性高斯模型,是对线性模型和高斯分布的优化方法。

高斯分布

首先,回顾一下高斯分布: 
这里写图片描述 
高斯分布的一些性质: 
如果原变量为高斯分布,则边缘化和条件概率仍然满足高斯分布。 
这里写图片描述 
边缘分布和条件分布的模型: 
这里写图片描述这里写图片描述


卡尔曼滤波器的主要参数

卡尔曼滤波器假设x(paths), z(observations)都为线性高斯的: 
这里写图片描述 
主要参数: 
这里写图片描述 
A是在没有命令的情况下,由于环境因素造成的机器人的位置移动。 
B是命令对机器人位置的改变 
C是地图和observations的对应关系,即两者的联系,描述。 
最后两个为噪声,是由于测量中的误差造成的。协方差分布为R, Q。

线性motion model和observation model

因为之前已经假设了x,z都是高斯分布的 
运动模型: 
这里写图片描述 
观测模型: 
这里写图片描述 
由此就可以使用第三节的贝叶斯滤波器公式: 
这里写图片描述


卡尔曼滤波器算法

这里写图片描述 
2,3是prediction过程,4-7是correction过程。 
其实卡尔曼滤波就是在估计和测量中找到一个平衡。 
K为卡尔曼增益,就是通过这个变量来调节估计和预测的平衡。 
这里写图片描述 
卡尔曼滤波是在假设高斯和线性动作和观测模型下进行的,但是现实中并不是这样的。


What’s Extended Kalman Filter

引入非线性模型: 
这里写图片描述 
在线性高斯模型中: 
这里写图片描述 
在非线性高斯模型中: 
这里写图片描述 
通过局部线性来解决非线性的问题。


复习Jacobian矩阵

这里写图片描述 
它相当于对一个非线性函数做了切平面。 
这里写图片描述


修改预测和校正过程

这里写图片描述 
用图表示为: 
这里写图片描述 
这里写图片描述 
由此运动模型和观测模型修改为: 
这里写图片描述 
这里写图片描述


Extended Kalman Filter算法

这里写图片描述

上一节主要讲解了EKF的基本原理,这一次主要关注如何将EKF算法应用在SLAM上。

EKF-SLAM

现在的问题就是解决下面这个概率分布的估计问题: 
这里写图片描述 
阴影部分为未知 
这里写图片描述 
这里我们需要确定均值和方差到底是什么?

假设在2D平面内,状态表示为下面这个式子: 
这里写图片描述 
所以有均值和方差为: 
这么Map有n个landmark,所以是3+2n维的高斯分布 
这里写图片描述 
简写为: 
这里写图片描述


EKF-SLAM的过程

这里写图片描述

  • State prediction

这里写图片描述 
机器人往前走一步,通过motion model可以估计机器人所在的位置,此时机器人位置的不确定性会增加(红色区域为机器人可能在的位置)。均值和方差绿色部分将需要更新。

例如之前提到的速度运动模型,可以有下面的预测 
这里写图片描述 
相对应3+2n的维度上有: 
这里写图片描述 
然后对于Gt有,因为移动还只是更新了位置,所以只需要更新均值的前三个变量x,y , 角度即可,方差更新左上角的3*3矩阵。 
这里写图片描述 
Gxt的推导: 
这里写图片描述 
Measurement prediction and measurement

此时根据观测模型估计看到的landmark 
这里写图片描述 
然后根据传感器去观测真实的landmark 
这里写图片描述 
即: 
这里写图片描述 
**至此EKF的2,3步的prediction过程就完成了 
总结一下:(速度运动模型的EKF的prediction过程分为下面这5步)** 
这里写图片描述

  • Data associate

计算h(x)和z之间的差距,即预测的和实际测量中的误差。 
这里写图片描述

  • Update

然后更新整个估计矩阵: 
这里写图片描述 
可以看出,如果你的landmark非常多的时候,更新是非常耗时的。

例如: 
以激光为例,可以这样表示observations 
这里写图片描述 
uj为landmark的位置,ut为机器人的位置。

这里写图片描述 
第一个变量是机器人位置和landmark的距离, 
第二个变量是距离的平方, 
第三个变量是landmark的表示。

然后我们就需要计算Jacobian矩阵: 
这里写图片描述 
low指只考虑一个landmark的情况:这里写图片描述 
所以有: 
这里写图片描述 
这里写图片描述 
对应到高维,即只是更新了对应landmark的H 
这里写图片描述 
H和h求出来了,这样校正过程就完成了。

总结:(用激光的校正过程如下) 
这里写图片描述 
这里写图片描述


### SLAM中的EKF推导过程解释 #### 定义状态向量和观测模型 在SLAM(同步定位与地图构建)问题中,通常采用的状态向量$\mathbf{x}_k$不仅包含了机器人自身的位姿$(x, y, \theta)$,还可能包括环境中特征点的位置。对于时间步$k$,假设机器人的位置由$x_k,y_k,\theta_k$表示,则有: $$\mathbf{x}_k=\left[\begin{array}{c}x_{k}\\y_{k}\\\theta_{k}\end{array}\right]\tag{1}[^1]$$ 当考虑$m$个路标时,整个系统的状态可以写成如下形式: $$\mathbf{s}_{k}= [\mathbf{x}_{k}; l_1; ... ;l_m]^T\tag{2}$$ 其中$l_i=[x_i;y_i]$代表第$i$个路标的坐标。 #### 预测阶段 预测步骤基于运动学方程来估计下一时刻的状态。设控制输入为$\mathbf{u}$,则新的状态可以通过非线性函数$f(\cdot)$得到近似值: $$\hat{\mathbf{s}}^-_{k+1}=f(\mathbf{s}_k,\mathbf{u})+\mathcal{N}(0,Q)\tag{3}$$ 这里加入了高斯噪声项以模拟不确定性的影响;协方差矩阵更新公式为: $$P^{-}_{k+1}=F P_k F^T + Q\tag{4}$$ 这里的$F$是雅可比矩阵,它描述了当前状态下微小变化对下一次预测结果的影响程度;而$Q$则是过程噪音的协方差矩阵。 #### 更新/校正阶段 一旦获得传感器测量数据$\mathbf{z}$,就可以利用这些信息修正之前的预测。如果已知某个特定路标$j$被观察到,则对应的测量模型$h_j()$定义如下: $$h_j(s)=\sqrt{(s_x-l_{j,x})^{2}+(s_y-l_{j,y})^{2}}, s=(s_x,s_y), j=1,...m\tag{5}$$ 这给出了从当前位置到该路标之间的距离。为了计算卡尔曼增益并调整状态估计,还需要求解另一个雅克比矩阵$H$以及残差$r$: $$K=P H^T (HPH^T + R)^{-1}, r=z-h(x)\tag{6}$$ 最终通过下面两个表达式完成状态及其不确定性的更新: $$\mathbf{s}_{k+1}=\mathbf{s}^-_{k+1}+Kr\\ P_{k+1}=(I-KH)P^-_{k+1}\tag{7}$$ ```matlab function ekf_slam_step(state, control_input, measurements) % Prediction step predicted_state = f(state, control_input); % Update prediction uncertainty F = compute_jacobian_f(state); % Jacobian of motion model w.r.t state pred_covariance = F * prev_covariance * F' + process_noise; % For each measurement... for i = 1:length(measurements) z = measurements(i).range; landmark_id = measurements(i).landmark_id; h = predict_measurement(predicted_state, landmarks(landmark_id)); H = compute_jacobian_h(predicted_state, landmarks(landmark_id)); K = pred_covariance * H' / (H * pred_covariance * H' + sensor_noise); residual = z - h; corrected_state = predicted_state + K * residual; updated_covariance = (eye(size(pred_covariance)) - K*H)*pred_covariance; % Save or update the new state estimate and covariance here. end end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值