Отслеживание с измерениями только для области значений

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

Введение

Датчики, которые могут только наблюдать информацию об области значений, не могут обеспечить полное понимание состояния объекта от одного обнаружения. Кроме того, неопределенность в измерении только для области значений, когда представлено в системе координат Декартовой координаты, является негауссовой и создает вогнутую форму. Для датчиков только для области значений с узким полем зрения (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);
    for i = 1:numel(config)
        % Populate the config correctly for plotting
        config(i).FieldOfView = observer.Sensors{i}.FieldOfView;
        config(i).MeasurementParameters(1).OriginPosition = observer.Sensors{i}.MountingLocation(:);
        config(i).MeasurementParameters(1).Orientation = rotmat(quaternion(observer.Sensors{i}.MountingAngles(:)','eulerd','ZYX','frame'),'frame');
        config(i).MeasurementParameters(1).IsParentToChild = true;
    end

    % 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