В этом примере показано, как отследить движущиеся объекты с несколькими лидарами с помощью основанного на сетке средства отслеживания. Основанное на сетке средство отслеживания позволяет раннему сплаву данных из датчиков с высоким разрешением, таких как радары и лидары создать список глобальных объектов.
Подходы отслеживания мультиобъекта Most представляют среду как набор дискретного и неизвестного количества объектов. Задание средства отслеживания должно оценить количество объектов и их соответствующих состояний, таких как положение, скорость и размерности, с помощью измерений датчика. С датчиками с высоким разрешением, такими как радар или лидар, алгоритм отслеживания может быть сконфигурирован с помощью средств отслеживания точечного объекта или расширил объектные средства отслеживания.
Средства отслеживания точечного объекта
Средства отслеживания точечного объекта принимают, что каждый объект может дать начало самое большее одному обнаружению на датчик. Поэтому при использовании целевых точкой средств отслеживания для отслеживания расширенных объектов, функции как обнаружения ограничительной рамки сначала извлечены из измерений датчика на уровне объектов. Эти функции уровня объектов затем сплавлены с гипотезой уровня объектов от средства отслеживания. Плохой алгоритм экстракции уровня объектов на уровне датчика (таком как кластеризация имперфекта) таким образом значительно влияет на эффективность средства отслеживания. Для примера этого рабочего процесса относитесь, чтобы Отследить Транспортные средства Используя Лидар: От Облака точек до примера Списка Дорожек.
Расширенные объектные средства отслеживания
С другой стороны, расширенные объектные средства отслеживания обрабатывают обнаружения, не извлекая гипотезу уровня объектов на уровне датчика. Расширенные объектные средства отслеживания сопоставляют измерения датчика непосредственно с гипотезой уровня объектов, обеспеченной средством отслеживания. Для этого класс алгоритмов обычно требует комплексных моделей измерения объектных степеней, характерных для каждой модальности датчика. Например, пошлите к Расширенному Отслеживанию Объекта с Лидаром для Наземного Наблюдения Аэропорта (Sensor Fusion and Tracking Toolbox) и Расширенное Объектное Отслеживание Дорожных транспортных средств с Радаром и Камерой изучить, как сконфигурировать средство отслеживания мультиобъекта PHD для лидара и радара соответственно.
Основанное на сетке средство отслеживания может быть рассмотрено как тип расширенного алгоритма отслеживания объекта, который использует динамическую карту сетки заполнения в качестве промежуточного представления среды. В динамической карте сетки заполнения среда дискретизируется с помощью набора 2D ячеек сетки. Динамическая карта представляет заполнение, а также кинематику пробела, представленного ячейкой сетки. Используя динамическую оценку карты и дальнейшую классификацию ячеек как статические и динамические подачи как шаг предварительной обработки, чтобы отфильтровать измерения от статических объектов и уменьшать вычислительную сложность.
В этом примере вы используете trackerGridRFS
(Sensor Fusion and Tracking Toolbox) Система object™, чтобы сконфигурировать основанное на сетке средство отслеживания. Это средство отслеживания использует формулировку Случайного конечного множества (RFS) приближением Демпстера-Шейфра [1], чтобы оценить динамическую карту. Далее, это использует самую близкую соседнюю ассоциацию ячейки к дорожке [2] схема отследить динамические объекты в сцене. Чтобы инициализировать новые треки, средство отслеживания использует алгоритм DBSCAN для неприсвоенных динамических ячеек сетки кластера.
Сценарий, используемый в этом примере, был создан с помощью приложения Driving Scenario Designer и экспортировался в функцию MATLAB®. Эта функция MATLAB была перенесена как функция помощника helperCreateMultiLidarDrivingScenario
. Сценарий представляет городскую перекрестную сцену и содержит множество объектов, которые включают как пешеходы, велосипедисты, автомобили и грузовики.
Автомобиль, оборудованный датчиком оборудован 6 гомогенными лидарами, каждым с горизонтальным полем зрения 90 градусов и вертикальным полем зрения 40 градусов. Лидары симулированы с помощью lidarPointCloudGenerator
Системный объект. Каждый лидар имеет 32 канала вертикального изменения и имеет разрешение 0,16 градусов в области азимута. Под этой настройкой, каждый датчик лидара выходные параметры приблизительно 18 000 точек на скан. Настройку каждого датчика показывают здесь.
% 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
Можно также ускорить симуляцию путем выполнения динамической оценки карты на графическом процессоре путем определения UseGPU
свойство средства отслеживания.
tracker.UseGPU = false;
Визуализация
Визуализация, используемая для этого примера, задана с помощью класса помощника, helperGridTrackingDisplay
, присоединенный с этим примером. Визуализация содержит три части.
Основная истина - Вид спереди: Это телевикторины вид спереди основной истины с помощью преследования строит от автомобиля, оборудованного датчиком. Чтобы подчеркнуть динамических агентов в сцене, статические объекты отображают серым.
Представления лидара: Эти панели показывают, что облако точек возвращается из каждого датчика.
Основанное на сетке средство отслеживания: Это телевикторины основанное на сетке средство отслеживания выходные параметры. Дорожки показываются полями, каждый аннотируемый их идентичностью. Дорожки наложены на динамической карте сетки. Цвета динамических ячеек сетки заданы согласно цветовому диску, который представляет направление движения в системе координат сценария. Статические ячейки сетки представлены с помощью шкалы полутонов согласно их заполнению. Степень серости обозначает вероятность места, занятого ячейкой сетки как свободную. Положения дорожек показывают в системе координат автомобиля, оборудованного датчиком, в то время как вектор скорости соответствует скорости дорожки в системе координат сценария.
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
Затем анализируйте эффективность средства отслеживания с помощью визуализации, используемой в этом примере.
Основанное на сетке средство отслеживания использует динамические ячейки из предполагаемой карты сетки, чтобы извлечь объектные дорожки. Анимация ниже показов результаты средства отслеживания в этом сценарии. "Основанное на сетке средство отслеживания" телевикторины предполагаемая динамическая карта, а также предполагаемые дорожки объектов. Это также показывает настройку датчиков, смонтированных на автомобиле, оборудованном датчиком как синие круговые секторы. Заметьте, что область, инкапсулировавшая этими датчиками, оценивается как "серая" в динамической карте, представляя, что эта область не наблюдается ни одним из датчиков. Эта закрашенная фигура также служит индикацией относительно позиции автомобиля, оборудованного датчиком по динамической сетке.
Заметьте, что дорожки извлечены только из динамических ячеек сетки, и следовательно средство отслеживания может отфильтровать статические объекты. Также заметьте, что после того, как транспортное средство вводит область сетки, ее установление дорожки берет немного временных шагов. Это происходит из-за двух главных причин. Во-первых, существует задержка установления классификации ячейки как динамическая. Во-вторых, порог подтверждения для объекта делает некоторые шаги, чтобы установить дорожку как подтвержденный объект.
Затем вы смотрите на историю нескольких дорожек, чтобы изучить, как состояние дорожки затронуто оценкой динамической сетки.
В длину движущиеся дорожки
Следующие снимки состояния показывают историю для дорожки, обозначенной 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);
Заметьте, что цвет ячеек сетки, сопоставленных с этим, отслеживает изменения от красного до фиолетового. Кроме того, переход цветов приводит к нескольким неправильно классифицированным ячейкам, которые могут привести к плохой оценке длины и ширине транспортного средства. Способность средства отслеживания обеспечить дорожку на этом транспортном средстве происходит из-за двойного эффекта трех главных причин. Во-первых, средство отслеживания позволяет задавать порог присвоения. Даже если предсказанная дорожка не выравнивается с динамическими ячейками сетки, она может сопоставить с ними до определенного порога. Во-вторых, создать новый трек из ячеек сетки, которые остаются вне порога, требует встречи минимального количества критериев ячеек. В-третьих, средство отслеживания имеет порог удаления, который позволяет дорожке курсироваться для нескольких шагов прежде, чем удалить его. Если классификация ячеек сетки очень плоха во время поворота, дорожка может пережить несколько шагов и может быть повторно сопоставлена с ячейками сетки. Обратите внимание на то, что неправильно классифицированные ячейки сетки намного более заметны с Дорожкой 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, Доминик, и др. "Случайный подход конечного множества для динамической сетки заполнения сопоставляет с приложением реального времени". Международный журнал Исследования Робототехники 37.8 (2018): 841-866.
[2] Steyer, Саша, Георг Танцмайстер и Дирк Уоллэрр. "Отслеживание объекта на основе очевидных динамических сеток заполнения в городских средах". 2 017 IEEE Интеллектуальный Симпозиум Транспортных средств (IV). IEEE, 2017.
lidarPointCloudGenerator
| trackerGridRFS
(Sensor Fusion and Tracking Toolbox)