5

ジャイロスコープと加速度計のデータを融合するための四元数拡張カルマン フィルターを設計しました。推定プロットの形状は完璧に見えますが、推定は常に間違った解に収束しているようです。これは、線形カルマン フィルターのような最適な推定器を使用していないという事実によるものですか、それとも EKF を使用して偏りのない推定値を取得することは可能でしょうか? これまでに 2 つの異なる実装を使用しましたが、どちらも同じ問題に遭遇しました。

フィルター出力のプロットを次に示します。ここに画像の説明を入力

  • 緑: 加速度計のみから推定された角度
  • 青: 統合ジャイロスコープ出力
  • 赤:リニアKF出力
  • シアン: EKF 出力、オフセットに注意してください

1 回の反復の 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 の主な欠点の 1 つと言われています。実際の値への収束を保証するものではありません。使い続けたい場合:

  • Qシステム ノイズおよび/または測定ノイズを増やしてみてくださいR (「非線形性をノイズに入れる」と解釈できます)。これにより、非線形問題に対する線形 KF のパフォーマンスも向上します。
  • うまくいっているかどうかを判断するには、見積もりの​​周りに 2 シグマ バンドをプロットして、実際の値がその範囲内にあるかどうかを確認します (そうでない場合、ノイズが小さすぎます)。

Unscented Kalman フィルターは、EKF よりも非線形性を処理するのに堅牢であるという評判があります。実装の複雑さは EKF とほぼ同じです。

于 2013-03-13T15:25:56.253 に答える
1

私はあなたのアルゴリズムを試してみましたが、それは本当にうまくいきます。フィルターの出力が積分角速度のドリフトに追随するのを回避するには、測定ノイズの分散の値を減らす必要があります。1000000 の代わりに 100 の値を試してみました。このようにして、フィルターに観測を「信頼」するように指示するため、角度の推定値は発散しません。

また、外部角度基準を使用して修正パラメーター (プロセス ノイズと測定ノイズの分散) を最適化するスクリプトも実装しました。このようにして、それらの値をより簡単にバインドできます。

R と Q の値が動きの強度、つまり加速度計の推定値を「壊す」線形加速度の量に依存することに注意することも重要です。推定の精度を上げるために、モーションの強度に応じて R と Q の値をサンプルごとに変化させる強度検出器を実装しました。興味がある場合は、alberto.olivares (gmail.com) までご連絡ください。喜んであなた (または興味のある方) にお送りします。

于 2013-05-15T08:26:28.210 に答える
1

私はカルマン フィルター処理の専門家ではありませんが、ジャイロ/加速度の測定で得られる最善の誤差は静的誤差だと思います。私の以前の研究室では、慣性測定と GPS を融合させて再調整しました。

于 2013-03-12T11:56:24.870 に答える
1

EKF現在、と の両方の性能をテストして、クォータニオン形式のComplementary Filterセンサー フュージョン ( gyroacc、 ) を使用して姿勢を推定しています。mag最終的な範囲は、さまざまな速度推定値を取得することです。現時点では、姿勢を推定するのに適した非線形補完フィルターがあり、重力を差し引いて積分して速度を取得します。短い期間でうまくいきます。

このコードを私のものとして取り、私の測定された出力はEKF、慣性加速度が無視できない加速度計の読み取り値であると考えてください。したがって、予測出力行列 " h" は の結果ですz = T*acc。ここで、Tはセンサーからローカル フレームへの変換行列で、accは重力の影響を受ける加速度計の読み取り値です。ヨーの回転はほとんどなく、<90degピッチとロールの周りのかなりの部分的な回転 ( ) があると仮定します。

私が自分で説明できないことはEKF、慣性加速度を無視できると考える方が、かなりの慣性加速度が測定されていると考える場合よりもパフォーマンスが優れているということです。観測したい動きのために、慣性加速度を考慮する必要があります。

于 2013-10-10T15:39:00.320 に答える
0

最初の投稿で述べたのと同様の問題を抱えている何人かの人々から連絡がありました。MIMU を使用して方向を推定するための完全なライブラリが見つかる、私の Github リポジトリを含めたいと思います。

含まれる方法は次のとおりです: 加速度および磁場投影 (これは融合が必要な理由を示すためのものです)、通常のカルマン フィルター、拡張カルマン フィルター、ゲート カルマン フィルター、およびゲート拡張カルマン フィルター。

また、このプロセスを説明する論文と、この論文を発表した会議で使用したスライドも掲載されています。

すべてが徹底的にコメントされているので、各ステップで何が行われるかを理解できることを願っています.

ご不明な点がございましたらお知らせください。

https://github.com/aolivares/inmed2014

乾杯!

于 2015-03-09T11:31:07.523 に答える