В этом примере показано, как создать эгоцентрическую карту заполнения из приложения Driving Scenario Designer. Этот пример использует информацию о препятствиях от генератора обнаружения зрения, чтобы обновить эгоцентрическую карту заполнения.
Этот пример:
Получение информации о препятствиях и геометрии дороги с помощью генератора обнаружения зрения.
Создает ego-ориентированную карту заполнения с помощью двоичной карты заполнения.
Обновляет ego-ориентированную карту заполнения с помощью контуров маршрута и информации о препятствиях.
Автоматизированные системы управления используют несколько бортовых датчиков на автомобиль , оборудованный датчиком, таких как радар, камеры и лидар. Эти датчики используются для восприятия информации из окружения и окружающей среды. Важно объединить информацию от этих неоднородных датчиков в общую временную систему координат ссылки. Обычно это делается с помощью эгоцентрической карты заполнения. Эта карта содержит информацию об окружающем окружении, такой как дорожная геометрия, свободное пространство и препятствия. Эта эгоцентрическая карта заполнения используется алгоритмами планирования для навигации. Автомобиль , оборудованный датчиком может реагировать на динамические изменения в окружении, периодически обновляя информацию в этой ego центричной карте заполнения.
В этом примере показано, как использовать информацию о маршруте и препятствиях, полученную из сценария, для создания и обновления карты заполнения, ориентированной на эго.
В этом примере также используется сценарий прямой дороги, разработанный с использованием Driving Scenario Designer (DSD). Для получения дополнительной информации смотрите Driving Scenario Designer (Automated Driving Toolbox). Можно также создать сценарий вождения программно. Для получения дополнительной информации см. раздел «Программное создание сценария вождения» (Automated Driving Toolbox).
Сценарий, используемый в этом примере, является прямой дорогой с четырьмя полосами. Этот сценарий имеет один автомобиль , оборудованный датчиком и шесть целевых транспортных средств, которые следуют своим соответствующим предопределенным путям. Создайте сценарий с помощью вспомогательной функции exampleHelperCreateStraightRoadScenario
.
Сценарий, используемый в этом примере, показан на следующем рисунке.
[scenario, egoVehicle] = exampleHelperCreateStraightRoadScenario;
Этот пример использует генератор обнаружения зрения, который синтезирует датчик камеры, установленный на передней части автомобиля , оборудованного датчиком в сценарии вождения. Этот генератор сконфигурирован для обнаружения контуров маршрута и препятствий.
Для получения дополнительной информации смотрите visionDetectionGenerator
(Automated Driving Toolbox).
Интервал обновления генератора обнаружения зрения сконфигурирован, чтобы генерировать обнаружения через 0,1 секунды, что согласуется со частотой обновления типичных автомобильных датчиков зрения.
Создайте actorProfiles
для сценария, которые содержат физические и радиолокационные профили всех участников сценария вождения, включая автомобиль , оборудованный датчиком. Укажите эти актёры и другие параметры конфигурации для генератора обнаружения зрения.
profiles = actorProfiles(scenario); % Configure vision detection generator to detect lanes and obstacles sensor = visionDetectionGenerator('SensorIndex', 1, ... 'SensorLocation', [1.9 0], ... 'DetectionProbability', 1, ... 'MinObjectImageSize', [5 5], ... 'FalsePositivesPerImage', 0, ... 'DetectorOutput', 'Lanes and objects', ... 'Intrinsics', cameraIntrinsics([700 1814],[320 240],[480 640]), ... 'ActorProfiles', profiles,... 'UpdateInterval', 0.1);
Чтобы получить обнаружения, sensor
вызывается объект для каждого шага симуляции. Этот sensor
вызов объекта происходит в вспомогательной функции exampleHelperGetObstacleDataFromSensors
.
Этот пример использует binaryOccupancyMap
объект для создания эгоцентрической карты заполнения.
Создайте квадратную карту заполнения со 100 метрами на стороне и разрешением 2 ячейки на метр. По умолчанию установите все камеры в занятое состояние.
egoMap = binaryOccupancyMap(100, 100, 2); setOccupancy(egoMap,ones(200, 200));
По умолчанию источник карты находится внизу налево. Переместите egoMap
Источник к центру карты заполнения. Это преобразует карту заполнения в эгоцентрическую карту заполнения.
egoMap.GridOriginInLocal = [-egoMap.XLocalLimits(2)/2, ...
-egoMap.YLocalLimits(2)/2];
Перед обновлением egoMap
, инициализируйте окно визуализации. Препятствия в egoMap
визуализация представлена как чёрная (занятая) и свободное пространство как белая (незанятая).
hAxes = exampleHelperSetupVisualization(scenario);
Установите цикл для выполнения сценария с помощью advance(scenario)
. Этот цикл должен переместить egoVehicle
вдоль дороги, обновляя положение при движении.
Функции move
на egoMap
использование обновленного положения для получения обновленных обнаружений. Очистить карту всех препятствий для каждого обновления.
% Advancing the scenario while advance(scenario) % Ego vehicle position egoPose = egoVehicle.Position; egoYaw = deg2rad(egoVehicle.Yaw); % Move the origin of grid to the face of the ego vehicle. move(egoMap, [egoPose(1), egoPose(2)]); %Reset the egoMap before updating with obstacle information setOccupancy(egoMap, ones(egoMap.GridSize));
Контуры маршрута и информация о препятствиях, сгенерированная генератором обнаружения зрения, используются, чтобы найти занятое пространство, которое нужно обновить в egoMap
.
Этот пример использует информацию о контурах дорог, извлеченную из контуров маршрута. Также считается занятая область внешние дорожные контуры.
The exampleHelperGetObstacleDataFromSensor
вспомогательная функция извлекает контуры дороги и информацию о препятствиях, сгенерированную генератором обнаружения зрения.
[obstacleInfo, roadBorders, isValidLaneTime] = ... exampleHelperGetObstacleDataFromSensor(scenario, egoMap, ... egoVehicle, sensor);
В зависимости от области значений генератора обнаружения зрения, обнаружения могут выпадать за пределы egoMap
ограничения. Использование egoMap
границы, exampleHelperFitlerObstacles
функция извлекает препятствия и свободное пространство, которые находятся в эгоцентрической карте.
[obstaclePoints, unoccupiedSpace] = exampleHelperFilterObstacles(... egoMap, obstacleInfo, ... roadBorders, ... isValidLaneTime, egoVehicle);
Используйте отфильтрованные препятствия и местоположения свободного пространства, чтобы обновить эгоцентрическую карту. Обновите визуализацию.
% Set the occupancy of free space to 0 if ~isempty(unoccupiedSpace) setOccupancy(egoMap, unoccupiedSpace, 0); end % Set the occupancy of occupied space to 1 if ~isempty(obstaclePoints) setOccupancy(egoMap, obstaclePoints, 1); end % Updating the visualization exampleHelperUpdateVisualization(hAxes, egoVehicle, egoPose, egoYaw, egoMap); end