multiObjectTracker

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

Описание

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

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

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

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

Чтобы отслеживать объекты с помощью трекера мультиобъекта:

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

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

пример

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

Свойства

расширить все

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

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

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

Уникальный идентификатор трекера, заданный как неотрицательное целое число. Это свойство используется как SourceIndex в выходах трекера и различает треки, которые поступают от разных трекеров в системе с несколькими трекерами. Вы должны задать это свойство как положительное целое число, чтобы использовать выходы дорожки в качестве входов для track fuser.

Пример: 1

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

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

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

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

type initcvkf

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

Порог назначения обнаружения (или порог стробирования), заданный как положительный скаляр или вектор 1 на 2 [C 1 ,C 2], где C 1 ≤ C 2. Если задано в виде скаляра, заданное значение, val, будет расширено до [val, Inf].

Первоначально трекер выполняет грубую оценку нормированного расстояния между всеми треками и обнаружениями. Трекер вычисляет только точное нормированное расстояние для комбинаций, грубое нормированное расстояние которых меньше C 2. Кроме того, трекер может только назначить обнаружение дорожке, если их точное нормированное расстояние меньше C 1. См. distance функция, используемая с отслеживающими фильтрами (для примера, trackingEKF) для пояснения расчета расстояния.

Совет:

  • Увеличьте значение C 2, если существуют комбинации дорожки и обнаружения, которые должны быть рассчитаны для назначения, но не являются. Уменьшите его, если расчет стоимости занимает слишком много времени.

  • Увеличьте значение C 1, если есть обнаружения, которые должны быть назначены трекам, но не являются. Уменьшите его, если есть обнаружения, которые назначены трекам, которым они не должны быть назначены (слишком далеко ).

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

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

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

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

Обработайте измерение вне последовательности (OOSM), заданное как 'Terminate' или 'Neglect'. Каждое обнаружение имеет сопоставленную с ним временную метку, t d, и у трекера есть своя временная метка, t t, которая обновляется в каждом вызове. Трекер рассматривает измерение как OOSM, если t d < t t.

Когда свойство задано как

  • 'Terminate' - трекер перестает запускаться, когда сталкивается с любыми несогласованными измерениями.

  • 'Neglect' - Трекер пренебрегает любыми несовпадающими измерениями и продолжает запускаться.

Настраиваемый: Да

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

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

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

Пример: [3 5]

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

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

  • Уменьшите Q (или увеличить P) если треки следует удалить раньше.

  • Увеличение Q (или уменьшить P) если треки должны храниться в течение более длительного времени перед удалением.

Пример: [3 5]

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

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

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

Включите вход обнаруживаемых идентификаторов дорожек при каждом обновлении объекта, заданный как false или true. Установите это свойство на true если необходимо предоставить список обнаруживаемых идентификаторов дорожек. Этот список сообщает трекеру всех треков, что датчики, как ожидается, обнаружат и, опционально, вероятность обнаружения для каждой дорожки.

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

Параметры опорной системы координат состояния дорожки, заданные как структура или массив структур. Трекер проходит свою StateParameters значения свойств для StateParameters свойство сгенерированных дорожек. Можно использовать эти параметры, чтобы задать систему координат, в которой трек сообщается, или другие желательные атрибуты сгенерированных треков.

Например, можно использовать следующую структуру, чтобы задать прямоугольную систему координат, начальное положение которой находится в [10 10 0] счетчики, начальная скорость которых составляет [2 -2 0] метров в секунду относительно системы координат сценария.

Имя поляЗначение
Frame"Rectangular"
Position[10 10 0]
Velocity[2 -2 0]

Настраиваемый: Да

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

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

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

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

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

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

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

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

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

Описание

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

пример

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

пример

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

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

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

[___] = tracker(___,detectableTrackIDs) также задает список ожидаемых обнаруживаемых треков, заданных detectableTrackIDs. Этот аргумент может использоваться с любым из предыдущих входных синтаксисов.

Чтобы включить этот синтаксис, установите HasDetectableTrackIDsInput свойство к true.

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

расширить все

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

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

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

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

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

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

Зависимости

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

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

Обнаруживаемые идентификаторы дорожек, заданные как действительный вектор M -by-1 или M -by-2 матрица. Обнаруживаемые дорожки являются треками, которые датчики ожидают обнаружить. Первый столбец матрицы содержит список идентификаторов дорожек, которые датчики сообщают как обнаруживаемые. Дополнительный второй столбец содержит вероятность обнаружения для дорожки. Вероятность обнаружения либо сообщается датчиком, либо, если не сообщается, получена из DetectionProbability свойство.

Трекы, идентификаторы которых не включены в detectableTrackIDs рассматриваются как неопределяемые. Логика удаления дорожки не рассчитывает отсутствие обнаружения как 'пропущенное обнаружение' в целях удаления дорожки.

Зависимости

Чтобы включить этот входной параметр, установите detectableTrackIDs свойство к true.

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

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

расширить все

Подтвержденные дорожки, возвращенные как массив objectTrack объекты в MATLAB и возвращенные как массив структур в генерации кода. При генерации кода имена полей возвращаемой структуры совпадают с именами свойства objectTrack.

Дорожка подтверждается, если она удовлетворяет порогу подтверждения, указанному в ConfirmationThreshold свойство. В этом случае IsConfirmed свойство объекта или поля структуры true.

Типы данных: struct | object

Ориентировочные дорожки, возвращенные как массив objectTrack объекты в MATLAB и возвращенные как массив структур в генерации кода. При генерации кода имена полей возвращаемой структуры совпадают с именами свойства objectTrack.

Дорожка является ориентировочной, если она не удовлетворяет порогу подтверждения, указанному в ConfirmationThreshold свойство. В этом случае IsConfirmed свойство объекта или поля структуры false.

Типы данных: struct | object

Все треки, возвращенные как массив objectTrack объекты в MATLAB и возвращенные как массив структур в генерации кода. При генерации кода имена полей возвращаемой структуры совпадают с именами свойства objectTrack. Все треки состоят из подтверждённых и ориентировочных треков.

Типы данных: struct | object

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

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

release(obj)

расширить все

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

Примеры

свернуть все

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

tracker = multiObjectTracker('ConfirmationThreshold',[4 5], ...
    'DeletionThreshold',10);

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

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

Обновите многообъектный трекер с этим обнаружением при помощи updateTracks функция. Время, в которое вы обновляете multi-object tacer, должно быть больше или равным времени, в которое объект был обнаружен.

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

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

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 функция инициализации фильтра. Трекер моделирует 2-D движение с постоянным ускорением. Для этой модели движения вектор состояния является [x; vx; ax; y; vy; ay].

tracker = multiObjectTracker('FilterInitializationFcn',@initcakf, ...
    'ConfirmationThreshold',[3 4],'DeletionThreshold',[6 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

Алгоритмы

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

  • Попытка назначить входные обнаружения существующим трекам, основанная на AssignmentThreshold свойство многообъектного трекера.

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

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

  • Удаляет треки, которым не назначены обнаружения, на основе DeletionThreshold свойство трекера.

Вопросы совместимости

расширить все

Поведение изменено в R2020a

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

.
Введенный в R2017a