В этом примере показано, как настроить и запустить средство отслеживания, чтобы отследить несколько объектов в сцене. Пример объясняет и демонстрирует важность ключевых свойств средств отслеживания в 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
. Функция совпадает с 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