multiObjectTracker

Отслеживаемые объекты с помощью присвоения GNN

Описание

Система multiObjectTracker object™ инициализирует, подтверждает, предсказывает, исправляет и удаляет дорожки перемещения объектов. Входные параметры к мультиобъектному средству отслеживания являются отчетами обнаружения, сгенерированными объектом objectDetection, объектом radarDetectionGenerator или объектом visionDetectionGenerator. Мультиобъектное средство отслеживания принимает обнаружения от нескольких датчиков и присваивает их дорожкам с помощью критерия глобального самого близкого соседа (GNN). Каждое обнаружение присвоено отдельной дорожке. Если обнаружение не может быть присвоено никакой дорожке, на основе свойства AssignmentThreshold, средство отслеживания создает новый трек. Дорожки возвращены в массиве структур.

Новый трек запускается в предварительном состоянии. Если достаточно обнаружений присвоено предварительной дорожке, ее изменениям состояния в подтвержденном. Если обнаружение является известной классификацией (поле ObjectClassID возвращенной дорожки является ненулевым), та дорожка может быть сразу подтверждена. Для получения дополнительной информации на мультиобъектных свойствах средства отслеживания, используемых, чтобы подтвердить дорожки, см. Алгоритмы.

Когда дорожка подтверждена, мультиобъектное средство отслеживания полагает что дорожка представлять физический объект. Если обнаружения не добавляются к дорожке в specifiable количестве обновлений, дорожка удалена.

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

К отслеживаемым объектам с помощью мультиобъектного средства отслеживания:

  1. Создайте объект multiObjectTracker и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

tracker = multiObjectTracker
tracker = multiObjectTracker(Name,Value)

Описание

tracker = multiObjectTracker создает Системный объект multiObjectTracker со значениями свойств по умолчанию.

пример

tracker = multiObjectTracker(Name,Value) свойства наборов для мультиобъектного средства отслеживания с помощью одной или нескольких пар "имя-значение". Например, multiObjectTracker('FilterInitializationFcn',@initcvukf,'MaxNumTracks',100) создает мультиобъектное средство отслеживания, которое использует постоянную скорость, сигма-точечный фильтр Калмана и поддерживает максимум 100 дорожек. Заключите каждое имя свойства в кавычки.

Свойства

развернуть все

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

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Функция инициализации фильтра Калмана, заданная как указатель на функцию или как вектор символов или скаляр строки имени допустимой функции инициализации Фильтра Калмана.

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

Функция инициализацииФункциональное определение
initcvekfИнициализируйте расширенный Фильтр Калмана постоянной скорости.
initcvkfИнициализируйте постоянную скорость линейный Фильтр Калмана.
initcvukfИнициализируйте сигма-точечный фильтр Калмана постоянной скорости.
initcaekfИнициализируйте расширенный Фильтр Калмана постоянного ускорения.
initcakfИнициализируйте постоянное ускорение линейный Фильтр Калмана.
initcaukf Инициализируйте сигма-точечный фильтр Калмана постоянного ускорения.
initctekf Инициализируйте постоянный-turnrate расширенный Фильтр Калмана.
initctukfИнициализируйте постоянный-turnrate сигма-точечный фильтр Калмана.

Можно также записать собственную функцию инициализации. Вход к этой функции должен быть отчетом обнаружения, созданным objectDetection. Вывод этой функции должен быть объектом, принадлежащим одному из классов Фильтра Калмана: trackingKF, trackingEKF или trackingUKF. Чтобы вести вас в записи этой функции, можно исследовать детали предоставленных функций из MATLAB®. Например:

type initcvkf

Типы данных: function_handle | char | string

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

Типы данных: double

Параметры подтверждения для создания дорожки, заданного как двухэлементный вектор положительных увеличивающихся целых чисел, [M N], где M является меньше, чем N. Дорожка подтверждена, когда, по крайней мере, обнаружения M присвоены дорожке во время первых обновлений N после инициализации дорожки.

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

  • Когда установка N, рассмотрите число раз, которое вы хотите, чтобы средство отслеживания обновило, прежде чем это примет решение подтверждения. Например, если средство отслеживания обновляет каждые 0.05 секунды, и вы позволяете 0,5 секундам принимать решение подтверждения, устанавливать N = 10.

Пример: [3 5]

Типы данных: double

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

Типы данных: double

Максимальное количество дорожек, которые средство отслеживания может поддержать, заданный как положительное целое число.

Типы данных: double

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

Когда вы задаете обнаружения, как введено к мультиобъектному средству отслеживания,

MaxNumSensors должен быть больше, чем или равным самому высокому значению SensorIndex в массиве ячеек detections объектов objectDetection, используемых, чтобы обновить мультиобъектное средство отслеживания. Это свойство определяет, сколько наборов полей ObjectAttributes каждая выходная дорожка может иметь.

Типы данных: double

Включите матрицу стоимости, как введено к Системному объекту multiObjectTracker или к функции updateTracks, заданной как false или true.

Типы данных: логический

Это свойство доступно только для чтения.

Количество дорожек сохраняется мультиобъектным средством отслеживания, заданным как неотрицательное целое число.

Типы данных: double

Это свойство доступно только для чтения.

Количество подтвержденных дорожек, заданных как неотрицательное целое число. Поля IsConfirmed выходных структур дорожки указывают, какие дорожки подтверждены.

Типы данных: double

Использование

Чтобы обновить дорожки, вызовите созданное мультиобъектное средство отслеживания с аргументами, как будто это была функция (описанный здесь). Также обновите дорожки при помощи функции updateTracks, задав мультиобъектное средство отслеживания как входной параметр.

Синтаксис

confirmedTracks = tracker(detections,time)
[confirmedTracks,tentativeTracks] = tracker(detections,time)
[confirmedTracks,tentativeTracks,allTracks] = tracker(detections,time)
[___] = tracker(detections,time,costMatrix)

Описание

confirmedTracks = tracker(detections,time) создает, обновляет, и удаляет дорожки в мультиобъектном средстве отслеживания и возвращает детали о подтвержденных дорожках. Обновления основаны на заданном списке detections, и все дорожки обновляются к заданному time. Каждый элемент в возвращенном массиве структур confirmedTracks соответствует одноколейному пути.

пример

[confirmedTracks,tentativeTracks] = tracker(detections,time) также возвращает массив структур, содержащий детали о предварительных дорожках.

пример

[confirmedTracks,tentativeTracks,allTracks] = tracker(detections,time) также возвращает массив структур, содержащий детали обо всех подтвержденных и предварительных дорожках, allTracks. Дорожки возвращены в порядке, согласно которому средство отслеживания внутренне поддерживает их. Можно использовать этот вывод, чтобы помочь вам вычислить матрицу стоимости, дополнительный входной параметр.

[___] = tracker(detections,time,costMatrix) задает матрицу стоимости, возвращая любой из выходных параметров от предыдущих синтаксисов.

Чтобы задать матрицу стоимости, установите свойство HasCostMatrixInput Системного объекта multiObjectTracker к true.

Входные параметры

развернуть все

Список обнаружений, заданный как массив ячеек объектов objectDetection. Значение свойства Time каждого объекта objectDetection должно быть меньше чем или равным текущему времени обновления, time, и больше, чем предыдущая временная стоимость раньше обновляла мультиобъектное средство отслеживания.

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

time должен быть больше, чем или равным самому большому значению свойства Time объектов objectDetection в списке входов detections. time должен увеличиться в значении с каждым обновлением мультиобъектного средства отслеживания.

Типы данных: double

Стойте матрицы, заданной как N с действительным знаком матрица T-by-ND, где N T является количеством существующих дорожек, и N D является количеством текущих обнаружений. Строки матрицы стоимости соответствуют существующим дорожкам. Столбцы соответствуют обнаружениям. Дорожки упорядочены, когда они появляются в списке дорожек в выходном аргументе allTracks предыдущего обновления мультиобъектного средства отслеживания.

В первом обновлении мультиобъектного средства отслеживания, или когда мультиобъектное средство отслеживания не имеет никаких предыдущих дорожек, присвоение, стоимость матрицирует размер [0, N D]. Стоимость должна быть вычислена так, чтобы более низкие цены указали на более высокую вероятность, что мультиобъектное средство отслеживания присваивает обнаружение дорожке. Чтобы препятствовать тому, чтобы определенные обнаружения были присвоены определенным дорожкам, используйте Inf.

Зависимости

Чтобы включить спецификацию матрицы стоимости при обновлении дорожек, установите свойство HasCostMatrixInput мультиобъектного средства отслеживания к true

Типы данных: double

Выходные аргументы

развернуть все

Подтвержденные дорожки, возвращенные как массив структур с этими полями.

Поле Определение
TrackIDУникальный идентификатор дорожки.
TimeВремя, в которое обновляется дорожка. Модули находятся в секундах.
AgeКоличество обновлений начиная с инициализации дорожки.
StateОбновленный вектор состояния. Вектор состояния характерен для каждого типа Фильтра Калмана.
StateCovarianceОбновленная ковариационная матрица состояния. Ковариационная матрица характерна для каждого типа Фильтра Калмана.
IsConfirmedСостояние Confirmation. Этим полем является true, если дорожка подтверждена, чтобы быть действительной целью.
IsCoastedСостояние Coasting. Этим полем является true, если дорожка обновляется без нового обнаружения.
ObjectClassIDЦелочисленное значение, представляющее предметную классификацию. Значение 0 представляет неизвестную классификацию. Ненулевые классификации применяются только к подтвержденным дорожкам.
ObjectAttributesМассив ячеек атрибутов объектов, о которых сообщает датчик, делающий обнаружение.

Дорожка подтверждена если:

  • По крайней мере, обнаружения M присвоены дорожке во время первых обновлений N после инициализации дорожки. Чтобы задать значения [M N], используйте свойство ConfirmationParameters мультиобъектного средства отслеживания.

  • Объект objectDetection, инициирующий дорожку, имеет ObjectClassID, больше, чем нуль.

Предварительные дорожки, возвращенные как массив структур с этими полями.

Поле Определение
TrackIDУникальный идентификатор дорожки.
TimeВремя, в которое обновляется дорожка. Модули находятся в секундах.
AgeКоличество обновлений начиная с инициализации дорожки.
StateОбновленный вектор состояния. Вектор состояния характерен для каждого типа Фильтра Калмана.
StateCovarianceОбновленная ковариационная матрица состояния. Ковариационная матрица характерна для каждого типа Фильтра Калмана.
IsConfirmedСостояние Confirmation. Этим полем является true, если дорожка подтверждена, чтобы быть действительной целью.
IsCoastedСостояние Coasting. Этим полем является true, если дорожка обновляется без нового обнаружения.
ObjectClassIDЦелочисленное значение, представляющее предметную классификацию. Значение 0 представляет неизвестную классификацию. Ненулевые классификации применяются только к подтвержденным дорожкам.
ObjectAttributesМассив ячеек атрибутов объектов, о которых сообщает датчик, делающий обнаружение.

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

Все подтвержденные и предварительные дорожки, возвращенные как массив структур с этими полями.

Поле Определение
TrackIDУникальный идентификатор дорожки.
TimeВремя, в которое обновляется дорожка. Модули находятся в секундах.
AgeКоличество обновлений начиная с инициализации дорожки.
StateОбновленный вектор состояния. Вектор состояния характерен для каждого типа Фильтра Калмана.
StateCovarianceОбновленная ковариационная матрица состояния. Ковариационная матрица характерна для каждого типа Фильтра Калмана.
IsConfirmedСостояние Confirmation. Этим полем является true, если дорожка подтверждена, чтобы быть действительной целью.
IsCoastedСостояние Coasting. Этим полем является true, если дорожка обновляется без нового обнаружения.
ObjectClassIDЦелочисленное значение, представляющее предметную классификацию. Значение 0 представляет неизвестную классификацию. Ненулевые классификации применяются только к подтвержденным дорожкам.
ObjectAttributesМассив ячеек атрибутов объектов, о которых сообщает датчик, делающий обнаружение.

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

isLockedОпределите, используется ли Системный объект
getTrackFilterPropertiesПолучите свойства фильтра дорожки от мультиобъектного средства отслеживания
setTrackFilterPropertiesУстановите свойства фильтра дорожки от мультиобъектного средства отслеживания
updateTracksОбновите мультиобъектное средство отслеживания с новыми обнаружениями
stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

Создайте Систему multiObjectTracker object™ использование функции инициализации фильтра по умолчанию для 2D модели постоянной скорости. Для этой модели движения вектор состояния [x; vx; y;].

tracker = multiObjectTracker('ConfirmationParameters',[4 5], ...
    'NumCoastingUpdates',10);

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

dettime = 1.0;
det = { ...
    objectDetection(dettime,[10; -1], ...
    'SensorIndex',1, ...
    'ObjectAttributes',{'ExampleObject',1}) ...
    };

Обновите мультиобъектное средство отслеживания с этим обнаружением. Время, в которое вы обновляете мультиобъектного берущего, должно быть больше, чем или равным времени, в которое был обнаружен объект.

updatetime = 1.25;
[confirmedTracks,tentativeTracks,allTracks] = tracker(det,updatetime);

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

dettime = 1.5;
det = { ...
    objectDetection(dettime,[10.1; -1.1], ...
    'SensorIndex',1, ...
    'ObjectAttributes',{'ExampleObject',1}) ...
    };
updatetime = 1.75;
[confirmedTracks,tentativeTracks,allTracks] = tracker(det,updatetime);

Определите, была ли дорожка проверена путем проверки количества подтвержденных дорожек.

numConfirmed = tracker.NumConfirmedTracks
numConfirmed = 0

Исследуйте положение и скорость отслеживаемого объекта. Поскольку дорожка не была подтверждена, получите положение и скорость от структуры tentativeTracks.

positionSelector = [1 0 0 0; 0 0 1 0];
velocitySelector = [0 1 0 0; 0 0 0 1];
position = getTrackPositions(tentativeTracks,positionSelector)
position = 1×2

   10.1426   -1.1426

velocity = getTrackVelocities(tentativeTracks,velocitySelector)
velocity = 1×2

    0.1852   -0.1852

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

Создайте мультиобъектное средство отслеживания с помощью функции инициализации фильтра initcakf. Модели средства отслеживания 2D движение постоянного ускорения. Для этой модели движения вектор состояния [x; vx; ax; y;; да].

tracker = multiObjectTracker('FilterInitializationFcn',@initcakf, ...
    'ConfirmationParameters',[3 4],'NumCoastingUpdates',6);

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

dt = 0.1;
pos = [10; -1];
vel = [10; 5];
for detno = 1:2
    time = (detno-1)*dt;
    det = { ...
        objectDetection(time,pos, ...
        'SensorIndex',1, ...
        'ObjectAttributes',{'ExampleObject',1}) ...
        };
    [confirmedTracks,tentativeTracks,allTracks] = tracker(det,time);
    pos = pos + vel*dt;
    meas = pos;
end

Проверьте, что дорожка еще не была подтверждена путем проверки количества подтвержденных дорожек.

numConfirmed = tracker.NumConfirmedTracks
numConfirmed = 0

Поскольку дорожка не подтверждена, получите положение и скорость от структуры tentativeTracks.

positionSelector = [1 0 0 0 0 0; 0 0 0 1 0 0];
velocitySelector = [0 1 0 0 0 0; 0 0 0 0 1 0];
position = getTrackPositions(tentativeTracks,positionSelector)
position = 1×2

   10.6669   -0.6665

velocity = getTrackVelocities(tentativeTracks,velocitySelector)
velocity = 1×2

    3.3473    1.6737

Добавьте больше обнаружений, чтобы подтвердить дорожку.

for detno = 3:5
    time = (detno-1)*dt;
    det = { ...
        objectDetection(time,pos, ...
        'SensorIndex',1, ...
        'ObjectAttributes',{'ExampleObject',1}) ...
        };
    [confirmedTracks,tentativeTracks,allTracks] = tracker(det,time);
    pos = pos + vel*dt;
    meas = pos;
end

Проверьте, что дорожка была подтверждена и отображает радиус-векторы и векторы скорости для той дорожки.

numConfirmed = tracker.NumConfirmedTracks
numConfirmed = 1
position = getTrackPositions(confirmedTracks,positionSelector)
position = 1×2

   13.8417    0.9208

velocity = getTrackVelocities(confirmedTracks,velocitySelector)
velocity = 1×2

    9.4670    4.7335

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

for detno = 6:20
    time = (detno-1)*dt;
    det = {};
    [confirmedTracks,tentativeTracks,allTracks] = tracker(det,time);
    pos = pos + vel*dt;
    meas = pos;
end

Проверьте, что средство отслеживания не имеет никаких предварительных или подтвержденных дорожек.

isempty(allTracks)
ans = logical
   1

Сгенерируйте обнаружения с помощью автомобильного радара по ходу движения, смонтированного на автомобиле, оборудованном датчиком. Примите, что существует три цели:

  • Автомобиль 1 находится в центральном маршруте, непосредственно перед автомобилем, оборудованным датчиком, и управляющий на той же скорости.

  • Автомобиль 2 находится в левом маршруте и управлении быстрее, чем автомобиль, оборудованный датчиком на 12 километров в час.

  • Автомобиль 3 находится в правильном маршруте и управлении медленнее, чем автомобиль, оборудованный датчиком на 5 километров в час.

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

dt = 0.1;
pos1 = [150 0 0];
pos2 = [160 10 0];
pos3 = [130 -10 0];
vel1 = [0 0 0];
vel2 = [12*1000/3600 0 0];
vel3 = [-5*1000/3600 0 0];
car1 = struct('ActorID',1,'Position',pos1,'Velocity',vel1);
car2 = struct('ActorID',2,'Position',pos2,'Velocity',vel2);
car3 = struct('ActorID',3,'Position',pos3,'Velocity',vel3);

Создайте автомобильный радарный датчик, который смещается от автомобиля, оборудованного датчиком. По умолчанию местоположение датчика в (3.4,0) метры от центра автомобиля и 0,2 метра над землей плоскость. Выключите вычисление уровня области значений так, чтобы радарный датчик измерил положение только.

radar = radarDetectionGenerator('DetectionCoordinates','Sensor Cartesian', ...
    'MaxRange',200,'RangeResolution',10,'AzimuthResolution',10, ...
    'FieldOfView',[40 15],'UpdateInterval',dt,'HasRangeRate',false);
tracker = multiObjectTracker('FilterInitializationFcn',@initcvkf, ...
    'ConfirmationParameters',[3 4],'NumCoastingUpdates',6);

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

simTime = 0;
nsteps = 10;
for k = 1:nsteps
    dets = radar([car1 car2 car3],simTime);
    [confirmedTracks,tentativeTracks,allTracks] = tracker(dets,simTime);

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

    simTime = simTime + dt;
    car1.Position = car1.Position + dt*car1.Velocity;
    car2.Position = car2.Position + dt*car2.Velocity;
    car3.Position = car3.Position + dt*car3.Velocity;
end

Используйте birdsEyePlot, чтобы создать вид сверху обнаружений. Постройте зону охвата датчика. Извлеките положения X и Y целей путем преобразования полей Measurement массива ячеек в массив MATLAB. Отобразите обнаружения на видимом с большого расстояния графике.

BEplot = birdsEyePlot('XLim',[0 220],'YLim',[-75 75]);
caPlotter = coverageAreaPlotter(BEplot,'DisplayName','Radar coverage area');
plotCoverageArea(caPlotter,radar.SensorLocation,radar.MaxRange, ...
    radar.Yaw,radar.FieldOfView(1))
detPlotter = detectionPlotter(BEplot,'DisplayName','Radar detections');
detPos = cellfun(@(d)d.Measurement(1:2),dets,'UniformOutput',false);
detPos = cell2mat(detPos')';
if ~isempty(detPos)
    plotDetection(detPlotter,detPos)
end

Алгоритмы

Когда вы передаете обнаружения в мультиобъектное средство отслеживания, Системный объект:

  • Попытки присвоить входные обнаружения существующим дорожкам, с помощью функции assignDetectionsToTracks.

  • Создает новые треки из неприсвоенных обнаружений.

  • Обновления уже присвоили дорожки и возможно подтверждают их, на основе свойства ConfirmationParameters мультиобъектного средства отслеживания.

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

Расширенные возможности

Введенный в R2017a