Этот пример показывает вам, как отследить цели точек в плотной помехе с помощью Гауссовой плотности гипотезы вероятности смеси (GM-PHD) средство отслеживания с помощью постоянной скоростной модели.
Сценарий, используемый в этом примере, создается с помощью trackingScenario
. Сценарий состоит из пяти целей точки, перемещающихся в постоянную скорость. Цели перемещаются в поле зрения статического 2D радарного датчика. Вы используете monostaticRadarSensor
симулировать 2D датчик и монтировать его на статической платформе. Вы используете FalseAlarmRate
свойство датчика управлять плотностью помехи. Значение FalseAlarmRate
свойство представляет вероятность генерации ложного предупреждения в одной ячейке разрешения датчика. На основе ложного сигнального уровня и разрешение датчика, заданного в этом примере, существует приблизительно 48 ложных предупреждений, сгенерированных на шаг.
% Reproducible target locations rng(2022); % Create a trackingScenario object scene = trackingScenario('UpdateRate',10,'StopTime',10); numTgts = 5; % Initialize position and velocity of each target x = 100*(2*rand(numTgts,1) - 1); y = 100*(2*rand(numTgts,1) - 1); z = zeros(numTgts,1); vx = 5*randn(numTgts,1); vy = 5*randn(numTgts,1); vz = zeros(numTgts,1); % Add platforms to scenario with given positions and velocities. for i = 1:numTgts thisTgt = platform(scene); thisTgt.Trajectory.Position = [x(i) y(i) z(i)]; thisTgt.Trajectory.Velocity = [vx(i) vy(i) vz(i)]; end % Add a detecting platform to the scene. detectingPlatform = platform(scene); detectingPlatform.Trajectory.Position = [-200 0 0]; % Simulate 2-D radar using a monostaticRadarSensor. radar = monostaticRadarSensor(1,... 'UpdateRate',scene.UpdateRate,... 'DetectionProbability',0.9,...% Pd 'FalseAlarmRate',1e-3,...% Pfa 'FieldOfView',[120 1],... 'ScanMode','No Scanning',... 'DetectionCoordinates','scenario',...% Report in scenario frame 'HasINS',true,... % Enable INS to report in scenario frame 'ReferenceRange',300,... % Short-range 'ReferenceRCS',10,... % Default RCS of platforms 'MaxUnambiguousRange',400,... % Short-range 'RangeResolution',1,... 'AzimuthResolution',1,... 'HasFalseAlarms',true); % Reports false alarms % Mount the radar on the detecting platform. detectingPlatform.Sensors = radar;
Вы используете средство отслеживания точечного объекта GM-PHD, чтобы отследить цели. Первый шаг к конфигурированию средства отслеживания PHD должен настроить настройку датчика. Вы задаете настройку с помощью trackingSensorConfiguration
объект.
SensorIndex
из настройки собирается в 1 совпадать с тем из симулированного датчика. Когда датчик является датчиком точечного объекта, что выходные параметры самое большее одно обнаружение на объект на сканирование, вы устанавливаете MaxNumDetsPerObject
свойство настройки к 1.
SensorTransformFcn
, SensorTransformParameters,
и SensorLimits
вместе позвольте вам задавать область, в которой дорожки могут быть обнаружены датчиком. SensorTransformFcn
задает преобразование состояния дорожки () в промежуточное пространство, использованное датчиком () задавать обнаружительную способность дорожки. Полное вычисление, чтобы вычислить вероятность обнаружения показывают ниже:
Чтобы вычислить вероятность обнаружения неопределенного состояния с данной ковариацией состояния, средство отслеживания генерирует выборки состояния с помощью вычислений точки сигмы, похожих на сигма-точечный фильтр Калмана.
Заметьте что подпись SensorTransformFcn
похоже на типичную модель измерения. Поэтому можно использовать функции как cvmeas
, cameas
как SensorTransformFcn
. В этом примере вы принимаете, что все дорожки обнаруживаемы. Поэтому SensorTransformFcn
задан как @(x,params)x
и SensorLimits заданы как [-inf inf]
для всех состояний.
% Transform function and limits sensorTransformFcn = @(x,params)x; sensorTransformParameters = struct; sensorLimits = [-inf inf].*ones(6,1); % Detection probability for sensor configuration Pd = radar.DetectionProbability; config = trackingSensorConfiguration('SensorIndex',1,... 'IsValidTime',true,...% Update every step 'MaxNumDetsPerObject',1,... 'SensorTransformFcn',sensorTransformFcn,... 'SensorTransformParameters',sensorTransformParameters,... 'SensorLimits',sensorLimits,... 'DetectionProbability',Pd);
ClutterDensity
свойство настройки относится к ложному сигнальному уровню на единичный объем пробела измерения. В этом примере пробел измерения задан как Декартовы координаты, когда об обнаружениях сообщают в системе координат сценария. Как объем разрешения датчика в изменениях Декартовых координат с азимутом и областью значений разрешения, приближенное значение может быть вычислено в средней области значений датчика.
% Sensor Parameters to calculate Volume of the resolution bin Rm = radar.MaxUnambiguousRange/2; % mean -range dTheta = radar.ElevationResolution; % Bias fractions reduce the "effective" resolution size dPhi = radar.AzimuthBiasFraction*radar.AzimuthResolution; dR = radar.RangeBiasFraction*radar.RangeResolution; % Cell volume VCell = 2*((Rm+dR)^3 - Rm^3)/3*(sind(dTheta/2))*deg2rad(dPhi); % False alarm rate Pfa = radar.FalseAlarmRate; % Define clutter density config.ClutterDensity = Pfa/VCell;
Вы также задаете FilterInitializationFcn
задавать тип фильтра и распределение компонентов в фильтре, инициализированном этим датчиком. В этом примере вы устанавливаете FilterInitializationFcn
к initcvgmphd
, который создает постоянную скорость фильтр GM-PHD и добавляет 1 компонент на обнаружение низкой вероятности от средства отслеживания. initcvgmphd
не добавляет никакой компонент, когда названо без обнаружения. Это означает, что под этой настройкой, компоненты рождения только добавляются к фильтру, когда обнаружения падают за пределами AssignmentThreshold
из мультицелевой программы для работы с файлами. См. AssignmentThreshold
свойство of trackerPHD
для получения дополнительной информации.
config.FilterInitializationFcn = @initcvgmphd;
Затем вы создаете средство отслеживания с помощью этой настройки с помощью trackerPHD
Система object™. При конфигурировании средства отслеживания вы задаете BirthRate
свойство задать количество целей, появляющихся в поле зрения в единицу времени. FilterInitializationFcn
используемый с настройкой добавляет один компонент на неприсвоенное обнаружение. В каждый такт можно ожидать, что количество компонентов будет приблизительно равно количеству ложных предупреждений и новых целей. Средство отслеживания распределяет BirthRate
ко всем этим компонентам однородно.
% Use number of radar cells to compute number of false alarms per unit time. NCells = radar.MaxUnambiguousRange/radar.RangeResolution*radar.FieldOfView(1)/radar.AzimuthResolution; numFalse = Pfa*NCells; % Choose an initial weight of 0.05 for each new component. As number of new % targets is not known, new number of components are simply used as number % of false alarms. 0.1 is the update rate. birthRate = 0.05*(numFalse)/0.1; % Create a tracker with the defined sensor configuration. tracker = trackerPHD('BirthRate',birthRate,... 'SensorConfigurations', config);
Чтобы оценить производительность средства отслеживания, вы также настраиваете метрику для оценки результатов деятельности. В этом примере вы используете Обобщенное Оптимальное Присвоение Подшаблона (GOSPA) метрика. Метрика GOSPA стремится оценивать производительность средства отслеживания путем присвоения его одна величина затрат. Чем лучше производительность отслеживания, тем ниже GOSPA стоится. Значение нуля представляет совершенное отслеживание.
% Create gospa metric object. gospa = trackGOSPAMetric; % Initialize variable for storing metric at each step. gospaMetric = zeros(0,1); loc = zeros(0,1); mt = zeros(0,1); ft = zeros(0,1);
Затем вы совершенствуете сценарий, собираете обнаружения из сценария и запускаете средство отслеживания PHD на симулированных обнаружениях.
% Create a display display = helperClutterTrackingDisplay(scene); count = 1; % Counter for storing metric data rng(2018); % Reproducible run while advance(scene) % Current time time = scene.SimulationTime; % Current detections detections = detect(scene); % Tracks tracks = tracker(detections, time); % Update display display(scene, detections, tracks); % Compute GOSPA. getTruth function is defined below. truths = getTruth(scene); [~,gospaMetric(count),~,loc(count),mt(count),ft(count)] = gospa(tracks, truths); count = count + 1; end
Можно визуализировать это все, цели были прослежены средством отслеживания PHD в этом сценарии. Это может также быть количественно оценено с помощью метрики GOSPA и связанных компонентов. В фигуре ниже, заметьте, что метрика GOSPA понижается после нескольких шагов. Начальное значение метрики GOSPA выше из-за задержки установления каждой дорожки.
figure('Units','normalized','Position',[0.1 0.1 0.8 0.8]) subplot(2,2,[1 2]); plot(gospaMetric,'LineWidth',2); title('Total GOSPA'); ylabel('GOSPA Metric'); xlabel('Time step'); grid on; subplot(2,2,3); plot(mt,'LineWidth',2); title('Missed Target GOSPA'); ylabel('Missed Target Metric'); xlabel('Time step'); grid on; subplot(2,2,4); plot(ft,'LineWidth',2); title('False Track GOSPA'); ylabel('False Target Metric'); xlabel('Time step'); grid on;
Типичный метод, чтобы квалифицировать производительность средства отслеживания путем выполнения нескольких симуляций на различной реализации сценария. Симуляции Монте-Карло помогают аннулировать эффект случайных событий, таких как местоположения ложных предупреждений, события целевых промахов и шум в измерениях.
В этом разделе вы запускаете различную реализацию сценария и средства отслеживания с различными ложными сигнальными уровнями и вычисляете средний GOSPA системы для каждой реализации. Процесс выполнения сценария и вычисления среднего GOSPA для системы перенесен в функции помощника helperRunMonteCarloAnalysis.
Чтобы ускорить симуляции Монте-Карло, можно сгенерировать код для monostaticRadarSensor
модель, а также trackerPHD
использование Тулбокса MATLAB® Coder™. Процесс для генерации кода перенесен в функции помощника helperGenerateCode. Чтобы сгенерировать код для алгоритма, вы собираете код в автономную функцию. Эту функцию называют clutterSimTracker_kernel
в этом примере. clutterSimTracker_kernel
функция записана, чтобы поддержать четыре ложных сигнальных уровня. Чтобы регенерировать код с различными ложными сигнальными уровнями, можно использовать следующую команду.
Pfas = 10.^(-4,-3,4); % Choose your false alarm settings helperGenerateCode(scene, Pfas); % Generate code
Чтобы регенерировать код для более ложных сигнальных настроек, можно изменить функции, чтобы включать более персистентные переменные. Для получения дополнительной информации о том, как сгенерировать код для Системы objects™, обратитесь к, Как Сгенерировать код С для примера Средства отслеживания.
helperRunMonteCarloAnalysis
функционируйте использует parfor
выполнить каждый запущенный Монте-Карло. Если у вас есть лицензия Parallel Computing Toolbox™, запуски Монте-Карло могут быть распределены на нескольких рабочих, чтобы далее ускорить симуляции.
% Turn on flag to run Monte Carlo Simulations Pfas = 10.^linspace(-4,-3,4); runMonteCarlo = false; if runMonteCarlo numRunsPerPfa = 50; %#ok<UNRCH> gospaMCs = zeros(4,numRunsPerPfa,4); for i = 1:4 gospaMCs(i,:,:) = helperRunMonteCarloAnalysis(scene, Pfas, Pfas(i), numRunsPerPfa); end save clutterTrackingMCRuns.mat gospaMCs; else % Reload results from last run load('clutterTrackingMCRuns.mat','gospaMCs'); end % Plot results figure('Units','normalized','Position',[0.1 0.1 0.8 0.8]) subplot(2,2,[1 2]); plot(gospaMCs(:,:,1)','LineWidth',2); title('GOSPA'); legend(strcat('Pfa = ',string(Pfas)),'Orientation','horizontal','Location','NorthOutside'); ylabel('Average GOSPA Metric'); xlabel('Monte Carlo Run'); grid on; subplot(2,2,3); plot(gospaMCs(:,:,3)','LineWidth',2); title('Missed Target GOSPA'); ylabel('Average Missed Target Metric'); xlabel('Monte Carlo Run'); grid on; subplot(2,2,4); plot(gospaMCs(:,:,4)','LineWidth',2); title('False Track GOSPA'); ylabel('Average False Track Metric'); xlabel('Monte Carlo Run'); grid on;
Графики выше производительности показа средства отслеживания в этом сценарии путем выполнения 50 реализации Монте-Карло для каждого ложного сигнального уровня. Как ложные сигнальные повышения ставки, увеличивается вероятность генерации ложной дорожки. Эта вероятность является четной выше около датчика, где плотность ячеек разрешения намного выше. Когда ложные предупреждения близко расположены и часто появляются в этой области, они могут быть неправильно классифицированы как ложная дорожка низкой скорости. Это поведение средства отслеживания может наблюдаться в усредненном "Ложном Компоненте Дорожки" метрики GOSPA на запущенный сценарий. Заметьте, что как ложные сигнальные повышения ставки, количество peaks в графике также увеличивается. Это также вызывает увеличение общей метрики GOSPA. "Пропущенный Целевой Компонент" является нулем для всех кроме одного запуска. Этот тип события вызывается несколькими промахами цели датчиком.
В этом примере вы изучили, как сконфигурировать и инициализировать средство отслеживания GM-PHD, чтобы отследить цели точки для данного ложного сигнального уровня. Вы также изучили, как оценить производительность средства отслеживания с помощью метрики GOSPA и ее связанных компонентов. Кроме того, вы изучили, как запустить несколько реализации сценария при различных ложных сигнальных настройках, чтобы квалифицировать показатели производительности средства отслеживания.
helperRunMonteCarloAnalysis
function gospaMC = helperRunMonteCarloAnalysis(scene, Pfas, Pfai, numRuns) clear clutterSimTracker_kernel; % Compute which tracker to run based on provided Pfa settingToRun = find(Pfas == Pfai,1,'first'); % Initialize ospa for each Monte Carlo run gospaMC = zeros(numRuns,4); % Use parfor for parallel simulations parfor i = 1:numRuns rng(i, 'twister'); % Restart scenario before each run restart(scene); % metrics vs time in this scenario gospaMetric = zeros(0,4); % Counter count = 0; % Advance scene and run while advance(scene) count = count + 1; % Use radar sensor using targetPoses function own = scene.Platforms{end}; tgtPoses = targetPoses(own,'rotmat'); insPose = pose(own); poses = platformPoses(scene,'rotmat'); truths = poses(1:end-1); time = scene.SimulationTime; % Reset tracker at the end of step so at the next call tracker is % reset to time 0. systemToReset = settingToRun*(abs(time - scene.StopTime) < 1e-3); % Store ospa metric. Tracks and detections can be outputted to run % scenario in code generation without needing Monte Carlo runs. [~,~,gospaMetric(count,:)] = clutterSimTracker_kernel(Pfas, tgtPoses, insPose, truths, time, settingToRun, systemToReset); end % Compute average of GOSPA in this run % Start from time step 20 to allow track establishment. gospaMC(i,:) = mean(gospaMetric(20:end,:)); end end
helperGenerateCode
function helperGenerateCode(scene,Pfas) %#ok<DEFNU> % Generate sample pose using platformPoses poses = platformPoses(scene,'rotmat'); % Generate sample inputs for the kernel function % % Pfas must be compile-time constant and they cannot change with time Pfas = coder.Constant(Pfas); % Target poses as a variable size arrray of max 20 elements tgtPoses = coder.typeof(poses(1),[20 1],[1 0]); % Scalar ins pose insPose = pose(scene.Platforms{1},'true'); % Truth information with maximum 20 targets truths = coder.typeof(poses(1),[20 1],[1 0]); % Time time = 0; % Which false-alarm setting to run and which to reset. Reset is necessary % after each run to reinitialize the tracker systemToRun = 1; systemToReset = 1; inputs = {Pfas, tgtPoses, insPose, truths, time, systemToRun, systemToReset}; %#ok<NASGU> % Same name as MATLAB file allows to shadow the MATLAB function when % MEX file is available and execute code in MEX automatically. codegen clutterSimTracker_kernel -args inputs -o clutterSimTracker_kernel; end
getTruth
function truths = getTruth(scenario) platPoses = platformPoses(scenario); % True Information truths = platPoses(1:end-1); % Last object is ownship end
clutterSimTracker_kernel
Эта функция задана во внешнем файле с именем clutterSimTracker_kernel
, доступный в той же рабочей папке как этот скрипт.
function [detections, tracks, ospaMetric] = clutterSimTracker_kernel(Pfas, tgtPoses, insPose, truths, time, systemToRun, systemToReset) assert(numel(Pfas) == 4,'Only 4 false alarm settings supported. Rewrite more persistent variables to add more settings'); persistent tracker1 tracker2 tracker3 tracker4 ... radar1 radar2 radar3 radar4 .... reset1 reset2 reset3 reset4 .... gospa if isempty(gospa) || isempty(reset1) || isempty(reset2) || isempty(reset3) || isempty(reset4) gospa = trackGOSPAMetric('CutoffDistance',50); end if isempty(tracker1) || isempty(radar1) || isempty(reset1) tracker1 = setupTracker(Pfas(1)); radar1 = setupRadar(Pfas(1)); reset1 = zeros(1,1); end if isempty(tracker2) || isempty(radar2) || isempty(reset2) tracker2 = setupTracker(Pfas(2)); radar2 = setupRadar(Pfas(2)); reset2 = zeros(1,1); end if isempty(tracker3) || isempty(radar3) || isempty(reset3) tracker3 = setupTracker(Pfas(3)); radar3 = setupRadar(Pfas(3)); reset3 = zeros(1,1); end if isempty(tracker4) || isempty(radar4) || isempty(reset4) tracker4 = setupTracker(Pfas(4)); radar4 = setupRadar(Pfas(4)); reset4 = zeros(1,1); end switch systemToRun case 1 detections = radar1(tgtPoses, insPose, time); tracks = tracker1(detections, time); case 2 detections = radar2(tgtPoses, insPose, time); tracks = tracker2(detections, time); case 3 detections = radar3(tgtPoses, insPose, time); tracks = tracker3(detections, time); case 4 detections = radar4(tgtPoses, insPose, time); tracks = tracker4(detections, time); otherwise error('Idx out of bounds'); end [~,gp,~,loc,mT,fT] = gospa(tracks, truths); ospaMetric = [gp loc mT fT]; switch systemToReset case 1 reset1 = zeros(0,1); case 2 reset2 = zeros(0,1); case 3 reset3 = zeros(0,1); case 4 reset4 = zeros(0,1); end end function tracker = setupTracker(Pfa) Pd = 0.9; VCell = 0.0609; % Inlined value of cell volume; Kc = Pfa/VCell; % Clutter density % Birth rate birthRate = 0.05*(5 + Pfa*48000)/0.1; % Transform function and limits sensorTransformFcn = @(x,params)x; sensorTransformParameters = struct; sensorLimits = bsxfun(@times,[-inf inf],ones(6,1)); % Assemble information into a trackingSensorConfiguration config = trackingSensorConfiguration('SensorIndex',1,... 'IsValidTime',true,...% Update every step 'DetectionProbability',Pd,...% Detection Probability of detectable states 'ClutterDensity',Kc,...% Clutter Density 'SensorTransformFcn',sensorTransformFcn,... 'SensorTransformParameters',sensorTransformParameters,... 'SensorLimits',sensorLimits,... 'MaxNumDetsPerObject',1,... 'FilterInitializationFcn',@initcvgmphd); tracker = trackerPHD('SensorConfigurations', config,... 'BirthRate',birthRate); end function radar = setupRadar(Pfa) Pd = 0.9; radar = monostaticRadarSensor(1,... 'UpdateRate',10,... 'DetectionProbability',Pd,... 'FalseAlarmRate',Pfa,... 'FieldOfView',[120 1],... 'ScanMode','No Scanning',... 'DetectionCoordinates','Scenario',...% Report in scenario frame 'HasINS',true,...% Enable INS to report in scenario frame 'ReferenceRange',300,...% Short-range 'ReferenceRCS',10,... 'MaxUnambiguousRange',400,...% Short-range 'RangeResolution',1,... 'AzimuthResolution',1,... 'HasFalseAlarms',true); end