扩展卡尔曼滤波算法——基本原理(附MATLAB程序)
创作时间:
作者:
@小白创作中心
扩展卡尔曼滤波算法——基本原理(附MATLAB程序)
引用
CSDN
1.
https://blog.csdn.net/qq_35623594/article/details/141278449
扩展卡尔曼滤波(Extended Kalman Filter, EKF)是卡尔曼滤波(Kalman Filter, KF)的一个扩展,主要用于处理非线性系统中的状态估计问题。下面是对扩展卡尔曼滤波的详细介绍:
1. 基本概念
卡尔曼滤波是一种递归的滤波算法,用于估计线性动态系统的状态。然而,许多实际系统是非线性的,因此需要扩展卡尔曼滤波来处理这种情况。
2. 非线性系统的挑战
在非线性系统中,状态转移方程和观测方程通常是非线性的。标准的卡尔曼滤波假设这些方程是线性的,因此它不能直接用于非线性系统。扩展卡尔曼滤波通过线性化这些非线性方程来解决这个问题。
3. 算法步骤
3.1 预测步骤
在每个时间步,EKF首先通过状态转移方程来预测当前时刻的状态和协方差矩阵。
状态预测:
其中,
- $\hat{x}_{k|k-1}$ 是状态的预测值,
- $f$ 是非线性的状态转移函数,
- $u_k$ 是控制输入。
协方差预测:
其中,
- $P_{k|k-1}$ 是状态协方差矩阵的预测值,
- $F_k$ 是状态转移函数$f$关于状态的雅可比矩阵,
- $Q_k$ 是过程噪声协方差矩阵。
3.2 更新步骤
然后,根据观测值来更新状态和协方差矩阵。
计算卡尔曼增益:
其中,
- $K_k$ 是卡尔曼增益,
- $H_k$ 是观测函数$h$关于状态的雅可比矩阵,
- $R_k$ 是观测噪声协方差矩阵。
更新状态估计:
其中,
- $\hat{x}_k$ 是更新后的状态估计值,
- $z_k$ 是实际观测值,
- $h$ 是非线性的观测函数。
更新协方差矩阵:
其中,$I$ 是单位矩阵。
4. 关键点
- 线性化:EKF通过计算非线性函数的雅可比矩阵来近似线性化状态转移和观测方程。这是EKF的核心,也是其处理非线性问题的关键。
- 计算复杂性:EKF的计算复杂性相较于线性卡尔曼滤波更高,特别是在状态和观测维度较大时,因为需要计算雅可比矩阵并进行矩阵运算。
5. 应用
扩展卡尔曼滤波广泛应用于机器人定位、航天飞行、自动驾驶、无人机导航等需要处理非线性系统状态估计的领域。
6. MATLAB仿真程序
1. 设置系统模型
% 系统参数
n = 4; % 状态维度
m = 2; % 观测维度
% 初始状态
x0 = [0; 0; 1; 1]; % [位置x, 速度x, 位置y, 速度y]
P0 = eye(n); % 初始协方差矩阵
% 系统噪声和观测噪声
Q = 0.1 * eye(n); % 过程噪声协方差
R = 0.1 * eye(m); % 观测噪声协方差
% 时间参数
dt = 0.1; % 时间步长
T = 10; % 总时间
time = 0:dt:T; % 时间向量
% 初始化
x_est = zeros(n, length(time)); % 状态估计
x_true = zeros(n, length(time)); % 真实状态
y_meas = zeros(m, length(time)); % 观测数据
% 初始状态
x_true(:,1) = x0;
% 生成真实状态和观测数据
for t = 2:length(time)
% 状态转移
x_true(:,t) = [x_true(1,t-1) + x_true(3,t-1)*dt + 0.5*randn; % x位置
x_true(2,t-1) + randn; % x速度
x_true(3,t-1) + x_true(4,t-1)*dt + 0.5*randn; % y位置
x_true(4,t-1) + randn]; % y速度
% 生成观测数据
y_meas(:,t) = [x_true(1,t)^2; x_true(3,t)^2] + sqrt(R) * randn(m,1);
end
2. 扩展卡尔曼滤波器实现
% 初始化
x = x0; % 初始状态估计
P = P0; % 初始协方差矩阵
% 扩展卡尔曼滤波器
for t = 2:length(time)
% 状态转移函数
f = @(x) [x(1) + x(3)*dt + 0.5*randn; % x位置
x(2) + randn; % x速度
x(3) + x(4)*dt + 0.5*randn; % y位置
x(4) + randn]; % y速度
% 观测函数
h = @(x) [x(1)^2; x(3)^2];
% 计算雅可比矩阵
F = eye(n) + [0, 0, dt, 0; % 状态转移的雅可比矩阵
0, 1, 0, 0;
0, 0, 0, dt;
0, 0, 0, 1];
H = [2*x(1), 0, 0, 0; % 观测函数的雅可比矩阵
0, 0, 2*x(3), 0];
% 预测步骤
x_pred = f(x); % 预测状态
P_pred = F * P * F' + Q; % 预测协方差矩阵
% 更新步骤
y_pred = h(x_pred); % 预测观测
K = P_pred * H' / (H * P_pred * H' + R); % 卡尔曼增益
x = x_pred + K * (y_meas(:,t) - y_pred); % 更新状态估计
P = (eye(n) - K * H) * P_pred; % 更新协方差矩阵
% 记录状态估计
x_est(:,t) = x;
end
3. 绘制结果
% 绘制真实状态、观测数据和估计状态
figure;
subplot(2,1,1);
plot(time, x_true(1,:), 'g', time, x_est(1,:), 'b--');
legend('True Position X', 'Estimated Position X');
xlabel('Time (s)');
ylabel('Position X');
subplot(2,1,2);
plot(time, x_true(3,:), 'g', time, x_est(3,:), 'b--');
legend('True Position Y', 'Estimated Position Y');
xlabel('Time (s)');
ylabel('Position Y');
说明:
- 系统模型:
- $x_0$:初始状态。
- $P_0$:初始协方差矩阵。
- $Q$:过程噪声协方差矩阵。
- $R$:观测噪声协方差矩阵。
- $f$ 和 $h$:状态转移和观测函数。
- 扩展卡尔曼滤波器实现:
- 状态转移函数 $f$ 和观测函数 $h$:定义系统的非线性状态转移和观测模型。
- 雅可比矩阵 $F$ 和 $H$:线性化非线性模型,用于计算预测和更新步骤。
- 预测步骤:通过状态转移函数预测下一个状态。
- 更新步骤:利用观测数据更新状态估计和协方差矩阵。
- 结果绘制:
- 绘制真实状态和扩展卡尔曼滤波的状态估计,以便比较滤波器的效果。
热门推荐
交通事故案件数量及年度报告分析
Dent J:电子烟对口腔健康的影响研究
营养不良的诊断标准与方法
ChatGPT降智问题全解析:原因、检测与解决方案
凝神入气穴与凝神入炁穴:道教修炼中的两个关键概念
新时代爱国主义的内涵及表现
如何在简历模板网站上找到特定行业的模板?
郁钧剑南艺授课:为民族唱法摇旗呐喊
中国工程院潘云鹤院士:AI与医药卫生交叉融合,解密智能医药五大趋势
邮寄国际包裹时,什么时候会被征税?
南京北站,传来新进展!
预防中暑全攻略:症状识别、急救方法与预防措施
百合花的花语和象征寓意
广彩瓷烧制技艺传承人周承杰:广彩织金 师古创新
创新药王座易主!百济神州超车恒瑞背后的投资逻辑与产业链机会
外星人找到了?科学家在金星上发现2万座文明遗址,怎么回事?
亚龙湾旅游省钱攻略:更低成本游览亚龙湾全指南
外星文明即将入侵?研究者:暂时还不会
感冒姜汤葱根的正确熬法分享,驱寒保暖,缓解感冒不适
墙面开裂是什么原因造成的?(产生墙面裂缝的五种原因)
东川区:干热河谷的“果蔬天堂”从何而来?背后是沪滇协作一盘大棋
醒酒的方法有哪些
因公司违法员工辞职可以立刻走吗
站在“雪崩”边缘的阿斯利康会成为下一个GSK吗?
南沙至中山车程将缩短至20分钟
血常规检查各项目都代表什么意思
如何通过人才战略提升企业核心竞争力与可持续发展能力?
鲜红斑痣和血管瘤的区别
企业破产清算是否会影响公司的品牌价值
荣格八维测试 - 八种认知功能量表