Cree un mapa de ocupación egocéntrico desde el Diseñador de escenarios de conducción
Este ejemplo muestra cómo crear un mapa de ocupación egocéntrico desde la app Driving Scenario Designer. Este ejemplo utiliza información de obstáculos del generador de detección de visión para actualizar el mapa de ocupación egocéntrico.
Este ejemplo:
Obtiene información de obstáculos y geometría de la carretera mediante un generador de detección de visión.
Crea un mapa de ocupación egocéntrico utilizando un mapa de ocupación binario.
Actualiza el mapa de ocupación egocéntrico utilizando límites de carriles e información de obstáculos.
Introducción
Los sistemas de conducción automatizados utilizan múltiples sensores a bordo del vehículo ego, como radar, cámaras y lidar. Estos sensores se utilizan para percibir información del entorno y del entorno. Es importante recopilar información de estos sensores heterogéneos en un marco de referencia temporal común. Esto suele hacerse utilizando un mapa de ocupación egocéntrico. Este mapa contiene información sobre el entorno circundante, como la geometría de la carretera, el espacio libre y los obstáculos. Este mapa de ocupación egocéntrico se utiliza mediante algoritmos de planificación para la navegación. El vehículo ego puede responder a cambios dinámicos en el entorno actualizando periódicamente la información en este mapa de ocupación egocéntrico.
Este ejemplo muestra cómo utilizar la información de carriles y obstáculos obtenida de un escenario para crear y actualizar un mapa de ocupación egocéntrico.
Este ejemplo también utiliza un escenario de carretera recta diseñado con Driving Scenario Designer (DSD). Para obtener más detalles, consulte Driving Scenario Designer (Automated Driving Toolbox). También puede crear un escenario de conducción mediante programación. Para obtener más detalles, consulte Create Driving Scenario Programmatically (Automated Driving Toolbox).
Obtenga información sobre límites de carriles y obstáculos del escenario de conducción
El escenario utilizado en este ejemplo es una carretera recta de cuatro carriles. Este escenario tiene un vehículo ego y seis vehículos objetivo que siguen sus respectivas rutas predefinidos. Cree un escenario utilizando la función auxiliar, exampleHelperCreateStraightRoadScenario
.
El escenario utilizado en este ejemplo se muestra en la siguiente figura.
[scenario, egoVehicle] = exampleHelperCreateStraightRoadScenario;
Este ejemplo utiliza un generador de detección de visión que sintetiza un sensor de cámara montado en la parte delantera del vehículo ego en el escenario de conducción. Este generador está configurado para detectar límites de carriles y obstáculos.
Para obtener más detalles, consulte visionDetectionGenerator
(Automated Driving Toolbox).
El intervalo de actualización del generador de detección de visión está configurado para generar detecciones a intervalos de 0,1 segundos, lo que es consistente con la tasa de actualización de los sensores de visión automotrices típicos.
Cree el actorProfiles
para el escenario, que contiene perfiles físicos y de radar de todos los actores del escenario de conducción, incluido el vehículo ego. Especifique esos actores y otros parámetros de configuración para el generador de detección de visión.
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);
Para obtener detecciones, se llama al objeto sensor
para cada paso de la simulación. Esta llamada de objeto sensor
ocurre en la función auxiliar exampleHelperGetObstacleDataFromSensor
.
Crear un mapa de ocupación egocéntrico
Este ejemplo utiliza un objeto binaryOccupancyMap
para crear un mapa de ocupación egocéntrico.
Cree un mapa de ocupación cuadrado con 100 metros por lado y una resolución de 2 celdas por metro. Configure todas las celdas en estado ocupado de forma predeterminada.
egoMap = binaryOccupancyMap(100, 100, 2); setOccupancy(egoMap,ones(200, 200));
De forma predeterminada, el origen del mapa está en la parte inferior izquierda. Mueva el origen egoMap
al centro del mapa de ocupación. Esto convierte el mapa de ocupación en un mapa de ocupación egocéntrico.
egoMap.GridOriginInLocal = [-egoMap.XLocalLimits(2)/2, ...
-egoMap.YLocalLimits(2)/2];
Actualiza el Mapa de Ocupación Egocéntrica con Información de Obstáculos
Antes de actualizar el egoMap
, inicialice la ventana de visualización. Los obstáculos en la visualización egoMap
se representan en negro (ocupado) y el espacio libre en blanco (desocupado).
hAxes = exampleHelperSetupVisualization(scenario);
Configure un bucle para ejecutar el escenario usando advance(scenario)
. Este bucle debería mover el egoVehicle
a lo largo del camino, actualizando la pose a medida que se mueve.
Llame a move
en egoMap
usando la pose actualizada para obtener detecciones actualizadas. Limpia el mapa de todos los obstáculos para cada actualización.
% 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));
La información de límites de carriles y obstáculos generada a partir de un generador de detección de visión se utiliza para encontrar espacio ocupado que debe actualizarse en egoMap
.
Este ejemplo utiliza información de límites de carreteras extraída de los límites de carriles. También se considera ocupada la región situada fuera de los límites de las carreteras.
La función auxiliar exampleHelperGetObstacleDataFromSensor
extrae los límites de la carretera y la información de obstáculos generada por el generador de detección de visión.
[obstacleInfo, roadBorders, isValidLaneTime] = ... exampleHelperGetObstacleDataFromSensor(scenario, egoMap, ... egoVehicle, sensor);
Dependiendo del alcance del generador de detección de visión, las detecciones pueden quedar fuera de los límites de egoMap
. Usando los límites egoMap
, la función exampleHelperFitlerObstacles
extrae los obstáculos y el espacio libre que se encuentran dentro del mapa egocéntrico.
[obstaclePoints, unoccupiedSpace] = exampleHelperFilterObstacles(... egoMap, obstacleInfo, ... roadBorders, ... isValidLaneTime, egoVehicle);
Utilice los obstáculos filtrados y las ubicaciones de espacio libre para actualizar el mapa egocéntrico. Actualiza la visualización.
% 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