[code]一阶卡尔曼滤波python实现

# 1阶kalman
KF_PARAMS_A = 1  # 变换矩阵
KF_PARAMS_B = 0  # 外部输入为0 控制矩阵
KF_PARAMS_U = 0  # 外部输入为0 控制向量
KF_PARAMS_W = 0  # 噪声
KF_PARAMS_V = 0  # 噪声
KF_PARAMS_H = 1  # 传感器数据变换矩阵
KF_PARAMS_Q = 0.01  # 外部环境的干扰
KF_PARAMS_R = 0.05  # 噪声协方差
KF_PARAMS_P = 1  # 误差协方差矩阵


class KalmanBase:
    def __init__(self):
        self.A = KF_PARAMS_A  # 状态转移矩阵
        self.B = KF_PARAMS_B  # 控制输入模型
        self.u = KF_PARAMS_U  # 外部输入为0 控制向量
        self.w = KF_PARAMS_W  # 高斯噪声
        self.v = KF_PARAMS_V  # 高斯噪声
        self.H = KF_PARAMS_H  # 观测矩阵
        self.Q = KF_PARAMS_Q  # 状态噪声协方差矩阵
        self.R = KF_PARAMS_R  # 观测噪声协方差矩阵
        self.P = KF_PARAMS_P  # 误差协方差矩阵

        self.K = float('nan')  # 卡尔曼增益 无需初始化
        self.z = float('nan')  # 这里无需初始化,每次使用kf_update之前需要输入观察值z
        self.x = float('nan')  # 观测值

    def init_x(self, x):
        self.x = x  # 预测值 初始化为估计值

    def get_x(self):
        return self.x

    def kf_update(self, z):
        # init z
        self.z = self.H * z
        # P_ = APA' + Q
        a1 = self.A * self.P
        P_ = a1 * self.A + self.Q  # 误差协方差预测
        # K = P_ * H' / inv(H * P_* H' + R)
        b1 = P_ * self.H
        b2 = self.H * b1 + self.R
        self.K = b1 / b2
        # x = x_ + K(z - Hx_)
        c1 = self.B * self.u
        x_ = self.A * self.x + c1  # 状态预测
        c3 = self.z - self.H * x_
        self.x = x_ + self.K * c3  # 更新校正
        # P = (I - KH)P_
        d1 = 1 - self.K * self.H
        self.P = d1 * P_  # 更新误差协方差


if __name__ == '__main__':
	kalman_filter_params = KalmanBase()
    for i in range(迭代长度):
        if i == 0:
            kalman_filter_params.init_x(x=初始值)  # 初始化
        else:
            kalman_filter_params.update(z=观测值)
        kf_params_record[i] = kalman_filter_params.get_x() # 记录结果 用于画图
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值