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.

plannerControlRRT

Planificador RRT basado en control

Desde R2021b

    Descripción

    El objeto plannerControlRRT es un planificador de árbol aleatorio (RRT) de exploración rápida para resolver problemas de planificación cinemática y dinámica (kinodinámica) utilizando controles. El algoritmo RRT es una rutina de planificación de movimiento basada en árboles que hace crecer incrementalmente un árbol de búsqueda. En los planificadores cinemáticos, el árbol crece muestreando aleatoriamente estados en el espacio de configuración del sistema y luego intenta propagar el nodo más cercano hacia ese estado. El propagador de estado toma muestras de controles para alcanzar el estado según el modelo cinemático y las políticas de control. A medida que el árbol agrega nodos, los estados muestreados abarcan el espacio de búsqueda y eventualmente conectan los estados inicial y objetivo.

    Estos son los pasos del algoritmo RRT basado en control:

    • El planificador, plannerControlRRT, solicita un estado del espacio de estados.

    • Planner encuentra el estado más cercano en el árbol de búsqueda según el coste.

    • Propagador de estado, mobileRobotPropagator, muestra comandos de control y duraciones para propagarse hacia el estado objetivo.

    • El propagador de estado se propaga hacia el estado objetivo.

    • Si el propagador devuelve una trayectoria válida al estado, agregue el estado al árbol.

    • "Opcional": Intentar dirigir la trayectoria hacia la meta final basándose en las propiedades NumGoalExtension y GoalBias .

    • Continúe buscando hasta que el árbol de búsqueda alcance el objetivo o satisfaga otros criterios de salida.

    El beneficio de un planificador kinodinámico como plannerControlRRT es que se garantiza que devolverá una secuencia de estados, controles y referencias que comprenden una ruta cinemática o dinámicamente factible. El inconveniente de un planificador cinemático es que las propagaciones cinemáticas no pueden garantizar que los nuevos estados sean exactamente iguales a los estados objetivo a menos que exista una representación analítica para una secuencia de controles que impulsen el sistema entre dos configuraciones con cero error residual. Esto significa que los planificadores cinemáticos suelen ser asintóticamente completos y garantizan la viabilidad cinemática, pero a menudo no pueden garantizar la optimización asintótica.

    Creación

    Descripción

    ejemplo

    controlPlanner = plannerControlRRT(propagator) crea un planificador RRT kinodinámico a partir de un objeto propagador de estado y establece la propiedad StatePropagator .

    controlPlanner = plannerControlRRT(propagator,Name=Value) especifica propiedades adicionales utilizando argumentos de nombre-valor. Por ejemplo, plannerControlRRT(propagator,ContinueAfterGoalReached=1) continúa buscando rutas alternativas después de que el árbol alcanza la meta por primera vez.

    Propiedades

    expandir todo

    Propagador de estado de robot móvil, especificado como un objeto mobileRobotPropagator o un objeto de una subclase de nav.StatePropagator.

    Optimización después de alcanzar el objetivo, especificada como 0 (false) o 1 (true). Si se especifica como verdadero, el planificador continúa buscando rutas alternativas después de alcanzar la meta por primera vez. El planificador finaliza independientemente del valor de esta propiedad si alcanza el número máximo de iteraciones o el número máximo de nodos del árbol.

    Tipos de datos: logical

    Tiempo máximo permitido para la planificación, especificado como escalar positivo en segundos.

    Tipos de datos: single | double

    Número máximo de nodos en el árbol de búsqueda, excluido el nodo raíz, especificado como un entero positivo.

    Tipos de datos: single | double

    Número máximo de iteraciones, especificado como un entero positivo.

    Tipos de datos: single | double

    El número máximo de veces que el planificador puede propagarse hacia el objetivo, especificado como un número entero positivo. Después de agregar exitosamente un nuevo nodo al árbol, el planificador intenta propagar el nuevo nodo hacia el objetivo usando la función de objeto propagateWhileValid del propagador de estado. El planificador continúa propagándose hasta que la función devuelve un vector de estado vacío que indica que no se encuentra ningún control válido, el planificador alcanza el objetivo o la función ha sido llamada NumGoalExtension veces.

    Para desactivar este comportamiento, establezca la propiedad en 0. Desactivar este comportamiento dará como resultado una propagación aleatoria en lugar de hacia el objetivo.

    Tipos de datos: single | double

    Probabilidad de elegir el estado objetivo durante el muestreo de estados, especificada como un escalar real en el rango [0, 1]. Esta propiedad determina la probabilidad de que el planificador elija el estado objetivo real al seleccionar estados aleatoriamente del espacio de estados. Puede comenzar estableciendo la probabilidad en un valor pequeño, como 0.05.

    Tipos de datos: single | double

    Función de callback para determinar si se alcanza el objetivo, especificada como un identificador de función. Puede crear su propia función de objetivo alcanzado. La función debe seguir esta sintaxis:

     isReached = myGoalReachedFcn(planner,currentState,goalState)

    donde:

    • planner — es el objeto planificador creado, especificado como un objeto plannerControlRRT .

    • currentState — es el estado actual, especificado como un vector real de elemento s. s es el número de variables de estado en el espacio de estados.

    • goalState : es el estado objetivo, especificado como un vector real de elemento s. s es el número de variables de estado en el espacio de estados.

    • isReached : es un booleano que indica si el estado actual ha alcanzado el estado objetivo, devuelto como true o false.

    Tipos de datos: function handle

    Funciones del objeto

    planPlanificar una ruta cinemáticamente factible entre dos estados.
    copyCrea una copia profunda del objeto del planificador.

    Ejemplos

    contraer todo

    Planifique rutas de control para un modelo cinemático de bicicleta con el objeto mobileRobotPropagator . Especifique un mapa para el entorno, establezca límites estatales y defina una ubicación de inicio y objetivo. Planifique una ruta utilizando el algoritmo RRT basado en control, que utiliza un propagador de estado para planificar el movimiento y los comandos de control necesarios.

    Establecer parámetros de estado y propagador de estado

    Cargue una matriz de mapa ternario y cree un objeto occupancyMap . Cree el propagador de estado usando el mapa. De forma predeterminada, el propagador de estado utiliza un modelo cinemático de bicicleta.

    load('exampleMaps','ternaryMap')
    map = occupancyMap(ternaryMap,10);
    
    propagator = mobileRobotPropagator(Environment=map); % Bicycle model

    Establezca los límites estatales en el espacio de estados según los límites del mundo del mapa.

    propagator.StateSpace.StateBounds(1:2,:) = ...
                        [map.XWorldLimits; map.YWorldLimits];

    Planificar ruta

    Cree el planificador de ruta a partir del propagador de estado.

    planner = plannerControlRRT(propagator);

    Especifique los estados de inicio y objetivo.

    start = [10 15 0];
    goal  = [40 30 0];

    Planificar una ruta entre los estados. Para obtener resultados repetibles, reinicie el generador de números aleatorios antes de planificar. La función plan genera un objeto navPathControl , que contiene los estados, los comandos de control y las duraciones.

    rng("default")
    path = plan(planner,start,goal)
    path = 
      navPathControl with properties:
    
        StatePropagator: [1x1 mobileRobotPropagator]
                 States: [192x3 double]
               Controls: [191x2 double]
              Durations: [191x1 double]
           TargetStates: [191x3 double]
              NumStates: 192
            NumSegments: 191
    
    

    Visualizar resultados

    Visualice el mapa y trace los estados de la ruta.

    show(map)
    hold on
    plot(start(1),start(2),"rx")
    plot(goal(1),goal(2),"go")
    plot(path.States(:,1),path.States(:,2),"b")
    hold off

    Figure contains an axes object. The axes object with title 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

    Muestra las entradas de control [v psi] de velocidad de avance y ángulo de dirección.

    plot(path.Controls)
    ylim([-1 1])
    legend(["Velocity (m/s)","Steering Angle (rad)"])

    Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Velocity (m/s), Steering Angle (rad).

    Referencias

    [1] S.M. Lavalle, J.J. Kuffner, "Randomized kinodynamic planning", International Journal of Robotics Research, vol. 20, no. 5, pp. 378-400, May 2001

    [2] Kavraki, L. and S. LaValle. "Chapter 5 Motion Planning", 1st ed., B. Siciliano et O. Khatib, Ed. New York: Springer-Verlag Berlin Heidelberg, 2008, pp. 109-131.

    Capacidades ampliadas

    Generación de código C/C++
    Genere código C y C++ mediante MATLAB® Coder™.

    Historial de versiones

    Introducido en R2021b