Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

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

Figure contains 2 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, patch. Axes object 2 with xlabel X (m), ylabel Y (m) contains 10 objects of type patch, line.

Figure contains 2 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, patch. Axes object 2 with xlabel X (m), ylabel Y (m) contains 10 objects of type patch, line.