Contenido principal

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éntrica desde la appDriving 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 más información, 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).

Obtener información sobre los límites de carril y obstáculos según el 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. Crea un escenario usando 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 más información, 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 los actorProfiles para el escenario, que contienen los 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 simulación. Esta llamada de objeto sensor ocurre en la función auxiliar exampleHelperGetObstacleDataFromSensor.

Crear un mapa de ocupación egocéntrica

Este ejemplo utiliza un objeto binaryOccupancyMap para crear un mapa de ocupación egocéntrica.

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];

Actualizar el mapa de ocupación egocéntrica con información sobre obstáculos

Antes de actualizar egoMap, inicialice la ventana de visualización. Los obstáculos en la visualización egoMap se representan en negro (ocupados) y el espacio libre en blanco (desocupado).

hAxes = exampleHelperSetupVisualization(scenario);

Configura un bucle para ejecutar el escenario usando advance(scenario). Este bucle debe mover el egoVehicle a lo largo de la carretera, 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 sobre los límites de carril y los obstáculos generada por un generador de detección de visión se utiliza para encontrar espacio ocupado que necesita 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 rango del generador de detección de visión, las detecciones pueden quedar fuera de los límites egoMap. Utilizando 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.