卡尔曼滤波器学习理解

参考matlab官方讲解https://www.zhihu.com/question/23971601/answer/839664224

0.简明扼要的理解

这里的更新状态协方差矩阵P,测量噪声R,过程噪声Q初始值是怎么确定的尚不理解
在这里插入图片描述
在这里插入图片描述

代码如下

# 卡尔曼滤波预测类,用于预测 UAV 的位置和速度
# 测量值y只有位置,如[px, py, pz]
# 状态值x有位置和速度,如[px, py, pz, vx, vy, vz]
class KalmanFilterPredictor:
    def __init__(self, dt, process_noise=0.01, measurement_noise=5):
        self.x = None  # 初始状态(位置和速度)

        # 状态转移矩阵
        self.F = np.array([[1, 0, 0, dt, 0, 0],
                           [0, 1, 0, 0, dt, 0],
                           [0, 0, 1, 0, 0, dt],
                           [0, 0, 0, 1, 0, 0],
                           [0, 0, 0, 0, 1, 0],
                           [0, 0, 0, 0, 0, 1]], dtype=float)

        # 测量矩阵
        self.H = np.array([[1, 0, 0, 0, 0, 0],
                           [0, 1, 0, 0, 0, 0],
                           [0, 0, 1, 0, 0, 0]], dtype=float)

        # 初始状态协方差矩阵
        self.P = np.eye(6) * 1000

        # 测量噪声协方差矩阵
        self.R = np.eye(3) * measurement_noise

        # 过程噪声协方差矩阵
        self.Q = np.eye(6) * process_noise

        # 存储滤波后的位置和速度
        self.filtered_positions = []
        self.filtered_velocities = []

    def initialize_state(self, initial_position):
        # 初始化状态向量
        self.x = np.array([initial_position[0], initial_position[1], initial_position[2], 0, 0, 0], dtype=float)

    def predict(self, z, dt):
        # 更新时间间隔
        self.F[0, 3] = dt
        self.F[1, 4] = dt
        self.F[2, 5] = dt
        
        # 预测步骤
        self.x = np.dot(self.F, self.x)
        self.P = np.dot(np.dot(self.F, self.P), self.F.T) + self.Q

        # 测量更新步骤
        y = np.array(z) - np.dot(self.H, self.x)
        S = np.dot(np.dot(self.H, self.P), self.H.T) + self.R
        K = np.dot(np.dot(self.P, self.H.T), np.linalg.inv(S))
        self.x = self.x + np.dot(K, y)
        self.P = np.dot((np.eye(6) - np.dot(K, self.H)), self.P)

        # 存储结果
        self.filtered_positions.append((self.x[0], self.x[1], self.x[2]))
        self.filtered_velocities.append((self.x[3], self.x[4], self.x[5]))

1、卡尔曼滤波器

卡尔曼滤波器针对线性系统,可以解决基本的两种问题
(1)未知状态估计——状态观察器
(2)多状态估计最佳状态——最佳状态估计器

(1)状态观察器

作用:卡尔曼滤波器可以估计不能测量的状态
应用:火箭燃料内部测温

通过数学建模得到的测量值的估计值测量值的误差来调整模型,从而得到较为准确的不可测量的估计值
在这里插入图片描述

数学建模和推导过程如下
在这里插入图片描述
x^为估计值;x·为倒数;u为系统输入;y为测量值
e为真实值和估计值的误差,是关于t的指数函数,证明错误会随着时间收敛,KC决定收敛速度

以上例子x为中间不可测量状态,y为可以测量状态,另外,当C=1时,可以演变为以下例子,也就是最佳状态估计器

(2)最佳状态估计器

作用:卡尔曼滤波器可以根据多个状态调整更精确的状态
应用:汽车GPS和里程计估计位置问题
在这里插入图片描述

y为测量值(GPS测量);w为风产生的过程误差;v为GPS产生的随机误差(w和v都满足正态分布)
在这里插入图片描述
前半部分为先验估计;后半部分加上测量值的估计为后验估计
在这里插入图片描述
P为误差协方差,来自过程误差和预估值的不确定性
P- x-(-表示调整前)
在这里插入图片描述
测量值(y)可靠,则测量值对x^贡献更大(测量值相当于GPS测量位置)
预估值(x^ - )可靠,则预估值对x^贡献更大(预估值相当于里程计测量位置)
因此卡尔曼滤波器又称为传感器融合算法

2、扩展卡尔曼滤波器

(1)扩展卡尔曼滤波器——EKF

扩展卡尔曼滤波器针对非线性系统
在这里插入图片描述

它将非线性函数在当前估算状态的平均值附近进行线性化,在每个时间端都进行线性化,然后将得到的雅可比矩阵用于预测和更新卡尔曼滤波器算法的状态
在这里插入图片描述

(2)无迹卡尔曼滤波器——UKF

非线性函数并不能通过线性函数很好的近似,UKF近似概率分布
在这里插入图片描述

(3)粒子滤波器——PF

非线性系统、非高斯分布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值