最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

vision.KalmanFilter

測定値、状態、および状態推定誤差の共分散の修正

説明

カルマン フィルター オブジェクトは、追跡のために設計されています。これを使用して物理オブジェクトの将来の位置を予測し、検出された位置のノイズを低減したり、複数の物理オブジェクトを対応するトラックに関連付けたりすることができます。複数のオブジェクトを追跡できるように各物理オブジェクトに対してカルマン フィルター オブジェクトを構成できます。カルマン フィルターを使用するには、オブジェクトが等速度または等加速度で動いていなければなりません。

作成

カルマン フィルター アルゴリズムには、予測と補正 (更新ステップとも呼ばれる) という 2 つのステップが含まれます。最初のステップでは、以前の状態を使用して現在の状態を予測します。2 番目のステップでは、オブジェクトの位置など、現在の測定値を使用して状態を修正します。カルマン フィルターは、離散時間の線形状態空間システムを実装しています。

メモ

カルマン フィルターの構成を容易にするには、configureKalmanFilter オブジェクトを使用してカルマン フィルターを構成します。これにより、等速度または等加速度で移動する直交座標系内の物理オブジェクトを追跡するためのフィルターが設定されます。統計量はすべての次元に沿って同じです。カルマン フィルターを異なる仮定に基づいて設定する必要がある場合は、関数を使用せず、このオブジェクトを直接使用します。

状態空間システムでは、状態遷移モデル A と測定モデル H が次のように設定されます。

変数
A[1 1 0 0; 0 1 0 0; 0 0 1 1; 0 0 0 1]
H[1 0 0 0; 0 0 1 0]

説明

kalmanFilter = vision.KalmanFilter は、離散時間の等速度システムのカルマン フィルターを返します。

kalmanFilter = vision.KalmanFilter(StateTransitionModel,MeasurementModel) は、さらに制御モデル B を構成します。

kalmanFilter = vision.KalmanFilter(StateTransitionModel,MeasurementModel,ControlModel,Name,Value) は、カルマン フィルター オブジェクトのプロパティを構成します。このプロパティは、1 つ以上の Name,Value 引数ペアとして指定します。指定していないプロパティは既定値になります。

プロパティ

すべて展開する

タイム ステップ間での状態遷移を示すモデル (A)。M 行 M 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間モデルの変数 A に関連しています。

状態から測定値への変換を示すモデル (H)。N 行 M 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間モデルの変数 H に関連しています。

制御入力から状態への変換を示すモデル (B)。M 行 L 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間モデルの変数 B に関連しています。

状態 (x)。スカラーまたは M 要素ベクトルとして指定します。State をスカラーとして指定すると、M 要素ベクトルに拡張されます。このプロパティは、状態空間モデルの変数 x に関連しています。

状態推定誤差の共分散 (P)。スカラーまたは M 行 M 列の行列として指定します。StateCovariance をスカラーとして指定すると、M 行 M 列の対角行列に拡張されます。このプロパティは、状態空間システムの変数 P に関連しています。

プロセス ノイズの共分散 (Q)。スカラーまたは M 行 M 列の行列として指定します。ProcessNoise をスカラーとして指定すると、M 行 M 列の対角行列に拡張されます。このプロパティは、状態空間モデルの変数 Q に関連しています。

測定ノイズの共分散 (R)。スカラーまたは N 行 N 列の行列として指定します。MeasurementNoise をスカラーとして指定すると、N 行 N 列の対角行列に拡張されます。このプロパティは、状態空間モデルの変数 R に関連しています。

オブジェクト関数

検出結果に基づいて、関数 predictcorrect を使用します。関数 distance を使用して最適一致を求めます。

  • 追跡中のオブジェクトが検出された場合、カルマン フィルター オブジェクトと検出測定値を指定して関数 predict および correct を使用します。次の順序で関数を呼び出します。

    [...] = predict(kalmanFilter);
    [...] = correct(kalmanFilter,measurement);

  • 追跡中のオブジェクトが検出されない場合、関数 correct ではなく関数 predict を呼び出します。追跡中のオブジェクトが欠損している、または隠れている場合、測定値は得られません。次のロジックを使用して関数を設定します。

    [...] = predict(kalmanFilter);
    If measurement exists
    	[...] = correct(kalmanFilter,measurement);
    end

  • 追跡中のオブジェクトが過去の t-1 回の連続したタイム ステップで欠損しており、その後に検出された場合、関数 predict を t 回呼び出すことができます。次の構文は、非同期ビデオを処理する場合に特に役立ちます。たとえば、次の例を考えてみましょう。

    for i = 1:k
      [...] = predict(kalmanFilter);
    end
    [...] = correct(kalmanFilter,measurement) 

correctCorrection of measurement, state, and state estimation error covariance
predictPrediction of measurement
distanceConfidence value of measurement

すべて折りたたむ

1 方向に移動する物理オブジェクトの位置を追跡します。

定速で移動する物理オブジェクトの 1 次元位置を模倣する合成データを生成します。

detectedLocations = num2cell(2*randn(1,40) + (1:40));

一部の要素を空に設定することによって、欠損している検出をシミュレートします。

detectedLocations{1} = [];
  for idx = 16: 25 
      detectedLocations{idx} = []; 
  end

検出の位置と、カルマン フィルターを使用した追跡の結果を示す Figure を作成します。

figure;
hold on;
ylabel('Location');
ylim([0,50]); 
xlabel('Time');
xlim([0,length(detectedLocations)]);

物理オブジェクトが最初に検出された時点で、1 次元の定速カルマン フィルターを作成します。前の状態に基づいてオブジェクトの位置を予測します。現在のタイム ステップでオブジェクトが検出された場合、その位置を使用して状態を修正します。

kalman = []; 
for idx = 1: length(detectedLocations) 
   location = detectedLocations{idx}; 
   if isempty(kalman)
     if ~isempty(location) 
       
       stateModel = [1 1;0 1]; 
       measurementModel = [1 0]; 
       kalman = vision.KalmanFilter(stateModel,measurementModel,'ProcessNoise',1e-4,'MeasurementNoise',4);
      kalman.State = [location, 0]; 
     end 
   else
     trackedLocation = predict(kalman);
     if ~isempty(location) 
       plot(idx, location,'k+');
      d = distance(kalman,location); 
       title(sprintf('Distance:%f', d));
       trackedLocation = correct(kalman,location); 
     else 
       title('Missing detection'); 
     end 
     pause(0.2);
     plot(idx,trackedLocation,'ro'); 
   end 
 end 
legend('Detected locations','Predicted/corrected locations');

カルマン フィルターを使用して、ゼロ平均のガウス ノイズによって破損したランダムな信号からノイズを除去します。

ゼロ平均で標準偏差が 0.1 のガウス ノイズによって破損した、値が 1 のランダムな信号を合成します。

x = 1;
len = 100;
z = x + 0.1 * randn(1,len);

カルマン フィルターを使用して信号からノイズを除去します。状態は一定であると予測され、測定値は状態と同じになります。

stateTransitionModel = 1;
measurementModel = 1;
obj = vision.KalmanFilter(stateTransitionModel,measurementModel,'StateCovariance',1,'ProcessNoise',1e-5,'MeasurementNoise',1e-2);

z_corr = zeros(1,len);
for idx = 1: len
 predict(obj);
 z_corr(idx) = correct(obj,z(idx));
end

結果をプロットします。

figure, plot(x * ones(1,len),'g-'); 
hold on;
plot(1:len,z,'b+',1:len,z_corr,'r-');
legend('Original signal','Noisy signal','Filtered signal');

アルゴリズム

すべて展開する

参照

[1] Welch, Greg, and Gary Bishop, An Introduction to the Kalman Filter, TR 95–041. University of North Carolina at Chapel Hill, Department of Computer Science.

[2] Blackman, S. Multiple-Target Tracking with Radar Applications. Artech House, Inc., pp. 93, 1986.

拡張機能

R2012b で導入