これは、プロセスに速度推定を導入する有効な方法ですか?
適切に状態を選択すると、速度の見積もりは「無料」で提供されます。以下の信号モデルの導出を参照してください(これまで見てきた単純な1次元の場合)。
信号モデル、テイク2
そのため、これを前進させるには、信号モデルについて合意する必要があります。編集から、位置のモデルは次のようになります。xk
xk+1x˙k+1==xk+x˙kΔt+12a(Δt)2x˙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=0P−k+1=QKk+1
Kk+1=(12/dt)
これは、カルマン更新手順が生成することを意味します
x^k+1=Fk+1xk+Kk+1(zk+1−Hk+1Fk+1xk)=(xk+x˙kdtx˙k)+(12/dt)(xk+1−(xk+x˙kdt))=(xk+12(xk+1−xk)/dt−x˙k)
ご覧のとおり、速度の値は、速度の推定に使用することを提案していた式とまったく同じです。そのため、速度の計算を見ることができませんでしたが、実際にはそこに隠れています。(xk−xk−1)/dt