卡尔曼滤波实战

入门内容

假如有个超声波,它传回的数据是这样的,这样的数据是用不了的

我们想要的是稳定的数据

此时我们引入滤波,把里面的噪声去掉,使得数据更平滑

适用系统:

符合两个特质:线性和高斯。 也叫线性高斯系统

什么是线性?

满足两个特性:叠加性和齐次性

叠加型:

假如有两个输入,最后得到一个输出

等价于,总输出是y,由另外两个输出合起来,两个输出对应的输入是x1和x2

那么从方程理解

齐次性:

x增大k倍,y也增大k倍

高斯:

噪声满足正态分布

正态分布就是假如均值为零,它的方差对应着sigma

从宏观来看,卡尔曼滤波就是加权

理想状态: 信号 x 1 + 噪声 x 0

从信号处理的角度来看,类比于低通滤波,低频信号权值为1,高频噪声取值为0

卡尔曼滤波就是有一个估计值和观测值,让你选择它们的权重,融合在一起就是最佳的修正值

进阶内容

状态空间表达式

状态方程

x是状态值,k是当前,k-1是上一个时刻状态,u为输入,w是过程造成(也叫误差)

观测方程

y是观察量,v是观测噪声(传感器自身的误差)

高斯分布

均值和方差

参数分析

主要就是调Q和R

卡尔曼直观图解

最优估计值也叫修正值或者后验估计值

这个是上一时刻的最优估计值,就是卡尔曼滤波最终输出的值

先验估计值

这个值是基于上一时刻的最优估计值估计出来的一个当前估计值

当前时刻的观测值,也就是传感器直接测量出来的值

缺一个值,就是当前时刻的最优估计值。大概在这里

滤波次数过多的时候就会趋于一个稳定状态,它的方差自然会越来越小好

当前估计值与当前观测值的交集

卡尔曼公式理解:

实现过程:用上一次的最优结果预测当前的值

同时使用观测值修正当前值,得到最优结果

python 复制代码
import numpy as np

def kalman_filter(observed_data, initial_state_estimate, initial_covariance_estimate, transition_matrix, observation_matrix, process_noise_covariance, observation_noise_covariance):
    # 初始化变量
    state_estimate = initial_state_estimate  # 状态估计
    covariance_estimate = initial_covariance_estimate  # 协方差估计
    
    # 遍历观测数据
    for observation in observed_data:
        # 预测步骤
        predicted_state_estimate = np.dot(transition_matrix, state_estimate)  # 预测状态估计
        predicted_covariance_estimate = np.dot(np.dot(transition_matrix, covariance_estimate), transition_matrix.T) + process_noise_covariance  # 预测协方差估计
        
        # 更新步骤
        innovation = observation - np.dot(observation_matrix, predicted_state_estimate)  # 创新
        innovation_covariance = np.dot(np.dot(observation_matrix, predicted_covariance_estimate), observation_matrix.T) + observation_noise_covariance  # 创新协方差
        kalman_gain = np.dot(np.dot(predicted_covariance_estimate, observation_matrix.T), np.linalg.inv(innovation_covariance))  # 卡尔曼增益
        
        state_estimate = predicted_state_estimate + np.dot(kalman_gain, innovation)  # 更新状态估计
        covariance_estimate = np.dot((np.eye(len(state_estimate)) - np.dot(kalman_gain, observation_matrix)), predicted_covariance_estimate)  # 更新协方差估计
    
    return state_estimate, covariance_estimate

# 示例用法
observed_data = np.array([1.2, 1.3, 1.4, 1.5])  # 观测测量
initial_state_estimate = np.array([1.0, 0.0])   # 初始状态猜测
initial_covariance_estimate = np.eye(2)         # 初始协方差猜测
transition_matrix = np.array([[1.0, 1.0], [0.0, 1.0]])  # 状态转移矩阵
observation_matrix = np.array([[1.0, 0.0]])      # 观测矩阵
process_noise_covariance = np.eye(2) * 0.01      # 过程噪声协方差
observation_noise_covariance = np.array([[0.1]]) # 观测噪声协方差

state_estimate, covariance_estimate = kalman_filter(observed_data, initial_state_estimate, initial_covariance_estimate, transition_matrix, observation_matrix, process_noise_covariance, observation_noise_covariance)

print("最终状态估计:", state_estimate)
print("最终协方差估计:", covariance_estimate)
相关推荐
kingmax54212008几秒前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧6 分钟前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z1 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹1 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
机器学习之心2 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
AL流云。2 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法
qq_429879673 小时前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码4 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习4 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
yzx9910135 小时前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn