В этом примере показано, как отслеживать движущиеся объекты с несколькими лидарами с помощью трекера на основе сетки. Основанный на сетке трекер позволяет раннему слиянию данных с датчиков высокого разрешения, таких как радары и лидары, создать глобальный список объектов.
Большинство мультиобъектов отслеживания представляют окружение как набор дискретного и неизвестного количества объектов. Задачей трекера является оценка количества объектов и их соответствующих состояний, таких как положение, скорость и размерности, с помощью измерений датчика. С датчиками высокого разрешения, такими как радар или лидар, алгоритм отслеживания может быть сконфигурирован с помощью трекеров объектов точек или расширенных трекеров объектов.
Трекеры объектов точек
Трекеры точечных объектов предполагают, что каждый объект может вызвать самое большее одно обнаружение на датчик. Поэтому при использовании трекеров точка-цель для отслеживания расширенных объектов функции, такие как обнаружение ограничивающего прямоугольника, сначала извлекаются из измерений датчика на уровне объекта. Эти функции уровня объекта затем сливаются с гипотезой уровня объекта от трекера. Плохой алгоритм извлечения уровня объекта на уровне датчика (такой как несовершенная кластеризация), таким образом, сильно влияет на эффективность трекера. Пример этого рабочего процесса см. в примере Отслеживать транспортные средства, используя лидар: От облака точек до списка треков (Automated Driving Toolbox).
Расширенные Объектом трекеры
С другой стороны, расширенные трекеры объектов обрабатывают обнаружения, не извлекая гипотезу уровня объекта на уровне датчика. Расширенные трекеры объектов связывают измерения датчиков непосредственно с гипотезой об уровне объектов, поддерживаемой трекером. Для этого класс алгоритмов обычно требует сложных моделей измерений экстентов объекта, характерных для каждой модальности датчика. Для получения примера смотрите Расширенное Отслеживание Объектов с помощью Lidar для Наземного Наблюдения Аэропорта и Расширенное Отслеживание Объектов Дорожных Транспортных Средств с Радаром и Камерой (Automated Driving Toolbox), чтобы узнать, как сконфигурировать мультиобъект PHD-трекер для лидара и радара соответственно.
Основанный на сетке трекер может быть рассмотрен как тип алгоритма отслеживания расширенных объектов, который использует динамическую сетку заполнения в качестве промежуточного представления окружения. В динамической сетке заполнения окружение дискретизируется с помощью набора 2-D камер сетки. Динамическая карта представляет заполнение, а также кинематику пространства, представленного камерой сетки. Использование динамической оценки карты и дальнейшей классификации камер как статических и динамических служит шагом предварительной обработки, чтобы отфильтровать измерения от статических объектов и уменьшить вычислительную сложность.
В этом примере вы используете trackerGridRFS
Система object™, чтобы сконфигурировать основанный на сетке трекер. Этот трекер использует формулировку Random Finite Set (RFS) с приближением Демпстера-Шафера [1], чтобы оценить динамическую карту. Кроме того, он использует ближайшую соседнюю схему ассоциации ячейка-трек [2], чтобы отслеживать динамические объекты в сцене. Чтобы инициализировать новые дорожки, трекер использует алгоритм DBSCAN, чтобы кластер неназначенные динамические сеточные камеры.
Сценарий, использованный в этом примере, был создан с помощью приложения Driving Scenario Designer (Automated Driving Toolbox) и экспортирован в функцию MATLAB ®. Эта функция MATLAB была упакована как вспомогательная функция helperCreateMultiLidarDrivingScenario
. Сценарий представляет сцену городского перекрестка и содержит множество объектов, которые включают таких как пешеходы, велосипедисты, автомобили и грузовики.
Автомобиль , оборудованный датчиком оборудован 6 однородными лидарами, каждый с горизонтальным полем зрения 90 степеней и вертикальным полем зрения 40 степеней. Лидары моделируются с помощью lidarPointCloudGenerator
(Automated Driving Toolbox) Системный объект. Каждый лидар имеет 32 повышения канала и имеет разрешение 0,16 степеней по азимуту. При этом строении каждый датчик лидара выводит приблизительно 18 000 точек на скан. Здесь показаны строения каждого датчика.
% For reproducible results rng(2020); % Create scenario [scenario, egoVehicle, lidars] = helperCreateMultiLidarDrivingScenario;
Сценарий и данные из различных лидаров могут быть визуализированы в анимации ниже. Для краткости и облегчения визуализации примера, лидар сконфигурирован так, чтобы не возвращать облако точек с земли путем определения HasRoadsInputPort
свойство как false
. При использовании реальных данных или при использовании моделируемых данных с дороги возвраты с земли и другого окружения должен быть удален с помощью предварительной обработки облака точек. Для получения дополнительной информации см. пример «Обнаружение наземных плоскостей и препятствий с использованием лидара» (Automated Driving Toolbox).
Вы определяете основанный на сетке трекер, используя 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)
Трекер использует подход Демпстера-Шафера, чтобы определить заполненность каждой камеры. Динамическая сетка оценивает массу убеждения для заполнения и свободного состояния сетки. Во время предсказания масса веры заполнения сетки камеры обновляется из-за предсказания распределения частиц. The 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
Можно также ускорить симуляцию, выполнив динамическую оценку карты на графическом процессоре путем определения UseGPU
свойство трекера.
tracker.UseGPU = false;
Визуализация
Визуализация, используемая в этом примере, определяется с помощью класса helper, helperGridTrackingDisplay
, прилагаемый к этому примеру. Визуализация содержит три части.
Основная истина - вид спереди: Эта панель показывает вид спереди основной истины с помощью графика погони от автомобиля , оборудованного датчиком. Чтобы подчеркнуть динамических актёров в сцене, статические объекты показаны серым цветом.
Lidar Views: Эти панели показывают, как облако точек возвращается с каждого датчика.
Сетчатый трекер: На этой панели показаны выходы сетчатого трекера. Дорожки отображаются в виде полей, каждый из которых аннотируется их тождествами. Дорожки накладываются на динамическую сетчатую карту. Цвета динамических камер сетки заданы в соответствии с цветовым колесом, которое представляет направление движения в системе координат сценария. Статические камеры сетки представлены с помощью полутонового цвета в соответствии с их заполненностью. Степень серости обозначает вероятность пространства, занимаемой сеткой камеры как свободную. Положения дорожек показаны в системе координат автомобиль , оборудованный датчиком, в то время как вектор скорости соответствует скорости дорожки в кадре сценария.
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, Dominik, et al. «Подход случайного конечного набора для динамических сетчатых карт заполнения с приложением реального времени». Международный журнал исследований робототехники 37.8 (2018): 841-866.
[2] Steyer, Sascha, Georg Tanzmeister, and Dirk Wollherr. «Объект отслеживание, основанное на доказательственных динамических сетках заполнения в городских окружениях». 2017 IEEE Intelligent Транспортных средств Symposium (IV). IEEE, 2017.