5

我设计了一个四元数扩展卡尔曼滤波器,用于融合陀螺仪和加速度计数据。估计图的形状似乎很完美,但估计似乎不断收敛到错误的解决方案。这仅仅是因为我没有使用像线性卡尔曼滤波器这样的最佳估计器,还是应该可以使用 EKF 获得无偏估计?到目前为止,我已经使用了两种不同的实现,并且两次都遇到了同样的问题。

这是滤波器输出的图:在此处输入图像描述

  • 绿色:仅从加速度计估计的角度
  • 蓝色:集成陀螺仪输出
  • 红色:线性 KF 输出
  • 青色:EKF输出,注意偏移

这是一次迭代的matlab代码:

function [ q, wb ] = EKF2( a,w,dt )


persistent x P;

% Tuning paramaters
Q = [0, 0, 0, 0, 0, 0, 0;
    0, 0, 0, 0, 0, 0, 0;
    0, 0, 0, 0, 0, 0, 0;
    0, 0, 0, 0, 0, 0, 0;
    0, 0, 0, 0, 0.01, 0, 0;
    0, 0, 0, 0, 0, 0.01, 0;
    0, 0, 0, 0, 0, 0, 0.01];

R = [1000000,    0,    0;
        0, 1000000,    0;
        0,    0, 1000000;];

if isempty(P)    
    P = eye(length(Q))*10000; %Large uncertainty of initial values
    x = [1, 0, 0, 0, 0, 0, 0]';
end

q0 = x(1);
q1 = x(2);
q2 = x(3);
q3 = x(4);
wxb = x(5);
wyb = x(6);
wzb = x(7);
wx = w(1);
wy = w(2);
wz = w(3);

z(1) = a(1);
z(2) = a(2);
z(3) = a(3);
z=z';

% Populate F jacobian
F = [              1,  (dt/2)*(wx-wxb),  (dt/2)*(wy-wyb),  (dt/2)*(wz-wzb), -(dt/2)*q1, -(dt/2)*q2, -(dt/2)*q3;
    -(dt/2)*(wx-wxb),                1,  (dt/2)*(wz-wzb), -(dt/2)*(wy-wyb),  (dt/2)*q0,  (dt/2)*q3, -(dt/2)*q2;
    -(dt/2)*(wy-wyb), -(dt/2)*(wz-wzb),                1,  (dt/2)*(wx-wxb), -(dt/2)*q3,  (dt/2)*q0,  (dt/2)*q1;
    -(dt/2)*(wz-wzb),  (dt/2)*(wy-wyb), -(dt/2)*(wx-wxb),                1,  (dt/2)*q2, -(dt/2)*q1,  (dt/2)*q0;
                   0,                0,                0,                0,          1,          0,          0;
                   0,                0,                0,                0,          0,          1,          0;
                   0,                0,                0,                0,          0,          0,          1;];

%%%%%%%%% PREDICT %%%%%%%%%
%Predicted state estimate
% x = f(x,u)
x = [q0 - (dt/2) * (-q1*(wx-wxb) - q2*(wy-wyb) - q3*(wz-wzb));
     q1 - (dt/2) * ( q0*(wx-wxb) + q3*(wy-wyb) - q2*(wx-wzb));
     q2 - (dt/2) * (-q3*(wx-wxb) + q0*(wy-wyb) + q1*(wz-wzb));
     q3 - (dt/2) * ( q2*(wx-wxb) - q1*(wy-wyb) + q0*(wz-wzb));
     wxb;
     wyb;
     wzb;];

% Re-normalize Quaternion
qnorm = sqrt(x(1)^2 + x(2)^2 + x(3)^2 + x(4)^2);
x(1) = x(1)/qnorm;
x(2) = x(2)/qnorm;
x(3) = x(3)/qnorm;
x(4) = x(4)/qnorm;

q0 = x(1);
q1 = x(2);
q2 = x(3);
q3 = x(4);

% Predicted covariance estimate
P = F*P*F' + Q;


%%%%%%%%%% UPDATE %%%%%%%%%%%
% Normalize Acc and Mag measurements
acc_norm = sqrt(z(1)^2 + z(2)^2 + z(3)^2);
z(1) = z(1)/acc_norm;
z(2) = z(2)/acc_norm;
z(3) = z(3)/acc_norm;

h = [-2*(q1*q3 - q0*q2);
     -2*(q2*q3 + q0*q1);
     -q0^2 + q1^2 + q2^2 - q3^2;];

%Measurement residual
% y = z - h(x), where h(x) is the matrix that maps the state onto the measurement
y = z - h;


% The H matrix maps the measurement to the states
H = [ 2*q2, -2*q3,  2*q0, -2*q1, 0, 0, 0;
     -2*q1, -2*q0, -2*q3, -2*q2, 0, 0, 0;
     -2*q0,  2*q1,  2*q2, -2*q3, 0, 0, 0;];

% Measurement covariance update
S = H*P*H' + R;

% Calculate Kalman gain
K = P*H'/S;

% Corrected model prediction
x = x + K*y;      % Output state vector

% Re-normalize Quaternion
qnorm = sqrt(x(1)^2 + x(2)^2 + x(3)^2 + x(4)^2);
x(1) = x(1)/qnorm;
x(2) = x(2)/qnorm;
x(3) = x(3)/qnorm;
x(4) = x(4)/qnorm;


% Update state covariance with new knowledge
I = eye(length(P));
P = (I - K*H)*P;  % Output state covariance

q = [x(1), x(2), x(3), x(4)];
wb = [x(5), x(6), x(7)];

end
4

5 回答 5

2

您所描述的问题据说是 EKF 的主要缺点之一。它不保证任何收敛到实际值。如果您想继续使用它:

  • 尝试增加系统噪声Q和/或测量噪声R (可以解释为“将非线性放入噪声中”)。这也使得线性 KF 在非线性问题上表现更好
  • 要判断您的表现如何,请在您的估计周围绘制 2-sigma-band 以查看您的实际价值是否在其中(否则您的噪声太小)。

Unscented Kalman 滤波器以在处理非线性方面比 EKF 更稳健而著称。实现复杂度与EKF大致相同。

于 2013-03-13T15:25:56.253 回答
1

我不是卡尔曼滤波方面的专家,但我认为静态误差是通过陀螺仪/加速度测量可以获得的最佳结果。在我之前的实验室中,他们将惯性测量与 GPS 融合在一起进行重新校准。

于 2013-03-12T11:56:24.870 回答
1

我刚刚试过你的算法,它工作得很好。为了避免滤波器的输出跟随漂移的积分角速率,您需要减小测量噪声的方差值。我尝试使用 100 而不是 1000000 的值。这样你告诉过滤器“信任”更多的观察结果,因此角度估计不会发散。

我还实现了一个脚本,该脚本使用外部角度参考来优化修复参数(过程噪声和测量噪声的方差)。这样更容易限制它们的值。

同样重要的是要注意 R 和 Q 的值将取决于运动的强度,即“破坏”加速度计估计的线性加速度的量。为了提高估计的精度,我实现了一个强度检测器,它根据运动的强度为每个样本改变 R 和 Q 的值。如果您有兴趣,请通过以下方式与我联系:alberto.olivares (gmail.com),我很乐意将其发送给您(或任何其他感兴趣的人)。

于 2013-05-15T08:26:28.210 回答
1

目前,我正在测试EKF和性能,以使用四元数形式的Complementary Filter传感器融合 ( gyro, acc, ) 估计姿态。mag最终的范围是获得不同的速度估计。目前我有一个非线性互补滤波器,它可以很好地估计姿态,然后我减去重力并积分得到速度。它在短时间内工作正常。

将此代码作为我的代码,并认为我的测量输出EKF是加速度计读数,其中惯性加速度不可忽略。因此,我预测的输出矩阵“ h”是 的结果z = T*acc,其中T是从传感器到本地框架的变换矩阵,acc是受重力影响的加速度计读数。假设几乎没有偏航旋转,而只是<90deg围绕俯仰和横滚的显着部分旋转( )。

我自己无法解释的是,EKF如果我认为惯性加速度可以忽略不计,那么它的性能会比我认为测量到显着的惯性加速度时要好。由于我想观察运动,我需要考虑惯性加速度。

于 2013-10-10T15:39:00.320 回答
0

一些人与我联系过,他们遇到了与第一篇文章中所述类似的问题。我想包含一个我的 Github 存储库,您可以在其中找到一个完整的库来使用 MIMU 估计方向。

包括的方法是:加速度和磁场投影(这只是为了说明为什么需要融合)、常规卡尔曼滤波器、扩展卡尔曼滤波器、门控卡尔曼滤波器和门控扩展卡尔曼滤波器。

您还将找到一篇解释该过程的论文以及我在会议中使用的幻灯片。

一切都经过了彻底的评论,所以我希望你能够理解每一步都做了什么。

如果您对此有任何疑问,请告诉我。

https://github.com/aolivares/inmed2014

干杯!

于 2015-03-09T11:31:07.523 回答