Настройка мультиобъектного средства отслеживания

В этом примере показано, как настроить и запустить средство отслеживания, чтобы отследить несколько объектов в сцене. Пример объясняет и демонстрирует важность ключевых свойств средств отслеживания в Sensor Fusion and Tracking Toolbox.

Настройка средства отслеживания по умолчанию

Для тестирования возможность средства отслеживания отследить несколько объектов, вы настраиваете основной сценарий. В сценарии вы задаете три объекта с каждым прохождением прямой линии при постоянной скорости. Первоначально, вы устанавливаете объектные скорости составлять 48 м/с, 60 м/с и 72 м/с, соответственно.

stopTime = 10;
v = 60;
scenario = trackingScenario;
scenario.StopTime = stopTime;
scenario.UpdateRate = 0;
p1 = platform(scenario);
p1.Trajectory = waypointTrajectory([30 20 0; 30 .8*v*stopTime 0], [0 stopTime]);
p2 = platform(scenario);
p2.Trajectory = waypointTrajectory([0 0 0; 0 v*stopTime 0], [0 stopTime]);
p3 = platform(scenario);
p3.Trajectory = waypointTrajectory([-30 -20 0; -30 1.2*v*stopTime 0], [0 stopTime]);

Кроме того, вы задаете радар, который уставился на сцену и обновляется 5 раз в секунду. Вы монтируете его на платформе, расположенной на стороне движущихся объектов.

pRadar = platform(scenario);
pRadar.Trajectory = kinematicTrajectory('Position', [-v*stopTime 0.5*v*stopTime 0]);
radar = monostaticRadarSensor(1, 'No scanning', 'UpdateRate', 5, ...
    'MountingAngles', [0 0 0], 'AzimuthResolution', 1, ...
    'FieldOfView', [100 1], 'HasINS', true, 'DetectionCoordinates', 'Scenario', ...
    'MaxUnambiguousRange', 1000);
pRadar.Sensors = radar;

Вы создаете театральный график отобразить сцену.

fig = figure;
ax = axes(fig);
tp = theaterPlot('Parent', ax, 'XLimits', [-11*v 100], 'YLimits', [-50 15*v], 'ZLimits', [-100 100]);
rp = platformPlotter(tp, 'DisplayName', 'Radar', 'Marker', 'd');
pp = platformPlotter(tp, 'DisplayName', 'Platforms');
dp = detectionPlotter(tp, 'DisplayName', 'Detections');
trp = trackPlotter(tp, 'DisplayName', 'Tracks', 'ConnectHistory', 'on', 'ColorizeHistory', 'on');
covp = coveragePlotter(tp, 'DisplayName', 'Radar Coverage', 'Alpha', [0.1 0]);

Наконец, вы создаете trackerGNN по умолчанию объект, запустите сценарий и наблюдайте результаты. Вы используете trackGOSPAMetric оценивать производительность средства отслеживания.

tracker = trackerGNN;
tgm = trackGOSPAMetric("Distance","posabserr");
gospa = zeros(1,51); % number of timesteps is 51
i = 0;

% Define the random number generator seed for repeatable results
s = rng(2019); 
while advance(scenario)
    % Get detections
    dets = detect(scenario);
    
    % Update the tracker
    if isLocked(tracker) || ~isempty(dets)
        [tracks, ~, ~, info] = tracker(dets, scenario.SimulationTime);
    end
    
    % Evaluate GOSPA
    i = i + 1;
    truth = platformPoses(scenario);
    gospa(i) = tgm(tracks, truth);
    
    % Update the display
    updateDisplay(rp, pp, dp, trp, covp, scenario, dets, tracks);
end

rng(s)
figure
plot(gospa)
title('Generalized OSPA vs. Timestep')

Вы замечаете, что средство отслеживания не смогло отследить три объекта. В какой-то момент дополнительные дорожки подтверждены и показаны в дополнение к трем ожидаемым дорожкам для трех движущихся объектов. В результате значение метрических увеличений GOSPA. Обратите внимание на то, что нижние значения метрики GOSPA указывают на лучшую производительность средства отслеживания.

Порог присвоения

Вы смотрите на info struct, что средство отслеживания выходные параметры и замечает что CostMatrix и Assignments не показывайте присвоение пар треков, и возражает, что вы ожидаете происходить. Это означает что AssignmentThreshold слишком мал и должен быть увеличен. Увеличьте порог присвоения до 50.

release(tracker);
tracker.AssignmentThreshold = 50;
rerunScenario(scenario, tracker, tgm, tp);

Пороговое свойство присвоения также имеет максимальное расстояние от обнаружения, которое можно установить. Это - последний элемент в AssignmentThreshold значение. Можно использовать это значение, чтобы ускорить средство отслеживания при обработке большого количества обнаружений и дорожек. Обратитесь к, Как Эффективно Отследить Большие количества примера Объектов для получения дополнительной информации. Здесь, вы устанавливаете значение к 2000 вместо inf, который сократит количество комбинаций дорожек и обнаружений, которые используются, чтобы вычислить стоимость присвоения.

release(tracker);
tracker.AssignmentThreshold = [50 2000];
rerunScenario(scenario, tracker, tgm, tp);

Отфильтруйте функцию инициализации

Результаты выше показа, что средство отслеживания способно к поддержанию трех дорожек для трех движущихся объектов, не создавая ложные дорожки. Однако производительность средства отслеживания содержала бы, если объекты перемещаются на более быстрой скорости? Проверять, что, вы изменяете сценарий и увеличиваете объектные скорости, чтобы быть 160, 200, и 240 м/с, соответственно.

v = 200;
p1.Trajectory = waypointTrajectory([30 0 0; 30 0.8*v*stopTime 0], [0 stopTime]);
p2.Trajectory = waypointTrajectory([0 0 0; 0 v*stopTime 0], [0 stopTime]);
p3.Trajectory = waypointTrajectory([-30 0 0; -30 1.2*v*stopTime 0], [0 stopTime]);
pRadar.Trajectory = kinematicTrajectory('Position', [-v*stopTime 0.5*v*stopTime 0]);
tp.XLimits = [-100-v*stopTime 300];
tp.YLimits = [-100 100+v*1.2*stopTime];
release(radar);
radar.MaxUnambiguousRange = 3000;
rerunScenario(scenario, tracker, tgm, tp);

Как вы, вероятно, ожидали, средство отслеживания не могло установить устойчивые дорожки трех объектов. Возможное решение состоит в том, чтобы увеличить AssignmentThreshold еще больше позволить дорожкам быть обновленными. Однако эта опция может увеличить шанс случайных ложных дорожек, присваиваемых нескольким обнаружениям и быть подтвержденным. Так, вы принимаете решение изменить, как инициализируется фильтр.

Вы устанавливаете FilterInitializationFcn свойство к функциональному initFastCVEKF. funciton совпадает с initcvekf по умолчанию кроме него увеличивает неопределенность в скоростных компонентах состояния. Это позволяет начальному состоянию составлять большие неизвестные скоростные значения, но если дорожка устанавливает, неопределенность уменьшается снова.

release(tracker)
tracker.FilterInitializationFcn = @initFastCVEKF;
rerunScenario(scenario, tracker, tgm, tp);

Вы замечаете, что средство отслеживания еще раз может обеспечить дорожки, и существует 3 дорожки для трех движущихся объектов, даже при том, что они перемещаются быстрее теперь. Значение GOSPA также уменьшается после нескольких шагов.

Подтверждение и пороги удаления

Вы хотите убедиться, что ваше средство отслеживания устойчиво к более высокому ложному сигнальному уровню. Чтобы сделать это, вы конфигурируете радар, чтобы иметь ложный сигнальный уровень, который в 250 раз выше, чем ранее.

Вы уменьшаете масштаб, чтобы просмотреть больший фрагмент сцены и видеть, создаются ли ложные дорожки.

release(radar);
radar.FalseAlarmRate = 2.5e-4;
tp.XLimits = [-2100 300];
tp.YLimits = [-100  3100];
tp.ZLimits = [-1000 1000];
rerunScenario(scenario, tracker, tgm, tp);

Существует несколько ложных создаваемых дорожек (не все они показанные), и они увеличивают значение GOSPA.

Вы хотите удалить ложные дорожки более быстро, в которых вы используете DeletionThreshold свойство. Значение по умолчанию для порога удаления [5 5], который требует 5 последовательных промахов, прежде чем подтвержденная дорожка будет удалена. Можно сделать процесс удаления более быстрым путем сокращения этого значения до [3 3], или 3 3 промахов. В качестве альтернативы начиная с радара DetectionProbability высоко, можно даже удалить дорожку после 2 3 промахов путем установки:

release(tracker)
tracker.DeletionThreshold = [2 3];
rerunScenario(scenario, tracker, tgm, tp);

Как ожидалось сокращая количество шагов это берет, чтобы удалить уменьшения дорожек значение GOSPA, потому что эти ложные дорожки являются недолгими. Однако эти ложные дорожки все еще подтверждены и ухудшают полное качество отслеживания.

Так, вы хотите сделать подтверждение новых треков более строгим в попытке сократить количество ложных дорожек. Считайте средство отслеживания ConfirmationThreshold свойство.

disp(tracker.ConfirmationThreshold);
     2     3

Значение показывает, что средство отслеживания подтверждает каждую дорожку, если это присвоено два обнаружения в первых трех обновлениях. Вы решаете сделать его тяжелее, чтобы подтвердить дорожку и сбросить значение, чтобы быть 3 4 присвоений.

release(tracker)
tracker.ConfirmationThreshold = [3 4];
rerunScenario(scenario, tracker, tgm, tp);

Путем создания подтверждения дорожки более строгим вы смогли устранить ложные дорожки. В результате значения GOSPA до приблизительно 20 снова, за исключением первых нескольких шагов.

Максимальное количество дорожек

Создание более строгого подтверждения позволило вам устранять ложные дорожки. Однако средство отслеживания все еще инициализирует дорожку для каждого ложного обнаружения, которое можно наблюдать путем рассмотрения количества дорожек, которые в настоящее время обеспечивает средство отслеживания.

Количество дорожек колеблется в течение времени жизни средства отслеживания. Однако вы не хотите, чтобы он превысил максимальное количество дорожек, которые средство отслеживания может обеспечить, заданный MaxNumTracks, который является значением по умолчанию 100. Если средство отслеживания превышает этот номер, оно выдает предупреждение, что новый трек не мог быть добавлен, но выполнение может продолжиться.

Увеличьте максимальное число дорожек, чтобы позволить средству отслеживания отслеживать даже с более высоким ложным сигнальным уровнем, не выдавая предупреждение. Вы также хотите сделать подтверждение дорожки еще более строгим, чтобы сократить количество ложных дорожек и уменьшать метрику GOSPA.

release(tracker)
tracker.MaxNumTracks = 200;
tracker.ConfirmationThreshold = [5 6];

release(radar)
radar.FalseAlarmRate = 1e-3;
rerunScenario(scenario, tracker, tgm, tp);

Обратите внимание на то, что создание более строгого подтверждения дорожки требует, чтобы больше шагов подтвердило дорожки. В результате для первых нескольких шагов, нет никаких подтвержденных дорожек, и значение GOSPA остается высоким. Можно сравнить это с графиками GOSPA в начале этого примера.

Попробуйте другое средство отслеживания

Вы хотите попытаться использовать другое средство отслеживания, в этом случае, Объединенное Вероятностное средство отслеживания Ассоциации Данных, trackerJPDA. Многие свойства, заданные для предыдущего средства отслеживания, все еще допустимы в средстве отслеживания JPDA. Вы используете helperGNN2JPDA создать средство отслеживания JPDA.

jpda = helperGNN2JPDA(tracker);
jpda.ClutterDensity = 1e-3;
rerunScenario(scenario, tracker, tgm, tp);

Сводные данные

В этом примере вы учились настраивать мультиобъектные средства отслеживания для того, чтобы обеспечить дорожки действительных объектов в сцене, избежать ложных дорожек, обеспечьте правильное количество дорожек и переключатель между различными средствами отслеживания.

При настройке мультиобъектного средства отслеживания рассмотрите изменение следующих свойств:

FilterInitializationFcn — задает фильтр, используемый, чтобы инициализировать новый трек неприсвоенным обнаружением.

  • Функция задает модели измерения и движение.

  • Проверяйте, что неопределенность состояния правильно представлена StateCovariance фильтра. Например, большая начальная скоростная ковариация позволяет отслеживать быстро двигающиеся объекты.

AssignmentThreshold — максимальное нормированное расстояние, используемое в присвоении обнаружений к дорожкам.

  • Уменьшите это значение, чтобы ускорить присвоение, особенно в больших сценах со многими дорожками и избежать ложных дорожек, избыточных дорожек и подкачек дорожки. При использовании trackerJPDA, сокращение этого значения сокращает количество обнаружений, которые рассматриваются, как присвоено одноколейному пути. При использовании trackerTOMHT, сокращение порогов присвоения сокращает количество ветвей дорожки, которые создаются.

  • Увеличьте это значение, чтобы избежать различения дорожек и становления безубыточным в присутствии новых обнаружений.

MaxNumTracks — максимальное количество дорожек обеспечено средством отслеживания.

  • Уменьшите это значение, чтобы минимизировать использование памяти и ускорить инициализацию средства отслеживания.

  • Увеличьте это значение, чтобы избежать новых треков, не инициализируемых, потому что предел был достигнут.

ConfirmationThreshold — управляет подтверждением новых треков.

  • Уменьшите это значение, чтобы подтвердить больше дорожек и подтвердить дорожки более быстро.

  • Увеличьте это значение, чтобы понизить количество ложных дорожек.

DeletionThreshold — управляет каботажным судоходством и удалением дорожек.

  • Уменьшите это значение, чтобы удалить дорожки более быстро (например, когда вероятность обнаружения будет высока).

  • Увеличьте это значение, чтобы компенсировать более низкую вероятность обнаружения (например, дорожки побережья во время поглощений газов).

Можно обратиться к следующим примерам для дополнительных деталей: Как Сгенерировать код С для Средства отслеживания, Введение, чтобы Отследить Логику, Отследив Близко расположенные Цели Под Неоднозначностью и Цели Точки Дорожки в Плотной Помехе Используя Средство отслеживания GM-PHD.

Служебные функции

updateDisplay

Эта функция обновляет отображение на каждом шаге симуляции.

function updateDisplay(rp, pp, dp, trp, covp, scenario, dets, tracks)
    % Plot the platform positions
    poses = platformPoses(scenario);
    pos = reshape([poses(1:3).Position], 3, [])'; % Only the platforms
    plotPlatform(pp, pos);
    radarPos = poses(4).Position; % Only the radar
    plotPlatform(rp, radarPos)
    
    % Plot the detection positions
    if ~isempty(dets)
        ds = [dets{:}];
        dPos = reshape([ds.Measurement], 3, [])';
    else
        dPos = zeros(0,3);
    end
    plotDetection(dp, dPos);
    
    % Plot the tracks
    tPos = getTrackPositions(tracks, [1 0 0 0 0 0; 0 0 1 0 0 0; 0 0 0 0 1 0]);
    tIDs = string([tracks.TrackID]);
    plotTrack(trp, tPos, tIDs);
    
    % Plot the coverage
    covcon = coverageConfig(scenario);
    plotCoverage(covp, covcon);
end

rerunScenario

Эта функция запускает сценарий с данным средством отслеживания и дорожкой метрический объект GOSPA. Это использует театральный объект графика отобразить результаты.

function info = rerunScenario(scenario, tracker, tgm, tp)
    % Reset the objects after the previous run
    restart(scenario);
    reset(tracker);
    reset(tgm);
    rp = findPlotter(tp, 'DisplayName', 'Radar');
    pp = findPlotter(tp, 'DisplayName', 'Platforms');
    trp = findPlotter(tp, 'DisplayName', 'Tracks');
    dp = findPlotter(tp, 'DisplayName', 'Detections');
    covp = findPlotter(tp, 'DisplayName', 'Radar Coverage');
    clearPlotterData(tp);
    
    gospa = zeros(1,51); % number of timesteps is 51
    i = 0;
    s = rng(2019); 
    while advance(scenario)
        % Get detections
        dets = detect(scenario);

        % Update the tracker
        if isLocked(tracker) || ~isempty(dets)
            [tracks, ~, ~, info] = tracker(dets, scenario.SimulationTime); 
        end
        
        % Evaluate GOSPA
        i = i + 1;
        truth = platformPoses(scenario);
        gospa(i) = tgm(tracks, truth);

        % Update the display
        updateDisplay(rp, pp, dp, trp, covp, scenario, dets, tracks);
    end
    rng(s)
    figure
    plot(gospa(gospa>0))
    title('Generalized OSPA vs. Timestep')
end

initFastCVEKF

Эта функция изменяет initcvekf по умолчанию отфильтруйте функцию инициализации, чтобы допускать больше неопределенности в объектной скорости.

function ekf = initFastCVEKF(detection)
    ekf = initcvekf(detection);
    initialCovariance = diag(ekf.StateCovariance);
    initialCovariance([2,4,6]) = 300^2; % Increase the speed covariance
    ekf.StateCovariance = diag(initialCovariance);
end

helperGNN2JPDA

Эта функция обеспечивает средство отслеживания JPDA, эквивалентное средству отслеживания GNN, данному как вход.

function jpda = helperGNN2JPDA(gnn)
    jpda = trackerJPDA(...
        'MaxNumTracks', gnn.MaxNumTracks, ...
        'AssignmentThreshold', gnn.AssignmentThreshold, ...
        'FilterInitializationFcn', gnn.FilterInitializationFcn, ...
        'MaxNumSensors', gnn.MaxNumSensors, ...
        'ConfirmationThreshold', gnn.ConfirmationThreshold, ...
        'DeletionThreshold', gnn.DeletionThreshold, ...
        'HasCostMatrixInput', gnn.HasCostMatrixInput, ...
        'HasDetectableTrackIDsInput', gnn.HasDetectableTrackIDsInput);

    if strcmpi(gnn.TrackLogic, 'History')
        jpda.TrackLogic = 'History';
    else
        jpda.TrackLogic = 'Integrated';
        jpda.DetectionProbability = gnn.DetectionProbability;
        jpda.ClutterDensity = gnn.FalseAlarmRate / gnn.Volume;
    end
end