使用 'ss' 在 MATLAB 中实现卡尔曼滤波器

Posted

技术标签:

【中文标题】使用 \'ss\' 在 MATLAB 中实现卡尔曼滤波器【英文标题】:Implementing a Kalman Filter in MATLAB using 'ss'使用 'ss' 在 MATLAB 中实现卡尔曼滤波器 【发布时间】:2014-09-11 07:58:10 【问题描述】:

我正在尝试实现卡尔曼滤波器来估计振荡器的状态“x”(位移和速度)。代码如下,应该很容易理解。

clear; clc; close all;
% io = csvread('sim.csv');
% u = io(:, 1);
% y = io(:, 2);
% clear io;

% Estimation of state of a single degree-of-freedom oscillator using
%   the Kalman filter
% x[n + 1] = A x[n] + B u[n] + w[n]
% y[n] = C x[n] + D u[n] + v[n]

% Here, x[n] is 2 x 1, u[n] is 1 x 1
% A is 2 x 2, B is 2 x 1, C is 1 x 2, D is 1 x 1

%% Code begins here
N = 1000;
u = randn(N, 1); % Synthetic input
y = randn(N, 1); % Synthetic output

%% Definitions
dt = 0.005;    % Time step in seconds
T = 1.50;     % Oscillator period
zeta = 0.05;   % Damping ratio

sv0 = max(abs(u)) * dt;
sd0 = sv0 * dt;
Q = [sd0 ^ 2 0.0; 0.0 sv0 ^ 2]; % Prediction error covariance matrix
smeas = 0.001 * max(abs(u));
R = smeas ^ 2;                  % Measurement error (co)variance scalar

wn = 2. * pi / Ts;

c = 2.0 * zeta * wn;
k = wn ^ 2;

A = [0. 1.; -k -c];
Ad = expm(A * dt);
Bd = A \ (Ad - eye(2));
Bd = Bd(:, 2);
C = [-k -c];
D = -1.0;

%% State-space model and Kalman filter
sys = ss(Ad, Bd, C, D, dt, 'inputname', 'u', 'outputname', 'y');
[kest,L,P] = kalman(sys, Q, R, []);

这是我的问题。我收到错误消息:'在“kalman(SYS,QN,RN,NN,...)”命令中,QN 必须是最多 1 行的实方阵。'。

我认为 QN = Q = const 应该是 2 x 2,但它要求一个标量。也许我不明白 MATLAB 的“卡尔曼”帮助描述中 Q 和 QN 之间的区别。有什么见解吗?

谢谢。

【问题讨论】:

如果您阅读doc kalman,您会看到与 w 相关的附加矩阵 G (其中 Q 是协方差矩阵)。不幸的是,它没有描述如何设置它。通常我自己实现过滤器,因为我发现它更容易(有关可用代码,请参阅`docsearch“时变卡尔曼过滤器”`) 谢谢,但我的观察也取决于控制输入(即矩阵 D 在我的情况下非零)。 另外,我有点担心数值稳定性和问题,我认为 MATLAB 的“卡尔曼”有花里胡哨的功能。 就个人而言,我只会担心一旦你进入它。无论如何kalman 只是一个脚本 - 所以edit kalman 会告诉你它的所有代码。这可能有助于您找到 G 和 Q 的外观。 好点。我会尝试这样做。 【参考方案1】:

MATLAB 假设过程噪声只是一个随机变量,而不是像 Q 所代表的两个。

所以你必须像这样将 G 和 H 矩阵添加到你的系统中:

G = eye(2);
H = [0,0];
sys = ss(Ad, [Bd, G], C, [D, H], dt, 'inputname', 'u', 'outputname', 'y');

提醒一下,使用 MATLAB 的语法:

x*=Ax+Bu+Gw

y=Cx+Du+Hw+v

【讨论】:

以上是关于使用 'ss' 在 MATLAB 中实现卡尔曼滤波器的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV Java 中实现卡尔曼滤波器

卡尔曼滤波器中预测矩阵和测量协方差矩阵之间的混淆

matlab中实现Gabor滤波器

语音去噪基于matlab谱减法+维纳滤波+卡尔曼滤波语音去噪含Matlab源码 1881期

滤波跟踪基于EKFUPFPFEPFUPF多种卡尔曼滤波实现航迹滤波跟踪matlab源码

滤波跟踪基于EKFUPFPFEPFUPF多种卡尔曼滤波实现航迹滤波跟踪matlab源码