位置と速度のカルマンフィルター:速度推定の導入


24

昨日私のクエリにコメント/回答を投稿してくれたすべての人に感謝します(位置、速度、加速度のカルマンフィルターの実装)。私は、(a)の両方で推奨されていたものを見て、特にしてきた1次元位置と速度にWikipediaの例をしても同じようなことを考えて、別のウェブサイト

アップデート2013年4月26日:ここでの元の質問には、1次元の位置と速度に関するウィキペディアの例を正しく理解していなかったという事実に関連するいくつかのエラーが含まれていまし。何が起こっているのかについての理解が深まったので、質問を書き直し、より厳密に焦点を合わせました。

上記の導入部の段落で参照する例は両方とも、測定されるのは位置のみであると想定しています。ただし、どちらの例にも速度の計算がありません。たとえば、Wikipediaの例では、行列をとして指定します。これは、位置のみが入力されることを意味します。ウィキペディアの例に焦点を当て、状態ベクトルカルマンフィルタのは、位置含まと速度、すなわちH H = [ 1 0 ] X K X K ˙ X K(xkxk1)/dtHH=[1   0]xkxkx˙k

xk=(xkx˙k)

時間での位置の測定値がます。次に、時間での位置と速度がおよびであり、が時間間隔からに適用される一定の加速度である場合、測定からはの値を推定することができます式を用いてX K K - 1 X K - 1 ˙ X K - 1 K - 1 K X Akx^kk1xk1x˙k1ak1kx^a

x^k=xk1+x˙k1dt+12adt2

これは、時間で速度の測定値が次の式で与えられることを意味します。˙ Xのkkx˙^k

x˙^k=x˙k1+adt=2x^kxk1dtx˙k1

その方程式の右側のすべての量(つまり、、および)は、既知の平均と標準偏差を持つ正規分布のランダム変数です。 、したがって、測定ベクトルの行列XK-1 ˙ X K-1Rx^kxk1x˙k1R

x^k=(x^kx˙^k)

計算できます。これは、プロセスに速度推定を導入する有効な方法ですか?


2
私はあなたの計算のすべてに目を通しませんでした。しかし、ウィキペディアの例について言えば、その構造について少し混乱しているようです。位置だけが測定されるという点で正しいです。ただし、いわゆる「一定速度」モデルが使用されます。これは、状態遷移行列では速度が一定であると見なされることを意味します。
ジェイソンR

3
速度の変化は、プロセスノイズマトリックスを使用してモデル化されます。したがって、速度は指定された共分散でランダムに変化することを本質的に想定しています。驚くべきことに、これはしばしばうまく機能します。このように、最高の状態変数導関数の1つ上の導関数のプロセスノイズを使用することが一般的です。たとえば、モデルに加速を含めた場合、プロセスノイズにランダムなジャークコンポーネントが含まれることがあります。
ジェイソンR

@JasonRウィキペディアモデル(位置と速度の初期共分散がゼロであると仮定)では、速度の推定値は常に初期値です(あなたが言うように、「一定速度」モデル)。ただし、速度の変動はプロセスノイズを介して単調に増加し、速度を低下させる測定値はありません。位置のみをモデル化し、一定の速度を想定するモデルと比べて、この利点は何ですか?
確率的に

2
速度推定値の分散は単調に増加してはなりません。プロセスノイズは状態遷移方程式に確率的要素を導入するだけで、システム状態がタイムステップからタイムステップにどのように変化するかを正確に表すことができます。プロセスノイズを含めない場合、フィルターは真に一定の速度を出力します。それはおそらくあなたが望むものではありません。
ジェイソンR

@JasonR、ウィキペディアモデルを見ると、速度の分散が単調に増加していることがわかります。
確率的に

回答:


24

これは、プロセスに速度推定を導入する有効な方法ですか?

適切に状態を選択すると、速度の見積もりは「無料」で提供されます。以下の信号モデルの導出を参照してください(これまで見てきた単純な1次元の場合)。

信号モデル、テイク2

そのため、これを前進させるには、信号モデルについて合意する必要があります。編集から、位置のモデルは次のようになります。xk

xk+1=xk+x˙kΔt+12a(Δt)2x˙k+1=x˙k+aΔt

以前の状態の場合: 状態更新方程式は次のようになります: ここで、は正規分布の加速度です。

xk=(xkx˙k)
xk+1=(1  Δt0  1)xk+((Δt)22Δt)ak
ak

これにより、前のバージョンとは異なる行列が得られますが、および行列は同じでなければなりません。GFH


scilab(申し訳ありませんが、matlabにアクセスできません)でこれを実装すると、次のようになります。

// Signal Model
DeltaT = 0.1;
F = [1 DeltaT; 0 1];
G = [DeltaT^2/2; DeltaT];
H = [1 0];

x0 = [0;0];
sigma_a = 0.1;

Q = sigma_a^2;
R = 0.1;

N = 1000;

a = rand(1,N,"normal")*sigma_a;

x_truth(:,1) = x0;
for t=1:N,
    x_truth(:,t+1) = F*x_truth(:,t) + G*a(t);
    y(t) = H*x_truth(:,t) + rand(1,1,"normal")*sqrt(R);
end

次に、この(ノイズのある測定値)にカルマンフィルター方程式を適用できます。y

// Kalman Filter
p0 = 100*eye(2,2);

xx(:,1) = x0;
pp = p0;
pp_norm(1) = norm(pp);
for t=1:N,
    [x1,p1,x,p] = kalm(y(t),xx(:,t),pp,F,G,H,Q,R);
    xx(:,t+1) = x1;
    pp = p1;
    pp_norm(t+1) = norm(pp);
end

ノイズの多い測定値があり、カルマンフィルターを適用し、カルマンフィルターを適用するのと同じ信号モデルを使用してを生成しました(かなり大きな仮定です!)。yy

次に、次のプロットが結果を示します。

プロット1:時間に対するおよび。yxk

ここに画像の説明を入力してください

プロット2:最初のいくつかのサンプルの拡大図:

ここに画像の説明を入力してください

プロット3:実際の生活では決して得られないもの、真の位置と位置の状態推定値。

ここに画像の説明を入力してください

プロット4:実際の生活では決して得られないもの、真の速度と速度の状態推定値。

ここに画像の説明を入力してください

プロット5:状態共分散行列のノルム(実際には常に監視する必要があるもの!)最初の非常に大きな値から非常に小さな値に非常に迅速に移行することに注意してください。したがって、最初のいくつかのサンプルのみを示しました。

ここに画像の説明を入力してください

プロット6:真の位置と速度の間の誤差とその推定値のプロット。

ここに画像の説明を入力してください

位置の測定値が正確な場合を調べると、カルマン更新方程式が位置と速度の両方について正確な結果を生成することがわかります。数学的には、理由を見るのは簡単です。ウィキペディアの記事と同じ表記を使用すると、正確な測定値は意味します。あなたが初期位置と速度がそのように知られていると仮定すると、次にとカルマンゲイン行列はzk+1=xk+1Pk=0Pk+1=QKk+1

Kk+1=(12/dt)

これは、カルマン更新手順が生成することを意味します

x^k+1=Fk+1xk+Kk+1(zk+1Hk+1Fk+1xk)=(xk+x˙kdtx˙k)+(12/dt)(xk+1(xk+x˙kdt))=(xk+12(xk+1xk)/dtx˙k)

ご覧のとおり、速度の値は、速度の推定に使用することを提案していた式とまったく同じです。そのため、速度の計算を見ることができませんでしたが、実際にはそこに隠れています。(xkxk1)/dt


これまでのすべてのあなたの助けをありがとう。私の元々の質問にはいくつかの誤解が含まれていたので、z_kについてのあなたの質問に答えようと、もう一度焦点を合わせようとしました。
確率的に

1
すべてのあなたの努力に感謝vm :-)。あなたの仕事は、私があなたの答えに取り組んだ少しの数学をするように駆り立てました。あなたが気にしないことを願っています。とにかく、私は標準的な方法が良いと100%確信しています。再びありがとう
確率的に

助けてくれてうれしい!答えに追加しても問題ありません。
ピーターK。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.