卡尔曼滤波
一种用于估计系统状态的递归滤波器,通过融合传感器测量和系统模型,提供系统状态的最优估计。
Q和R是什么
在卡尔曼滤波中,Q和R分别表示过程噪声和测量噪声的协方差矩阵。
-
Q Q Q矩阵(过程噪声协方差矩阵)描述了系统模型中未建模的参数不确定性或外部扰动导致的随机变化。 Q Q Q矩阵的大小与状态向量的维度相同,它反映了状态方程中的过程噪声对状态演化的影响。通常, Q Q Q矩阵中的元素越大,表示过程噪声越大,系统状态的估计就越不确定。
-
R R R矩阵(测量噪声协方差矩阵)描述了测量噪声的不确定性。 R R R矩阵的大小与观测向量的维度相同,它反映了观测方程中的测量噪声对系统状态估计的影响。与 Q Q Q矩阵类似, R R R矩阵中的元素越大,表示测量噪声越大,系统状态的估计就越不确定。
在卡尔曼滤波中, Q Q Q和 R R R矩阵起到调整卡尔曼滤波性能的作用。如果对系统模型和传感器的噪声有更准确的了解,可以根据实际情况调整 Q Q Q和 R R R矩阵的值,以获得更精确的状态估计。
Q和R应该取什么?
正如上面所说,Q和R是衡量噪声大小的系数,不是设置噪声的系数,所以一味将其调小是不能让滤波误差降低的。
真正适合的Q和R应该是与实际系统相匹配的数字。
附一个KF的python的例程:
在以下是一个简单的卡尔曼滤波器的解析函数(仅用于演示目的):
import numpy as np
def kalman_filter(measurements, initial_state, initial_covariance, A, H, Q, R):
# 初始化
state = initial_state
covariance = initial_covariance
filtered_states = []
filtered_covariances = []
for measurement in measurements:
# 预测步骤
predicted_state = np.dot(A, state) # 状态预测
predicted_covariance = np.dot(np.dot(A, covariance), A.T) + Q # 协方差预测
# 更新步骤
innovation = measurement - np.dot(H, predicted_state) # 残差
innovation_covariance = np.dot(np.dot(H, predicted_covariance), H.T) + R # 残差协方差
kalman_gain = np.dot(np.dot(predicted_covariance, H.T), np.linalg.inv(innovation_covariance)) # 卡尔曼增益
state = predicted_state + np.dot(kalman_gain, innovation) # 更新状态
covariance = np.dot(np.eye(len(state)) - np.dot(kalman_gain, H), predicted_covariance) # 更新协方差
filtered_states.append(state)
filtered_covariances.append(covariance)
return filtered_states, filtered_covariances
解析函数接受以下参数:
measurements
:测量值的序列initial_state
:初始状态向量initial_covariance
:初始协方差矩阵A
:状态转移矩阵H
:观测矩阵Q
:过程噪声协方差矩阵R
:测量噪声协方差矩阵
该函数将返回滤波后的状态序列和协方差矩阵序列。