卡尔曼滤波推导过程

卡尔曼滤波在机器人定位,SLAM等方面需要用到,公式自己推一遍能更加深入理解。这个是基于线性系统的基本公式,实际应用中需要把非线性系统通过泰勒公式求导展开近似线性化。

 

 

总结:

### 卡尔曼滤波数学推导过程及公式详解 卡尔曼滤波是一种用于处理含噪声数据的递归算法,其核心目标是在存在不确定性的情况下提供系统的最优状态估计。以下是卡尔曼滤波的核心数学推导过程以及公式的详细说明。 #### 一、基本假设与模型描述 卡尔曼滤波适用于线性动态系统,该系统可以用如下两个方程表示: 1. **状态转移方程** 描述系统状态如何随时间变化: $$ x_k = F_{k-1}x_{k-1} + B_{k-1}u_{k-1} + w_{k-1} $$ 其中: - \(x_k\) 是第 \(k\) 步的状态向量; - \(F_{k-1}\) 是状态转移矩阵; - \(B_{k-1}\) 是控制输入矩阵; - \(u_{k-1}\) 是已知的控制变量; - \(w_{k-1}\) 是过程噪声,通常假定为均值为零的高斯白噪声,协方差矩阵为 \(Q_{k-1}\)[^1]。 2. **测量方程** 表示观测值与实际状态之间的关系: $$ z_k = H_kx_k + v_k $$ 其中: - \(z_k\) 是第 \(k\) 步的测量值; - \(H_k\) 是观测矩阵; - \(v_k\) 是测量噪声,同样假定为均值为零的高斯白噪声,协方差矩阵为 \(R_k\)。 --- #### 二、贝叶斯框架下的最优估计准则 为了得到最优状态估计,卡尔曼滤波基于最小化误差平方和的原则,具体来说就是使后验概率分布的最大似然达到最大。这一原则可以通过贝叶斯公式来表达[^2]: $$ p(x_k|Z_k) \propto p(z_k|x_k)p(x_k|Z_{k-1}) $$ 其中: - \(p(x_k|Z_k)\) 是给定所有测量值后的后验概率密度函数; - \(p(z_k|x_k)\) 是测量条件概率; - \(p(x_k|Z_{k-1})\) 是先验概率密度函数。 通过最大化后验概率,可以得出最优状态估计。 --- #### 三、卡尔曼增益计算 卡尔曼增益 \(K_k\) 的作用在于平衡预测值与测量值的影响。它由以下公式定义: $$ K_k = P_k^-H_k^T(H_kP_k^-H_k^T + R_k)^{-1} $$ 其中: - \(P_k^-\) 是先验估计误差协方差矩阵; - \(H_k\) 是观测矩阵; - \(R_k\) 是测量噪声协方差矩阵。 卡尔曼增益的作用是调整预测值与测量值的比例,从而获得更精确的状态估计[^3]。 --- #### 四、卡尔曼滤波五大公式总结 卡尔曼滤波的主要步骤可以归纳为五个公式: 1. **状态预测** 利用上一步的状态估计值进行当前步的预测: $$ \hat{x}_k^- = F_{k-1}\hat{x}_{k-1} + B_{k-1}u_{k-1} $$ 2. **误差协方差预测** 预测误差协方差矩阵: $$ P_k^- = F_{k-1}P_{k-1}F_{k-1}^T + Q_{k-1} $$ 3. **卡尔曼增益更新** 计算卡尔曼增益以优化估计: $$ K_k = P_k^-H_k^T(H_kP_k^-H_k^T + R_k)^{-1} $$ 4. **状态更新** 结合测量值修正预测值: $$ \hat{x}_k = \hat{x}_k^- + K_k(z_k - H_k\hat{x}_k^-) $$ 5. **误差协方差更新** 更新误差协方差矩阵: $$ P_k = (I - K_kH_k)P_k^- $$ 这些公式共同构成了卡尔曼滤波的核心逻辑。 --- #### 五、代码实现示例 以下是一个简单的卡尔曼滤波器 Python 实现示例: ```python import numpy as np class KalmanFilter: def __init__(self, A, B, H, Q, R, x0, P0): self.A = A # 状态转移矩阵 self.B = B # 控制输入矩阵 self.H = H # 观测矩阵 self.Q = Q # 过程噪声协方差 self.R = R # 测量噪声协方差 self.x_hat = x0 # 初始状态估计 self.P = P0 # 初始误差协方差 def predict(self, u=None): if u is None: u = 0 self.x_hat = self.A @ self.x_hat + self.B @ u self.P = self.A @ self.P @ self.A.T + self.Q def update(self, z): y = z - self.H @ self.x_hat S = self.H @ self.P @ self.H.T + self.R K = self.P @ self.H.T @ np.linalg.inv(S) self.x_hat = self.x_hat + K @ y I = np.eye(K.shape[0]) self.P = (I - K @ self.H) @ self.P ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值