メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

trackingIMM

オブジェクト追跡用の Interacting Multiple Model (IMM) フィルター

説明

trackingIMM オブジェクトは、操縦性が高いオブジェクトの追跡用に設計された Interacting Multiple Model (IMM) フィルターを表します。このフィルターは、オブジェクトの将来の位置を予測したり、検出された位置のノイズを低減したりするために使用します。複数のオブジェクト検出をそれらのトラックに関連付けるのにも役立ちます。

IMM フィルターでは、ベイズ フレームワークで複数の運動モデルを扱います。この手法では、ターゲットの操縦に一度に複数のモデルを使用することにより、ターゲットの運動の不確かさを解消します。すべてのモデルが IMM アルゴリズムで同時に処理され、それらの更新された重みに応じてモデルが切り替わります。

作成

説明

imm = trackingIMM は、運動モデルが等速度、等加速度、および等旋回としてそれぞれ設定された既定の追跡フィルター {trackingEKF,trackingEKF,trackingEKF} をもつ IMM フィルター オブジェクトを返します。既定の変換関数 @switchimm がフィルターで使用されます。

imm = trackingIMM(trackingFilters) は、TrackingFilters プロパティを指定し、他のすべてのプロパティを既定値に設定します。

imm = trackingIMM(trackingFilters,modelConversionFcn) は、ModelConversionFcn プロパティも指定します。

imm = trackingIMM(trackingFilters,modelConversionFcn,transitionProbabilities) は、TransitionProbabilities プロパティも指定します。

imm = trackingIMM(___,Name,Value) は、1 つ以上の Name,Value のペアの引数を使用してフィルターのプロパティを指定します。指定されていないプロパティはすべて既定値を取ります。前述の構文の他の入力引数は、これよりも先に指定します。

プロパティ

すべて展開する

フィルター状態。実数値 M 要素ベクトルとして指定します。名前と値のペアを使用してオブジェクトを作成するときの初期の状態を指定します。

このプロパティの State ベクトルの定義は、TrackingFilters プロパティで指定された最初の追跡フィルターの状態定義と同じです。追跡フィルターの状態定義は、フィルターで使用される運動モデルまたは状態遷移関数によって制御されます。

データ型: single | double

状態誤差の共分散。MM 列の行列として指定します。ここで、M はフィルター状態のサイズです。スカラー入力は MM 列の行列に拡張されます。共分散行列はフィルター状態の不確かさを表します。名前と値のペアを使用してオブジェクトを作成するときの初期の状態共分散を指定します。

例: eye(6)

データ型: single | double

フィルターのリスト。追跡フィルターの cell 配列として指定します。既定では、各フィルターの確率が等しくなります。フィルターによって確率が異なる場合は ModelProbabilities を指定します。

単精度浮動小数点変数を使用する trackingIMM フィルターが必要な場合は、単精度を使用するフィルターを指定します。以下に例を示します。

filter1 = trackingEKF('StateTransitionFcn',@constvel,'State',single([1;2;3;4]));
filter2 = trackingEKF('StateTransitionFcn',@constvel,'State',single([2;3;3;1]));
filter = trackingIMM({filter1,filter2})

データ型: cell

この プロパティ は読み取り専用です。

フィルターでの測定残差のラップ。K 要素の logical ベクトルとして指定します。ここで、KTrackingFilters プロパティで指定された基になる追跡フィルターの数です。基になるフィルターで測定値のラップを有効にする場合、対応する要素は 1 (true) です。それ以外の場合は 0 (false) です。

状態または状態共分散を変換する関数。関数ハンドルとして指定します。この関数により、状態または状態共分散のモデル タイプが別のタイプに変換されます。関数シグネチャは次のとおりです。

function x2 = modelConversionFcn(modelType1,x1,modelType2)

入力の modelType1modelType2 は 2 つのモデルの名前です。x1 は最初のモデルの State または StateCovariance を指定します。x2State または StateCovariance を出力します。

データ型: function_handle

フィルター モデルの遷移確率。正の実数スカラー、L 要素ベクトル、または LL 列の行列として指定します。ここで、L はフィルターの数です。

  • スカラーとして指定する場合、各フィルターにとどまる確率が均一になります。残りの確率 (1-p) は他の運動モデルに均等に分けられます。

  • ベクトルとして指定する場合、各フィルターにとどまる確率をそれぞれの要素で定義します。残りの確率 (1-p) は他の運動モデルに均等に分けられます。

  • 行列として指定する場合、j 番目のフィルターから k 番目のフィルターに遷移する確率を (j,k) の要素で定義します。すべての要素が区間 [0,1] になければならず、各行の合計は 1 でなければなりません。

各モデルに対して定義される遷移確率は、そのモデルから別のモデルにフィルターが 1 秒で切り替わる確率に対応します。

例: 0.75

データ型: single | double

測定ノイズ共分散。正のスカラーまたは正定値の実数値行列として指定します。スカラーとして指定すると、行列は NN 列の単位行列の倍数になります。N は測定ベクトルのサイズです。

MeasurementNoise は、correct 関数を呼び出す前に指定します。

例: 0.2

各フィルターの重み。0 ~ 1 の確率のベクトルとして指定します。既定では、フィルターの各成分の重みは等しくなります。L はフィルターの数です。IMM フィルターでは、予測ステップで各フィルターの重みが更新されます。

データ型: single | double

状態平滑化の有効化。false または true として指定します。true として指定すると以下を行うことができます。

  • smooth 関数を使用して前のタイム ステップの状態推定を平滑化する。

  • フィルターの MaxNumSmoothingSteps プロパティを使用して平滑化ステップの最大数を指定する。

メモ

平滑化の機能は、trackingIMM オブジェクトがガウス フィルターで構成されている場合にのみサポートされます。

後方平滑化ステップの最大数。正の整数として指定します。

依存関係

このプロパティを有効にするには、EnableSmoothing プロパティを true に設定します。

シーケンス外測定 (OOSM) ステップの最大数。非負の整数として指定します。

  • このプロパティを 0 に設定すると、フィルター オブジェクトの OOSM 遡測機能が無効になります。

  • このプロパティを正の整数に設定すると、フィルター オブジェクトの OOSM 遡測機能が有効になります。このプロパティを N>1 として設定すると、フィルター オブジェクトは過去の状態と状態共分散の履歴を最大で過去 N+1 個の補正まで保存します。OOSM とオブジェクト関数の retrodict および retroCorrect (OOSM が複数の場合は retroCorrectJPDA) を使用して、推定される状態の不確かさを軽減できます。

このプロパティの値を大きくすると、状態の履歴に割り当てなければならないメモリ量が増えますが、より長い遅延の後に到達する OOSM を処理できるようになります。OOSM を使用した不確かさの軽減の効果は、遅延が長くなるにつれて小さくなることに注意してください。

メモ

trackingIMM オブジェクトに対してMaxNumOOSMSteps プロパティを指定すると、TrackingFilters で指定された基になるフィルターの MaxNumOOSMSteps プロパティは無視されます。メモリを削減するために、基になるフィルターの MaxNumOOSMSteps プロパティは 0 として指定します。

ModelConversionFcn を呼び出すときにフィルターで使用されるモデルの名前。文字ベクトルまたは string スカラーとして指定します。各フィルターの名前をオブジェクトの作成時に提供できます。既定では、trackingIMM は、これらのモデル名を TrackingFilters プロパティから推定します。このプロパティは、作成後は読み取り専用になります。

オブジェクト関数

predictPredict state and state estimation error covariance of tracking filter
correctCorrect state and state estimation error covariance using tracking filter
correctjpdaCorrect state and state estimation error covariance using tracking filter and JPDA
distanceDistances between current and predicted measurements of tracking filter
likelihoodLikelihood of measurement from tracking filter
cloneCreate duplicate tracking filter
initializeInitialize state and covariance of tracking filter
smoothBackward smooth state estimates of trackingIMM filter
retrodictRetrodict filter to previous time step
retroCorrectCorrect filter with OOSM using retrodiction
retroCorrectJPDACorrect tracking filter with OOSMs using JPDA-based algorithm
tunablePropertiesGet tunable properties of filter
setTunedPropertiesSet properties to tuned values
setMeasurementSizesSets the sizes of the measurement and measurement noise

すべて折りたたむ

この例では、trackingIMM オブジェクトを使用した Interacting Multiple Model (IMM) フィルターの作成方法と実行方法を示します。predict 関数と correct 関数を呼び出して、オブジェクトを追跡し、測定値に基づいて状態推定を補正します。

フィルターを作成します。名前と値のペアを使用して、オブジェクトの追加プロパティを指定します。

detection = objectDetection(0, [1;1;0], 'MeasurementNoise', [1 0.2 0; 0.2 2 0; 0 0 1]);
filter = {initctekf(detection);initcvekf(detection)};
modelConv = @switchimm;
transProb = [0.9,0.9];
imm = trackingIMM('State',[1;1;3;1;5;1;1],'StateCovariance',eye(7),...
     'TransitionProbabilities',transProb,'TrackingFilters',filter,...
     'ModelConversionFcn',modelConv);

predict を呼び出して、フィルターの予測される状態と共分散を取得します。0.5 秒のタイム ステップを使用します。

[xPred,pPred] = predict(imm,0.5);

与えられた測定値で correct を呼び出します。

meas = [1;1;0];
[xCorr,pCorr] = correct(imm,meas);

フィルター状態の予測を続けます。必要に応じて目的のタイム ステップを秒単位で指定します。

[xPred,pPred] = predict(imm);         % Predict over 1 second
[xPred,pPred] = predict(imm,2);       % Predict over 2 seconds

この例では、カスタム運動モデルを使用した 2 つの線形カルマン フィルター用の IMM (Interacting Multiple Model) フィルターの作成と実行について示します。

カスタム運動モデルを使用して 2 つの線形カルマン フィルター filter1filter2 を作成します。filter1 の状態は [x;y;vx;vy] で、x 方向と y 方向の遷移が等速度であると仮定します。filter2 の状態は [x;vx;ax;y] で、x 方向は等加速度、y 方向は静止した状態と仮定します。

dT=0.1;
filter1 = trackingKF('MotionModel','Custom', ...
    'StateTransitionModel',[1 0 dT 0;0 1 0 dT;0 0 1 0;0 0 0 1], ...
    'MeasurementModel',[1 0 0 0;0 1 0 0]);

filter2 = trackingKF('MotionModel','Custom', ...
    'StateTransitionModel',[1 dT dT^2/2 0;0 1 dT 0;0 0 1 0;0 0 0 1], ...
    'MeasurementModel',[1 0 0 0;0 0 0 1]);

filter1filter2、およびカスタムの ModelConversionFcn を使用して IMM フィルターを作成します。適切な初期の状態、状態共分散、およびプロセス ノイズを設定し、IMM フィルターを初期化して調整します。

imm = trackingIMM({filter1;filter2},'ModelNames',{'cv','ca'},...
    'ModelConversionFcn',@CustomLinearModelConversionFcn);
initialize(imm,zeros(4,1),blkdiag(1,1,10,10));
imm.TrackingFilters{2}.ProcessNoise(4,4) = 10;

初期位置を [0;0] とするターゲットを生成し、その軌跡を x 方向は等加速度、y 方向は等速度になるように定義します。ターゲット データを使用して、0.1 秒ごとに 20 秒にわたって IMM フィルターを補正します。

x = 0;
y = 0;
vx = 3.66;
vy = 1.83;
ax = 0.53;
for i = 1:200
    x = x + vx*dT + ax*dT^2/2;
    vx = vx + ax*dT;
    y = y + vy*dT;
    predict(imm);
    correct(imm,[x;y]);
end

IMM フィルターの予測される状態を表示します。

disp(imm.State)
  179.1699
   36.5911
   13.7177
    1.5239

TrackingFiltersModelProbabilities の予測される状態を表示します。

disp(imm.TrackingFilters{1}.State)
  179.1697
   36.5919
   13.7147
    1.6887
disp(imm.TrackingFilters{2}.State)
  179.1711
   13.7455
    0.0931
   36.5834
disp(imm.ModelProbabilities)
    0.9024
    0.0976
function x2 = CustomLinearModelConversionFcn(modelName1,x1,modelName2,x2)
if strcmpi(modelName1,modelName2)
    x2 = x1;
    return;
end
if strcmpi(modelName1,'cv') && strcmpi(modelName2,'ca')
    % cv to ca conversion
    if isvector(x2)
        x2(1) = x1(1); % x
        x2(2) = x1(3); % vx
        x2(3) = 0; % ax
        x2(4) = x1(2); % y
    else
        x2([1 2 4],[1 2 4]) = x1([1 3 2],[1 3 2]);
        x2(3,3) = 100;
    end
elseif strcmpi(modelName1,'ca') && strcmpi(modelName2,'cv')
    % ca to cv conversion
    if isvector(x2)
        x2(1) = x1(1); % x
        x2(2) = x1(4); % y
        x2(3) = x1(2); % vx
        x2(4) = 0; % vy
    else
        x2([1 2 3],[1 2 3]) = x1([1 4 2],[1 4 2]);
        x2(4,4) = 100;
    end
else
    disp('Model Name must be cv or ca');
end
end

参照

[1] Bar-Shalom, Yaakov, Peter K. Willett, and Xin Tian. Tracking and data fusion. Storrs, CT, USA:: YBS publishing, 2011.

[2] Blackman, Samuel, and Robert Popoli. "Design and analysis of modern tracking systems." Norwood, MA: Artech House, 1999.

拡張機能

すべて展開する

バージョン履歴

R2018b で導入

すべて展開する