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.

mpnetSE2

Redes de planificación de movimiento

Desde R2023b

    Descripción

    El objeto mpnetSE2 almacena redes de planificación de movimiento (MPNet) para usarlas en el muestreo del espacio de estados. MPNet es un enfoque basado en aprendizaje profundo que utiliza redes neuronales para realizar muestreos informados. MPNet utiliza conocimientos previos para encontrar muestras de estado óptimas para la planificación del movimiento utilizando diferentes planificadores. Usando este objeto, puedes:

    • Cargue un MPNet previamente entrenado y utilícelo para el muestreo del espacio de estados.

    • Configure un MPNnet no entrenado para entrenarlo en un nuevo conjunto de datos. Luego, utilice el MPNnet entrenado para el muestreo del espacio de estados.

    Utilice la función predict del objeto mpnetSE2 para predecir muestras de estado entre una pose inicial y una pose objetivo en un entorno de entrada conocido o desconocido. Utilice la función loss del objeto mpnetSE2 para calcular las pérdidas mientras entrena la red.

    Creación

    Descripción

    ejemplo

    mpnet = mpnetSE2 devuelve un MPNet no entrenado para entrenarlo y usarlo para muestrear el espacio de estados SE(2). Puede entrenar esta red en un conjunto de datos utilizando la función trainnet (Deep Learning Toolbox) .

    ejemplo

    mpnet = mpnetSE2(Name=Value) especifica propiedades utilizando uno o más argumentos de nombre-valor. Puede especificar las Network, StateBounds, LossWeights y EncodingSize como argumentos de nombre-valor .

    Utilice la propiedad Network para almacenar una red neuronal profunda que puede utilizar para encontrar muestras de espacio de estados en un entorno conocido o desconocido. Luego puede utilizar las muestras seleccionadas para la planificación del movimiento utilizando diferentes planificadores de ruta.

    Nota

    Para ejecutar esta función, necesitará el Deep Learning Toolbox™.

    Propiedades

    expandir todo

    MPNet previamente entrenado o no entrenado, especificado como un objeto dlnetwork (Deep Learning Toolbox) o layerGraph (Deep Learning Toolbox) . De forma predeterminada, esta propiedad contiene un MPNet no entrenado.

    Límites de las variables del espacio de estados SE(2), especificadas como una matriz de valores reales de 3 por 2.

    • La primera fila especifica los límites inferior y superior de la variable de estado x en metros.

    • La segunda fila especifica los límites inferior y superior de la variable de estado y en metros.

    • La tercera fila especifica los límites inferior y superior de la variable de estado θ en radianes.

    Tipos de datos: double

    Pesos de la función de pérdida, especificados como un vector de tres elementos de valores positivos reales para cada variable de estado, x, y y θ, del espacio de estados SE (2).

    La pérdida de entrenamiento para MPNet es la distancia cuadrática media ponderada entre los estados previstos y los estados reales. Los pesos de la función de pérdida especifican el valor de peso para cada variable del espacio de estados mientras se calcula la pérdida.

    Tipos de datos: single | double

    Tamaño del entorno codificado, especificado como un vector de dos elementos de enteros no negativos o un escalar no negativo.

    • Si se especifica como un vector, los elementos del vector especifican el tamaño del entorno codificado en las direcciones x y y .

    • Si se especifica como escalar, el objeto utiliza el valor especificado para las direcciones x y y .

    El entorno codificado es una representación compacta de los mapas de entrada. La función codifica los mapas de entrada utilizando el enfoque de codificación del conjunto de puntos básicos (BPS) presentado en [1]. EncodingSize especifica el número de puntos básicos que se utilizarán para la representación compacta de mapas de entrada.

    Por ejemplo, si Nsv es el número de variables de estado que definen el espacio de estado de entrada y [Ex Ey] es el tamaño del entorno codificado, entonces el tamaño del entorno codificado y el número de entradas al MPNnet debe satisfacer esta ecuación:

    NumInputs = 2×(Nsv+1) + (Ex×Ey)

    .

    Si entrena MPNet en un solo entorno de mapa, no es necesario codificar el mapa. Porque codificar un entorno no afectará las predicciones de la red. Por lo tanto, puede establecer el valor EncodingSize en 0.

    Tipos de datos: single | double

    Esta propiedad o parámetro es de solo lectura.

    Número de entradas al MPNet, almacenadas como un entero positivo. El valor predeterminado es 108.

    El número de entradas a la red está determinado por la suma del tamaño del entorno codificado y el número de variables del espacio de estados que representan tanto el estado actual como el estado objetivo. El estado actual y el estado objetivo se proporcionan como entradas a la red en el formato x, y, cosθ y sinθ. Por lo tanto, el número de variables del espacio de estados proporcionadas como entrada a la red es 8. El tamaño predeterminado del entorno codificado es 10 por 10. Por lo tanto, el número predeterminado de entradas a la red es (10×10)+8 = 108.

    Si el tamaño del entorno codificado se especifica como 0, el número de entradas a la red es 8.

    Tipos de datos: double

    Esta propiedad o parámetro es de solo lectura.

    Número de salidas de MPNet, almacenadas como 4. La red genera variables de espacio de estado, x, y, cosθ y sinθ, que representan el siguiente estado previsto.

    Tipos de datos: double

    Funciones del objeto

    predictPredecir muestras de estado usando MPNet
    lossCalcular la pérdida entre los estados previstos y los estados reales
    copyCrear copia profunda del objeto mpnetSE2

    Ejemplos

    contraer todo

    Entrene una red de planificación de movimiento (MPNet), en un entorno de mapa único, para el muestreo del espacio de estados. En el caso de un entorno de mapa único, se utiliza un mapa fijo para entrenar y probar la red. Luego, puede utilizar la red entrenada para calcular muestras de estado entre cualquier pose inicial y pose objetivo en el mapa. Primero, debe configurar un MPNet y entrenar la red en un pequeño conjunto de datos. Utilice la pérdida de entrenamiento para evaluar la precisión de la red. Si entrena MPNet en un gran conjunto de datos de entrenamiento creado utilizando múltiples entornos de mapas, también debe calcular la pérdida de validación para ajustar la precisión de la red. Para obtener información sobre cómo entrenar MPNet en múltiples entornos de mapas para muestreo de espacio de estados, consulte Entrene un muestreador basado en aprendizaje profundo para la planificación del movimiento.

    Cargar e inspeccionar datos de entrenamiento

    Cargue el mapa de entrada y los datos de entrenamiento en el espacio de trabajo de MATLAB® .

    data = load("singleTrainData.mat","trainData","map")
    data = struct with fields:
        trainData: {100×1 cell}
              map: [1×1 binaryOccupancyMap]
    
    
    map = data.map;

    Los datos de entrenamiento constan de muestras de estado óptimo calculadas para múltiples valores aleatorios de poses iniciales y poses de destino en un mapa de laberinto. Extraiga los datos de entrenamiento de la estructura de datos.

    trainData = data.trainData;

    Inspeccionar los datos de entrenamiento. Los datos de entrenamiento son un arreglo de celdas de tamaño 100 por 1 que contiene 100 muestras de estado para usar en el entrenamiento de la red.

    size(trainData)
    ans = 1×2
    
       100     1
    
    

    Lea las muestras de estado de los datos de entrenamiento. Trazar el mapa de entrada y las muestras del estado de entrenamiento.

    figure
    show(map)
    hold on
    for n = 1:100
        pathSample = trainData{n};
        plot(pathSample(:,1),pathSample(:,2),plannerLineSpec.state{:})
    end
    hold off

    Crear MPNet y establecer parámetros de red

    Cree un MPNnet no entrenado utilizando el objeto mpnetSE2 .

    mpnet = mpnetSE2
    mpnet = 
      mpnetSE2 with properties:
    
         StateBounds: [3×2 double]
         LossWeights: [1 1 1]
        EncodingSize: [10 10]
           NumInputs: 108
          NumOutputs: 4
             Network: [1×1 dlnetwork]
    
    

    Visualiza la red. Para comprender mejor la arquitectura de la red, inspeccione las capas de la red y la cantidad de entradas a cada capa.

    analyzeNetwork(mpnet.Network)

    Establezca la propiedad StateBounds del objeto mpnetSE2 a los límites del mapa de entrada.

    x = map.XWorldLimits;
    y = map.YWorldLimits;
    theta = [-pi pi];
    stateBounds = [x; y; theta];
    mpnet.StateBounds = stateBounds;

    Establezca la propiedad EncodingSize del objeto mpnetSE2 en 0. Esto indica que la función no debe codificar el mapa de entrada para entrenar la red. Establecer la propiedad EncodingSize en 0 cambia la propiedad NumInputs del MPNnet a 8.

    mpnet.EncodingSize = 0
    mpnet = 
      mpnetSE2 with properties:
    
         StateBounds: [3×2 double]
         LossWeights: [1 1 1]
        EncodingSize: [0 0]
           NumInputs: 8
          NumOutputs: 4
             Network: [1×1 dlnetwork]
    
    

    Establezca la propiedad LossWeights del objeto mpnetSE2 en [10 10 0]. Para valores de peso más altos, la red tarda más épocas en converger. Si la entrada es un espacio de estados SE(2), el valor de peso para la variable del espacio de estadosθse establece en 0.

    mpnet.LossWeights = [10 10 0];

    Preparar datos de entrenamiento

    Prepare los datos de entrenamiento convirtiendo las muestras a un formato requerido para entrenar MPNet. La función mpnetPrepareData reescala los valores de los estados de ruta óptimos al rango [0, 1] y los almacena como un objeto datastore para usar con la función de entrenamiento.

    dsTrain = mpnetPrepareData(trainData,mpnet);

    Tren MPNet

    Cree un objeto trainingOptions para entrenar el MPNet. Estas opciones de formación se han elegido de forma experimental. Si utiliza un nuevo conjunto de datos para el entrenamiento, debe cambiar sus opciones de entrenamiento para lograr la precisión de entrenamiento deseada.

    • Utilice el optimizador Adam.

    • Establezca el tamaño de los minilotes de entrenamiento en 20.

    • Mezcla el almacén de datos de entrenamiento en cada época.

    • Establezca el número máximo de épocas en 50.

    options = trainingOptions("adam", ...
        MiniBatchSize=20, ...
        MaxEpochs=50, ...
        Shuffle="every-epoch", ...
        Plots="training-progress", ...   
        VerboseFrequency=500);

    Entrene el MPNet usando la función trainnet . Especifique la función de pérdida y las opciones de entrenamiento como entradas a la función de entrenamiento. Para obtener resultados óptimos, la pérdida de entrenamiento debe converger a cero.

    [net,info] = trainnet(dsTrain,mpnet.Network,@mpnet.loss,options);
        Iteration    Epoch    TimeElapsed    LearnRate    TrainingLoss
        _________    _____    ___________    _________    ____________
                1        1       00:00:02        0.001          6.2466
              500        6       00:00:24        0.001        0.042451
             1000       12       00:00:38        0.001        0.073534
             1500       17       00:00:52        0.001        0.038856
             2000       23       00:01:04        0.001        0.041173
             2500       29       00:01:16        0.001        0.021427
             3000       34       00:01:28        0.001        0.044795
             3500       40       00:01:39        0.001        0.030961
             4000       45       00:01:50        0.001        0.028537
             4450       50       00:02:01        0.001        0.017648
    Training stopped: Max epochs completed
    

    Establezca la propiedad Network del objeto mpnetSE2 en la red entrenada.

    mpnet.Network = net; 

    Realice un muestreo del espacio de estados utilizando MPNet entrenado

    Especifique una pose inicial y una pose objetivo para calcular muestras de estado.

    start= [2 2 0];
    goal= [9 6 0];

    Cree un objeto de espacio de estados para los límites de estado especificados.

    stateSpace = stateSpaceSE2(stateBounds);

    Configure el objeto stateSamplerMPNet para utilizar el MPNet entrenado para el muestreo del espacio de estados. Pase el entorno del mapa, el estado inicial y el estado objetivo como entradas al muestreador de estado. Establezca los límites para el número máximo de muestras aprendidas a considerar en 50.

    stateSamplerDL = stateSamplerMPNET(stateSpace,mpnet,Environment=map,StartState=start,GoalState=goal,MaxLearnedSamples=50);

    Genera 50 muestras de estado entre las poses inicial y meta.

    samples = sample(stateSamplerDL,50);

    Trazar las muestras de estado generadas. Observe que las muestras de estado generadas se centran entre los estados inicial y objetivo, y no están dispersas por todo el entorno del mapa. Puede reducir el tiempo de búsqueda y encontrar rutas óptimas rápidamente utilizando estas muestras de estado como semillas para la planificación del movimiento.

    figure
    show(map)
    hold on
    plot(samples(:,1),samples(:,2),plannerLineSpec.state{:})
    plot(start(1),start(2),plannerLineSpec.start{:})
    plot(goal(1),goal(2),plannerLineSpec.goal{:})
    legend(Location="eastoutside")

    Más información

    También puede guardar el MPNnet entrenado en un archivo .mat para uso futuro. Guarde la red entrenada, los pesos perdidos y otros parámetros de la red en el archivo .mat . Para obtener información sobre cómo utilizar una red previamente entrenada para el muestreo del espacio de estados, consulte Predecir muestras de estado utilizando MPNnet entrenado en un solo entorno.

    networkInput = mpnet.NumInputs;
    networkOutput = mpnet.NumOutputs;
    networkLossWeights = mpnet.LossWeights;
    save("trainSingleMap.mat","net","map","networkInput","networkOutput","networkLossWeights");

    Cargue un archivo de datos que contenga un MPNet previamente entrenado en el espacio de trabajo de MATLAB . El MPNet ha sido entrenado en mapas de laberintos 2-D generados aleatoriamente con anchos y alturas de 10 metros y una resolución de 2,5 celdas por metro. Los mapas de laberinto contienen un ancho de paso de 5 celdas de cuadrícula y un espesor de pared de 1 celda de cuadrícula.

    data = load("mazeMapTrainedMPNET.mat")
    data = struct with fields:
          encodingSize: [9 9]
           lossWeights: [100 100 0]
            mazeParams: {[5]  [1]  'MapSize'  [10 10]  'MapResolution'  [2.5000]}
           stateBounds: [3x2 double]
        trainedNetwork: [1x1 dlnetwork]
    
    

    Crea un mapa de laberinto aleatorio para usarlo en la planificación de movimientos. El tamaño de la cuadrícula (MapResolution×MapSize) debe ser el mismo que el de los mapas utilizados para entrenar el MPNet.

    rng(50,"twister")
    map = mapMaze(5,1,MapSize=[20 20],MapResolution=1.25);

    Especifique la pose inicial y la pose objetivo.

    start = [2 8 0];
    goal = [18 18 0];

    Especifique los límites de estado y cree un objeto de espacio de estado SE(2).

    x = map.XWorldLimits;
    y =  map.YWorldLimits;
    theta = [-pi pi];
    stateBounds = [x; y; theta];
    stateSpace = stateSpaceSE2(stateBounds);

    Configure el objeto mpnetSE2 para utilizar el MPNet previamente entrenado para predecir muestras de estado en un mapa aleatorio. Establezca los valores de propiedad EncodingSize del objeto mpnetSE2 a los valores utilizados para entrenar la red.

    mpnet = mpnetSE2(Network=data.trainedNetwork,StateBounds=stateBounds,EncodingSize=data.encodingSize);

    Cree un muestreador de estado de MPNnet para calcular las muestras de estado. Especifique el entorno del mapa y las posiciones de inicio y meta como entradas para el muestreador de estado.

    mpnetSampler = stateSamplerMPNET(stateSpace,mpnet,Environment=map,StartState=start,GoalState=goal);

    Genere 30 muestras del espacio de estados de entrada para la planificación del movimiento.

    samples = sample(mpnetSampler,30);

    Muestre el mapa de entrada y trace las muestras de estado calculadas.

    figure
    show(map)
    hold on
    plot(start(1),start(2),plannerLineSpec.start{:})
    plot(goal(1),goal(2),plannerLineSpec.goal{:})
    plot(samples(:,1),samples(:,2),plannerLineSpec.state{:})
    legend(Location="bestoutside")
    hold off

    Figure contains an axes object. The axes object with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 4 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Start, Goal, State.

    Referencias

    [1] Prokudin, Sergey, Christoph Lassner, and Javier Romero. “Efficient Learning on Point Clouds with Basis Point Sets.” In 2019 IEEE/CVF International Conference on Computer Vision Workshop (ICCVW), 3072–81. Seoul, Korea (South): IEEE, 2019. https://doi.org/10.1109/ICCVW.2019.00370.

    [2] Qureshi, Ahmed Hussain, Yinglong Miao, Anthony Simeonov, and Michael C. Yip. “Motion Planning Networks: Bridging the Gap Between Learning-Based and Classical Motion Planners.” IEEE Transactions on Robotics 37, no. 1 (February 2021): 48–66. https://doi.org/10.1109/TRO.2020.3006716.

    Capacidades ampliadas

    Historial de versiones

    Introducido en R2023b