Этот пример иллюстрирует использование фильтров частиц и фильтров Гауссовой суммы, чтобы отследить отдельный объект с помощью измерений только для области значений.
Датчики, которые могут только наблюдать информацию об области значений, не могут обеспечить полное понимание состояния объекта от одного обнаружения. Кроме того, неуверенность в измерении только для области значений, когда представлено в кадре Декартовой координаты, является негауссовой и создает вогнутую форму. Для датчиков только для области значений с узким полем зрения (FOV) угловая неуверенность является маленькой и может быть аппроксимирована эллипсоидом, то есть, Распределением Гаусса. Однако для датчиков только для области значений с широким FOV, неуверенность, когда представлено в Декартовом кадре, описана вогнутой кольцевой формой, которая не может быть легко аппроксимирована эллипсоидом. Это проиллюстрировано в изображении, показанном ниже.
Это явление также наблюдается с радарами дальними, которые обеспечивают и азимут и информацию об области значений. Когда FOV каждой ячейки разрешения азимута охватывает большую область на пробеле, распределение состояния становится негауссовым. Методы как исправления дальние часто используются, чтобы использовать Гауссовы фильтры как расширенные Фильтры Калмана (trackingEKF
) и Сигма-точечные фильтры Калмана (trackingUKF
) в тех сценариях. Это продемонстрировано подробно в Многоплатформенном Радарном примере Fusion Обнаружения.
В этом примере вы изучите, как использовать фильтр частиц и фильтр Гауссовой суммы, чтобы представлять негауссову неуверенность в состоянии, вызванном измерениями диапазона от больших датчиков FOV.
Сценарий моделирует отдельный объект, перемещающийся в постоянной скорости в плоскости X-Y. Объект пересекается через зоны охвата трех равномерно распределенных датчиков с FOV 60 градусов в области азимута. Перекрытие FOV датчиков, которое улучшает наблюдаемость, когда объект пересекается через перекрывающиеся области. Каждый датчик сообщает об измерении области значений с точностью измерения 5 сантиметров.
s = rng; rng(2018); exPath = fullfile(matlabroot,'examples','fusion','main'); addpath(exPath); [scene,theaterDisplay] = helperCreateRangeOnlySensorScenario; showScenario(theaterDisplay)
showGrabs(theaterDisplay,[]);
В этом разделе, фильтре частиц, trackingPF
используется, чтобы отследить объект. Отслеживание выполняется средством отслеживания одно гипотезы с помощью trackerGNN
. Средство отслеживания ответственно за поддержание дорожки при сокращении количества ложных предупреждений.
Функциональный initRangeOnlyCVPF
инициализирует постоянный скоростной фильтр частиц. Функция подобна функции initcvpf
, но ограничивает углы от [-180 180] в азимуте и [-90 90] в повышении для initcvpf
к известному датчику FOV в этой проблеме.
% Tracker tracker = trackerGNN('FilterInitializationFcn',@initRangeOnlyCVPF,'MaxNumTracks',5); % Update display to plot particle data theaterDisplay.FilterType = 'trackingPF'; % Advance scenario and track object while advance(scene) % Current time time = scene.SimulationTime; % Generate detections [detections, configs] = generateRangeDetections(scene); % Pass detections to tracker if ~isempty(detections) [confTracks,~,allTracks] = tracker(detections,time); elseif isLocked(tracker) confTracks = predictTracksToTime(tracker,'confirmed',time); end % Update display theaterDisplay(detections,configs,confTracks,tracker); end
Заметьте, что частицы несут негауссову неуверенность в состоянии вдоль дуги измерения только для области значений, пока цель не обнаруживается следующим датчиком. Когда цель перемещается через контуры зон охвата датчика, вероятность частиц при граничных увеличениях по сравнению с другими частицами. Это увеличение вероятности инициировало шаг передискретизации в фильтре частиц и коллапсе частиц к истинному целевому местоположению.
showGrabs(theaterDisplay,[1 2]);
Используя фильтр частиц, средство отслеживания поддерживает дорожку на время сценария.
showGrabs(theaterDisplay,3);
В этом разделе фильтр Гауссовой суммы, trackingGSF
, используется, чтобы отследить объект. Для измерений только для области значений можно инициализировать trackingGSF
с помощью initapekf
. Функция initapekf
инициализирует параметризованный углом расширенный Фильтр Калмана. Функциональный initRangeOnlyGSF
, заданный в этом примере, изменяет функцию initapekf
, чтобы отследить медленные движущиеся объекты.
% restart scene restart(scene); release(theaterDisplay); % Tracker tracker = trackerGNN('FilterInitializationFcn',@initRangeOnlyGSF); % Update display to plot Gaussian-sum components theaterDisplay.FilterType = 'trackingGSF'; while advance(scene) % Current time time = scene.SimulationTime; % Generate detections [detections, configs] = generateRangeDetections(scene); % Pass detections to tracker if ~isempty(detections) [confTracks,~,allTracks] = tracker(detections,time); elseif isLocked(tracker) confTracks = predictTracksToTime(tracker,'confirmed',time); end % Update display theaterDisplay(detections,configs,confTracks,tracker); end
Можно использовать свойство TrackingFilters
trackingGSF
видеть состояние каждого расширенного Фильтра Калмана. Представленный "Отдельными Фильтрами" в следующей фигуре, заметьте, как фильтры выравниваются вдоль дуги, сгенерированной измерением только для области значений, пока цель не достигает перекрывающейся области. Сразу после пересечения контура, вероятность фильтра при граничных увеличениях и дорожке сходится к тому отдельному фильтру. Вес, ModelProbabilities
, другого отдельного отбрасывания фильтров по сравнению с одно самое близкое к контуру и их вклад в оценку состояния уменьшают.
showGrabs(theaterDisplay,[4 5]);
Используя фильтр Гауссовой суммы, средство отслеживания поддерживает дорожку во время на время сценария.
showGrabs(theaterDisplay,6); rng(s) rmpath(exPath);
В этом примере вы изучили, как использовать фильтр частиц и фильтр Гауссовой суммы, чтобы отследить объект с помощью измерений только для области значений. Оба фильтра частиц и Гауссова сумма фильтруют поддержку предложения к отслеживаемым объектам, которые следуют за негауссовой распределенностью. В то время как фильтр Гауссовой суммы аппроксимирует распределение взвешенной суммой Гауссовых компонентов, фильтр частиц представляет это распределение набором выборок. Фильтр частиц предлагает более естественный подход, чтобы представлять любое произвольное распределение, пока выборки могут быть сгенерированы от него. Однако, чтобы представлять распределение отлично, большое количество частиц может требоваться, который увеличивает вычислительные требования использования фильтра. Когда состояние описано выборками, архитектура фильтра частиц позволяет использовать любой шум распределения, а также измерения шума процесса. Напротив, фильтр Гауссовой суммы использует Гауссов шум процесса и измерения для каждого компонента. Один из главного недостатка частиц является проблемой "демонстрационного обеднения". После передискретизации частицы могут выйти из строя в области высокой вероятности, не позволив фильтру восстановиться с "неправильной" ассоциации. Когда никакая передискретизация не выполняется в фильтре Гауссовой суммы, и каждое состояние является Гауссовым, фильтры Гауссовой суммы предлагает некоторую возможность восстановиться с такой ассоциации. Однако это восстановление часто зависит от весов и ковариаций каждого Гауссова компонента.
generateRangeDetections
Эта функция генерирует обнаружение только для области значений
function [detections,config] = generateRangeDetections(scene) detections = []; config = []; time = scene.SimulationTime; for i = 1:numel(scene.Platforms) [thisDet, thisConfig] = detectOnlyRange(scene.Platforms{i},time); config = [config;thisConfig]; %#ok<AGROW> detections = [detections;thisDet]; %#ok<AGROW> end end
detectOnlyRange
Эта функция удаляет азимут и el от сферического обнаружения
function [rangeDetections,config] = detectOnlyRange(observer,time) [fullDetections,numDetections,config] = detect(observer,time); % Remove all except range information rangeDetections = fullDetections; for i = 1:numDetections rangeDetections{i}.Measurement = rangeDetections{i}.Measurement(end); rangeDetections{i}.MeasurementNoise = rangeDetections{i}.MeasurementNoise(end); rangeDetections{i}.MeasurementParameters(1).HasAzimuth = false; rangeDetections{i}.MeasurementParameters(1).HasElevation = false; end end
initRangeOnlyGSF
Эта функция инициализирует параметризованный углом фильтр Гауссовой суммы. Это использует угловые пределы [-30 30], чтобы задать FOV и определяет номер фильтров как 10. Это также изменяет ковариацию состояния и шум процесса для медленного движущегося объекта в 2D.
function filter = initRangeOnlyGSF(detection) filter = initapekf(detection,10,[-30 30]); for i = 1:numel(filter.TrackingFilters) filterK = filter.TrackingFilters{i}; filterK.ProcessNoise = 0.01*eye(3); filterK.ProcessNoise(3,3) = 0; % Small covariance for slow moving targets filterK.StateCovariance(2,2) = 0.1; filterK.StateCovariance(4,4) = 0.1; % Low standard deviation in z as v = 0; filterK.StateCovariance(6,6) = 0.01; end end
initRangeOnlyCVPF
Эта функция инициализирует постоянный скоростной фильтр частиц с частицами, ограниченными FOV [-30 30].
function filter = initRangeOnlyCVPF(detection) filter = initcvpf(detection); % Uniform az in FOV az = -pi/6 + pi/3*rand(1,filter.NumParticles); % no elevation; el = zeros(1,filter.NumParticles); % Samples of range from Gaussian range measurement r = detection.Measurement + sqrt(detection.MeasurementNoise)*randn(1,filter.NumParticles); % x,y,z in sensor frame [x,y,z] = sph2cart(az,el,r); % Rotate from sensor to scenario frame. senToPlat = detection.MeasurementParameters(1).Orientation'; senPosition = detection.MeasurementParameters(1).OriginPosition; platToScenario = detection.MeasurementParameters(2).Orientation'; platPosition = detection.MeasurementParameters(2).OriginPosition; posPlat = senToPlat*[x;y;z] + senPosition; posScen = platToScenario*posPlat + platPosition; % Position particles filter.Particles(1,:) = posScen(1,:); filter.Particles(3,:) = posScen(2,:); filter.Particles(5,:) = posScen(3,:); % Velocity particles % uniform distribution filter.Particles([2 4],:) = -1 + 2*rand(2,filter.NumParticles); % Process Noise is set to a low number for slow moving targets. Larger than % GSF to add more noise to particles preventing them from collapsing. filter.ProcessNoise = 0.1*eye(3); % Zero z-velocity filter.Particles(6,:) = 0; filter.ProcessNoise(3,3) = 0; end