В этом примере показано, как отслеживать движущиеся объекты с помощью нескольких лидаров с помощью трекера на основе сетки. Сетевой трекер обеспечивает раннее слияние данных с датчиков высокого разрешения, таких как радары и лидары, для создания глобального списка объектов.
Большинство многообъектных подходов к отслеживанию представляют среду как набор дискретных и неизвестных объектов. Задача трекера состоит в оценке количества объектов и их соответствующих состояний, таких как положение, скорость и размеры, с помощью измерений датчика. С датчиками высокого разрешения, такими как радар или лидар, алгоритм слежения может быть сконфигурирован с использованием трекеров точечных объектов или расширенных трекеров объектов.
Отслеживание объектов-точек
Трекеры точечных объектов предполагают, что каждый объект может вызывать не более одного обнаружения на датчик. Поэтому при использовании точечных трекеров для слежения за расширенными объектами признаки, такие как обнаружение ограничивающих коробок, сначала извлекаются из измерений датчика на уровне объекта. Эти функции уровня объекта затем объединяются с гипотезой уровня объекта от трекера. Плохой алгоритм извлечения на уровне объекта на уровне датчика (например, несовершенная кластеризация), таким образом, сильно влияет на производительность трекера. Пример этого рабочего процесса см. в разделе Пример «Отслеживание транспортных средств с помощью Lidar: из облака точек в список дорожек».
Расширенные средства отслеживания объектов
С другой стороны, расширенные средства отслеживания объектов обрабатывают обнаружения без извлечения гипотезы уровня объекта на уровне датчика. Расширенные объектные трекеры связывают измерения датчиков непосредственно с гипотезой уровня объекта, поддерживаемой трекером. Для этого класс алгоритмов обычно требует сложных моделей измерения границ объекта, специфичных для каждой модальности датчика. Например, для получения сведений о настройке многообъектного PHD-трекера для лидара и радара см. Расширенные средства слежения за объектами с помощью Lidar для наземного наблюдения в аэропорту (Sensor Fusion and Tracking Toolbox) и Расширенные средства слежения за объектами для шоссейных транспортных средств с помощью радара и камеры.
Трекер на основе сетки может рассматриваться как тип расширенного алгоритма отслеживания объектов, который использует динамическую карту сетки занятости в качестве промежуточного представления среды. В динамической карте сетки занятости среда дискретизируется с использованием набора 2-D ячеек сетки. Динамическая карта представляет заполняемость, а также кинематику пространства, представленного ячейкой сетки. Использование оценки динамической карты и дальнейшей классификации ячеек как статических и динамических служит этапом предварительной обработки для фильтрации измерений от статических объектов и уменьшения вычислительной сложности.
В этом примере используется trackerGridRFS (Sensor Fusion and Tracking Toolbox) Системная object™ для настройки сетевого трекера. Этот трекер использует формулу RFS с приближением Демпстера-Шафера [1] для оценки динамической карты. Кроме того, для отслеживания динамических объектов в сцене используется схема [2] связи ближайшей соседней ячейки с дорожкой. Для инициализации новых дорожек трекер использует алгоритм DBSCAN для кластеризации неназначенных ячеек динамической сетки.
Сценарий, использованный в этом примере, был создан с помощью приложения «Конструктор сценариев управления» и экспортирован в функцию MATLAB ®. Эта функция MATLAB была обернута как вспомогательная функцияhelperCreateMultiLidarDrivingScenario. Сценарий представляет сцену пересечения городов и содержит множество объектов, в том числе пешеходов, велосипедистов, легковые и грузовые автомобили.
Эго-автомобиль оснащен 6 однородными лидарами, каждый с горизонтальным полем зрения 90 градусов и вертикальным полем зрения 40 градусов. Лидары моделируются с использованием lidarPointCloudGenerator Системный объект. Каждый лидар имеет 32 канала возвышения и имеет разрешение 0,16 градуса по азимуту. При такой конфигурации каждый лидарный датчик выдает приблизительно 18000 точек на сканирование. Здесь показана конфигурация каждого датчика.
![]()
% For reproducible results rng(2020); % Create scenario [scenario, egoVehicle, lidars] = helperCreateMultiLidarDrivingScenario;
Сценарий и данные из различных лидаров могут быть визуализированы в анимации ниже. Для краткости и упрощения визуализации примера лидар настроен так, чтобы не возвращать облако точек из земли, указав HasRoadsInputPort свойство как false. При использовании реальных данных или при использовании смоделированных данных с дорог возврат с земли и другой среды должен быть удален с помощью предварительной обработки облака точек. Дополнительные сведения см. в примере «Наземная плоскость и обнаружение препятствий с помощью лидара».
![]()
Трекер на основе сетки определяется с помощью trackerGridRFS для отслеживания динамических объектов в сцене. Первым шагом определения трекера является настройка конфигураций датчиков как trackingSensorConfiguration объекты. Конфигурации датчиков позволяют задать установку каждого датчика относительно рамки координат отслеживания. Конфигурации датчиков также позволяют указать пределы обнаружения - поле зрения и максимальный диапазон - каждого датчика. В этом примере для определения этих свойств используются свойства моделируемых лидарных датчиков.
Утилита helperGetLidarConfig использует моделируемую модель лидарного датчика и возвращает соответствующую конфигурацию. В этом примере цели отслеживаются в глобальной или мировой системе координат с использованием моделируемой позы транспортного средства. Эта информация обычно получается с помощью инерциальной навигационной системы. По мере перемещения датчиков в системе сценариев их конфигурация должна обновляться каждый раз путем указания конфигураций в качестве входных данных для трекера.
% Store configurations of all sensor sensorConfigs = cell(numel(lidars),1); % Fill in sensor configurations for i = 1:numel(sensorConfigs) sensorConfigs{i} = helperGetLidarConfig(lidars{i},egoVehicle); end % Create tracker. You can define the properties before using the tracker. tracker = trackerGridRFS('SensorConfigurations',sensorConfigs,... 'HasSensorConfigurationsInput',true);
Трекер использует двумерную сетку для промежуточного представления среды. Сетка определяется 3 атрибутами: длиной, шириной и разрешением. Длина и ширина описывают диапазон сетки в локальном направлении X и локальном направлении Y эго-транспортного средства соответственно. Разрешение определяет количество ячеек на метр сетки. В этом примере используется сетка 120 м на 120 м с 2 ячейками на метр.
tracker.GridLength = 120; % meters tracker.GridWidth = 120; % meters tracker.GridResolution = 2; % 1/meters
Помимо определения сетки, можно также определить относительное положение эго-транспортного средства, указав начало координат сетки (левый угол) относительно начала координат эго-транспортного средства. В этом примере эго-транспортное средство расположено в центре сетки.
tracker.GridOriginInLocal = [-tracker.GridLength/2 -tracker.GridWidth/2];
Трекер использует методы на основе частиц, чтобы оценить состояние каждой ячейки сетки и далее классифицировать их как динамические или статические. Он использует фиксированное количество стойких частиц на сетке, которое определяет распределение существующих мишеней. Он также использует фиксированное количество частиц для выборки распределения для новорожденных мишеней. Эти родовые частицы отбираются в различных ячейках сетки на основе вероятности рождения. Кроме того, скорость и другие неизвестные состояния, такие как скорость поворота и ускорение (применимо, когда MotionModel трекера нет constant-velocity) частиц отбирают равномерно, используя предшествующую информацию, предоставленную с использованием предшествующих пределов. Этап повторной выборки гарантирует, что количество частиц на сетке остается постоянным.
tracker.NumParticles = 1e5; % Number of persistent particles tracker.NumBirthParticles = 2e4; % Number of birth particles tracker.VelocityLimits = [-15 15;-15 15]; % To sample velocity of birth particles (m/s) tracker.BirthProbability = 0.025; % Probability of birth in each grid cell tracker.ProcessNoise = 5*eye(2); % Process noise of particles for prediction as variance of [ax;ay] (m/s^2)
Трекер использует подход Демпстера-Шафера для определения заполняемости каждой ячейки. Динамическая сетка оценивает массу веры для занятости и свободного состояния сетки. Во время прогнозирования масса веры в занятость ячейки сетки обновляется благодаря прогнозированию распределения частиц. DeathRate контролирует вероятность выживания () частиц и приводит к распаду массы веры в занятость во время прогнозирования. Поскольку масса свободных убеждений не связана с частицами, масса свободных убеждений распадается с использованием заранее определенного постоянного дисконтного коэффициента. Этот коэффициент дисконтирования определяет вероятность того, что свободные области останутся свободными во время прогнозирования.
tracker.DeathRate = 1e-3; % Per unit time. Translates to Ps = 0.9999 for 10 Hz tracker.FreeSpaceDiscountFactor = 1e-2; % Per unit time. Translates to a discount factor of 0.63 (1e-2^dT) for 10 Hz
После оценки состояния каждой ячейки сетки трекер классифицирует каждую ячейку сетки как статическую или динамическую, используя ее оцененную скорость и связанную с ней неопределенность. Кроме того, трекер использует динамические ячейки для извлечения гипотезы уровня объекта с использованием следующей методики:
Каждая динамическая ячейка сетки рассматривается для назначения с существующими дорожками. Динамическая ячейка сетки назначается ближайшей дорожке, если отрицательное логарифмическое правдоподобие между ячейкой сетки и дорожкой падает ниже порога назначения. Динамическая ячейка сетки за пределами порогового значения назначения считается неназначенной. Трекер использует неназначенные ячейки сетки на каждом шаге для инициирования новых дорожек. Поскольку несколько неназначенных ячеек сетки могут принадлежать к одной и той же дорожке объектов, для помощи на этом этапе используется алгоритм кластеризации DBSCAN. Поскольку при классификации ячеек как статических или динамических имеются ложные срабатывания, трекер фильтрует эти ложные аварийные сигналы двумя способами. Во-первых, только неназначенные ячейки, которые образуют кластеры с более чем заданным количеством точек (MinNumPointsPerCluster) может создавать новые треки. Во-вторых, каждая дорожка инициализируется как предварительная дорожка первой и подтверждается только в том случае, если ее обнаруживается M из N раз.
tracker.AssignmentThreshold = 8; % Maximum distance or negative log-likelihood between cell and track tracker.MinNumCellsPerCluster = 6; % Minimum number of grid cells per cluster for creating new tracks tracker.ClusteringThreshold = 1; % Minimum Euclidean distance between two cells for clustering tracker.ConfirmationThreshold = [3 4]; % Threshold to confirm tracks tracker.DeletionThreshold = [4 4]; % Threshold to delete confirmed tracks
Можно также ускорить моделирование, выполнив динамическую оценку карты на GPU, указав UseGPU свойство трекера.
tracker.UseGPU = false;
Визуализация
Визуализация, используемая в этом примере, определяется с помощью класса помощника, helperGridTrackingDisplay, прилагается с этим примером. Визуализация содержит три части.
Наземная правда - Вид спереди: На этой панели показан вид спереди наземной истины с использованием графика погони из эго-транспортного средства. Чтобы подчеркнуть динамических актёров в сцене, статические объекты отображаются серым цветом.
Lidar Views: Эти панели показывают возврат облака точек от каждого датчика.
Grid-based tracker: на этой панели отображаются выходные данные grid-based tracker. Дорожки отображаются в виде полей, каждая из которых аннотирована их идентичностью. Дорожки накладываются на динамическую карту сетки. Цвета ячеек динамической сетки определяются в соответствии с цветовым колесом, который представляет направление движения в кадре сценария. Статические ячейки сетки представлены с использованием оттенков серого в соответствии с их заполняемостью. Степень серости обозначает вероятность свободного пространства, занимаемого ячейкой сетки. Положения дорожек показаны в системе координат эго-транспортного средства, в то время как вектор скорости соответствует скорости дорожки в кадре сценария.
display = helperGridTrackingDisplay;
Затем выполните сценарий, смоделируйте данные лидарного датчика из каждого лидарного датчика и обработайте данные с помощью трекера на основе сетки.
% Initialize pointCloud ouputs from each sensor ptClouds = cell(numel(lidars),1); sensorConfigs = cell(numel(lidars),1); while advance(scenario) % Current simulation time time = scenario.SimulationTime; % Poses of objects with respect to ego vehicle tgtPoses = targetPoses(egoVehicle); % Simulate point cloud from each sensor for i = 1:numel(lidars) [ptClouds{i}, isValidTime] = step(lidars{i},tgtPoses,time); sensorConfigs{i} = helperGetLidarConfig(lidars{i},egoVehicle); end % Pack point clouds as sensor data format required by the tracker sensorData = packAsSensorData(ptClouds,sensorConfigs,time); % Call the tracker tracks = tracker(sensorData,sensorConfigs,time); % Update the display display(scenario, egoVehicle, lidars, ptClouds, tracker, tracks); drawnow; end
Затем проанализируйте производительность трекера с помощью визуализации, используемой в этом примере.
Трекер на основе сетки использует динамические ячейки из оценочной карты сетки для извлечения дорожек объектов. В анимации ниже показаны результаты трекера в этом сценарии. Панель «Grid-based tracker» показывает предполагаемую динамическую карту, а также предполагаемые дорожки объектов. Он также показывает конфигурацию датчиков, установленных на эго-транспортном средстве в виде голубых круглых секторов. Обратите внимание, что область, инкапсулированная этими датчиками, оценивается как «серая» на динамической карте, что означает, что эта область не наблюдается ни одним из датчиков. Этот патч также служит индикатором положения эго-транспортного средства на динамической сетке.
Обратите внимание, что дорожки извлекаются только из ячеек динамической сетки и, следовательно, трекер может отфильтровывать статические объекты. Также обратите внимание, что после того, как транспортное средство въезжает в область сетки, его установление пути занимает несколько временных шагов. Это объясняется двумя основными причинами. Во-первых, существует задержка установления в классификации ячейки как динамической. Во-вторых, порог подтверждения для объекта делает некоторые шаги, чтобы установить дорожку как подтвержденный объект.
![]()
Далее вы посмотрите на историю нескольких треков, чтобы понять, как на состояние трека влияет оценка динамической сетки.
Продольно движущиеся дорожки
Следующие снимки показывают историю для дорожки, обозначенной T1. Дорожка T1 представляет собой желтый автомобиль, который проходит эго-автомобиль слева в течение первых нескольких секунд моделирования. Обратите внимание, что ячейки сетки, занятые этой дорожкой, окрашены в красный цвет, что указывает на их движение в положительном направлении X. Дорожка получает информацию о скорости и курсе дорожки, используя распределение скорости назначенных ячеек сетки. Он также получает свою длину, ширину и ориентацию, используя пространственное распределение назначенных ячеек сетки. Дефолт TrackUpdateFcn из trackerGridRFS извлекает новую информацию о длине, ширине и ориентации из пространственного распределения связанных ячеек сетки на каждом шаге. Этот эффект можно увидеть на снимках ниже, где длина и ширина дорожки корректируются в соответствии с ограничительной рамкой связанных ячеек сетки. Дополнительная схема фильтрации может быть добавлена с использованием прогнозируемой длины, ширины и ориентации дорожки с помощью пользовательского TrackUpdateFcn.
% Show snapshots for TrackID = 1. Also shows close tracks like T3 and T4 % representing car and truck moving in the opposite direction. showSnapshots(display.GridView,1);
![]()
showSnapshots(display.GridView,4);
![]()
Далее подробнее рассмотрим историю T4. Трасса T4 представляет собой грузовик, движущийся в противоположном направлении эго-транспортного средства. Обратите внимание, что ячейки сетки, представляющие эту дорожку, окрашены в синий цвет, представляющий расчетное направление движения ячейки сетки. Также обратите внимание, что в дорожке имеются ячейки сетки, которые неправильно классифицируются трекером как статические (белый цвет). Эти неправильно классифицированные ячейки сетки часто возникают, когда датчики сообщают о ранее закрытых областях объекта, потому что трекер имеет задержку установления для классификации этих свойств ячеек.
Обратите внимание, что в момент времени = 4, когда грузовик и транспортное средство сблизились друг с другом, ячейки сетки сохраняли свой соответствующий цвет, представляя собой резкую разницу между их оцененными направлениями скорости. Это также приводит к правильной связи данных между ячейками сетки и прогнозируемыми дорожками T1 и T4, что помогает трекеру разрешать их как отдельные объекты.
Поперечно движущиеся дорожки
Следующие снимки представляют дорожку, обозначенную T7. Эта трасса представляет транспортное средство, движущееся в поперечном направлении, когда эго-транспортное средство останавливается на перекрестке. Обратите внимание, что ячейки сетки этой дорожки окрашены в фиолетовый цвет, представляющий направление движения в отрицательном направлении Y. Подобно другим дорожкам, дорожка сохраняет свою длину и ширину, используя пространственное распределение назначенных ячеек сетки.
showSnapshots(display.GridView,7);
![]()
Дорожки, изменяющие направление
В этом примере используется модель «постоянной скорости» с трекером. Эта модель движения предполагает, что цели движутся с постоянной скоростью, что означает постоянную скорость и направление. Однако в городских сценах это предположение обычно не является точным. Для компенсации неизвестного ускорения объектов на трекере указан технологический шум. Следующие снимки показывают историю T2 треков. Эта дорожка представляет транспортное средство непосредственно перед эго-транспортным средством. Обратите внимание на то, что это транспортное средство поворачивает прямо на перекрестке.
showSnapshots(display.GridView, 2);
![]()
Обратите внимание, что цвет ячеек сетки, связанных с этой дорожкой, изменяется с красного на фиолетовый. Также переход цветов приводит к нескольким неправильно классифицированным ячейкам, что может привести к плохой оценке длины и ширины транспортного средства. Способность трекера поддерживать трассу на этом транспортном средстве обусловлена сопряженным эффектом по трем основным причинам. Сначала трекер позволяет задать порог назначения. Даже если прогнозируемая дорожка не выровнена с ячейками динамической сетки, она может ассоциироваться с ними до определенного порога. Во-вторых, для создания новой дорожки из ячеек сетки, которые остаются за пределами порогового значения, требуется соответствие минимальному количеству критериев ячеек. В-третьих, трекер имеет порог удаления, который позволяет складывать дорожку на несколько шагов перед ее удалением. Если классификация ячеек сетки очень плохая во время поворота, дорожка может пережить несколько шагов и может быть повторно связана с ячейками сетки. Обратите внимание, что неправильно классифицированные ячейки сетки гораздо более заметны с Track T8, как показано ниже в его истории. Трасса T8 представляет светло-синий автомобиль, двигающийся в положительном направлении Y перед тем, как совершить правый поворот на перекрестке. Это транспортное средство было частично закупорено перед поворотом и имело другой близко передвигающийся автомобиль во время выполнения поворота.
showSnapshots(display.GridView,8);
![]()
В этом примере были изучены основы сетевого трекера и способы его использования для отслеживания динамических объектов в сложной городской среде вождения. Также вы научились настраивать трекер для отслеживания объектов с помощью точечных облаков от нескольких лидарных датчиков.
function sensorData = packAsSensorData(ptCloud, configs, time) %The lidar simulation returns output as pointCloud object. The Location %property of the point cloud is used to extract x,y and z locations of %returns and pack them as structure with information required by a tracker. sensorData = struct('SensorIndex',{},... 'Time', {},... 'Measurement', {},... 'MeasurementParameters', {}); for i = 1:numel(ptCloud) % This sensor's cloud thisPtCloud = ptCloud{i}; % Allows mapping between data and configurations without forcing an % ordered input and requiring configuration input for static sensors. sensorData(i).SensorIndex = configs{i}.SensorIndex; % Current time sensorData(i).Time = time; % Measurement as 3-by-N defininng locations of points sensorData(i).Measurement = reshape(thisPtCloud.Location,[],3)'; % Data is reported in sensor coordinate frame and hence measurement % parameters are same as sensor transform parameters. sensorData(i).MeasurementParameters = configs{i}.SensorTransformParameters; end end function config = helperGetLidarConfig(lidar, ego) % Define transformation from sensor to ego senToEgo = struct('Frame',fusionCoordinateFrameType(1),... 'OriginPosition',[lidar.SensorLocation(:);lidar.Height],... 'Orientation',rotmat(quaternion([lidar.Yaw lidar.Pitch lidar.Roll],'eulerd','ZYX','frame'),'frame'),... 'IsParentToChild',true); % Define transformation from ego to tracking coordinates egoToScenario = struct('Frame',fusionCoordinateFrameType(1),... 'OriginPosition',ego.Position(:),... 'Orientation',rotmat(quaternion([ego.Yaw ego.Pitch ego.Roll],'eulerd','ZYX','frame'),'frame'),... 'IsParentToChild',true); % Assemble using trackingSensorConfiguration. config = trackingSensorConfiguration(... 'SensorIndex',lidar.SensorIndex,... 'IsValidTime', true,... 'SensorLimits',[lidar.AzimuthLimits;0 lidar.MaxRange],... 'SensorTransformParameters',[senToEgo;egoToScenario],... 'DetectionProbability',0.95); end
[1] Nuss, Доминик, и др. «Подход случайного конечного набора для динамических карт сетки занятости с приложением реального времени». The International Journal of Robotics Research 37.8 (2018): 841-866.
[2] Штайер, Саша, Георг Танзмейстер и Дирк Воллхерр. «Отслеживание объектов на основе доказательных динамических сетей размещения в городских условиях» 2017 IEEE Intelligent Vehicles Symposium (IV). IEEE, 2017.
lidarPointCloudGenerator | trackerGridRFS (панель инструментов слияния и отслеживания датчиков)