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.

Planificación de movimiento con capacidad inversa para modelo de tractor-remolque mediante planificadorControlRRT

Este ejemplo muestra cómo encontrar soluciones de planificación de rutas globales para sistemas con cinemática compleja utilizando el planificador basado en cinemática, plannerControlRRT. El ejemplo está organizado en tres secciones principales:

  1. Introducción a la planificación cinedinámica.

  2. Adaptación de plannerControlRRT a un sistema tractor-remolque.

  3. Búsqueda de trayectorias libres de colisiones mediante un sistema cinemático.

Introducción a la planificación cinedinámica

Descripción del planificador

Los planificadores geométricos convencionales, como RRT, RRT* e hybridA*, son algoritmos rápidos y extensibles capaces de encontrar soluciones completas y óptimas a una amplia variedad de problemas de planificación. Sin embargo, una desventaja es que hacen suposiciones sobre el espacio de planificación que pueden no ser ciertas para un sistema del mundo real. Los planificadores geométricos convencionales suponen que dos estados cualesquiera en un espacio pueden conectarse mediante una trayectoria sin error residual, y que el sistema físico puede rastrear las rutas devueltos por el planificador geométrico.

Para sistemas con cinemática compleja, o aquellos que no tienen soluciones de forma cerrada fáciles de determinar para conectar estados, utilice planificadores kinodinámicos, como plannerControlRRT. Los planificadores kinodinámicos intercambian integridad por flexibilidad de planificación y aprovechan el modelo cinemático y el controlador propios del sistema para generar trayectorias factibles y rastreables.

Para planificar un sistema determinado, la función plannerControlRRT requiere esta información:

  • Una utilidad para muestrear estados en el espacio de planificación.

  • Una métrica para estimar el coste de conectar dos estados.

  • Un mecanismo para propagar deterministamente el sistema de un estado a otro.

  • Una utilidad para determinar si un estado ha alcanzado la meta.

Este ejemplo demuestra cómo formular estas diferentes utilidades para un sistema de camión con remolque y adaptarlas a la infraestructura de planificación. Esta vista previa muestra el resultado:

% Attempt to generate MEX to accelerate collision checking
genFastCC
Code generation successful.
% load preplannedScenarios
parkingScenario = load("parkingScenario.mat");
planner = parkingScenario.planner;
start   = parkingScenario.start;
goal    = parkingScenario.goal;

% Display the scenario and play back the trajectory
show(planner.StatePropagator.StateValidator);
axis equal 
hold on
trajectory = plan(planner,start,goal);
demoParams = trajectory.StatePropagator.StateSpace.TruckParams;
exampleHelperPlotTruck(demoParams,start); % Display start config
exampleHelperPlotTruck(demoParams,goal);  % Display goal config

% Plan path using previously-built utilities
rng(1)
trajectory = plan(planner,start,goal);

% Animate the trajectory
exampleHelperPlotTruck(trajectory); 
hold off

Figure contains an axes object. The axes object contains 30 objects of type patch, line, rectangle.

Algoritmo de planificación cinedinámica

Si ya está familiarizado con los planificadores geométricos, una iteración del algoritmo de búsqueda plannerControlRRT debería resultarle familiar, pero con algunos pasos adicionales:

  1. Muestra de un estado objetivo.

  2. Encuentre el vecino más cercano aproximado al estado de destino en el árbol de búsqueda.

  3. Generar una entrada de control (o valor de referencia) y una duración de control que impulse el sistema hacia el objetivo.

  4. Propagar (extender) el sistema hacia la muestra mientras valida estados intermedios a lo largo de la trayectoria propagada. Devuelve la secuencia válida de estados, controles y duraciones.

  5. Verificar si alguno de los estados devueltos ha alcanzado el objetivo.

  6. Si se ha encontrado el objetivo, salir. De lo contrario, agregue el estado final, el control inicial, la duración acumulada y el objetivo al árbol.

  7. (Opcional) Pruebe una configuración y control de objetivos y repita los pasos 4, 5 y 6 la cantidad de veces deseada.

Componentes requeridos por plannerControlRRT Framework

Para adaptar el planificador a un problema específico, debe implementar clases personalizadas nav.StatePropagator y nav.StateSpace. La siguiente sección asigna los pasos descritos en la sección Algoritmo de planificación kinodinámica a la clase y al método responsables:

  1. qtgt=sampleUniform(space)

  2. [dist,err]=distance(propagator,Qtree,qtgt)

  3. [u,Nstep]=sampleControl(propagator,q0,u0,qtgt)

  4. [Q1:n,U1:n,nstep1:n]valid=propagateWhileValid(propagator,q0,u0,qtgt,Nstep)

  5. plannerControlRRT comprueba si alguno de los estados devueltos ha alcanzado el objetivo.

  6. De forma predeterminada, la salida de la planificación o la adición al árbol de búsqueda se realiza mediante la función distance del propagador. Puede anularlo proporcionando al planificador un controlador de función durante la construcción.

  7. De forma predeterminada, cada vez que el planificador agrega con éxito un nodo al árbol, intentará propagar este estado recién agregado hacia la configuración de objetivos. Esta propagación de objetivos puede ocurrir varias veces seguidas o deshabilitarse por completo modificando la propiedad NumGoalExtension del planificador.

Para obtener una sintaxis de función más detallada, requisitos de argumentos y ejemplos, consulte plannerControlRRT, nav.StateSpace, y nav.StatePropagator.

Adaptación de plannerControlRRT a un sistema de camión-remolque

Esta sección demuestra cómo formular, modelar y controlar un sistema de camión-remolque de dos cuerpos. Este sistema es inherentemente inestable durante el movimiento inverso, por lo que es poco probable que las trayectorias devueltas por los planificadores geométricos convencionales produzcan buenos resultados durante el seguimiento de la trayectoria. Para modelar con precisión este sistema, debe:

  • Defina una función de transición de estado.

  • Definir los parámetros del modelo geométrico.

  • Cree una ley de control que se ajuste al modelo parametrizado.

  • Cree una heurística de distancia adaptada al modelo parametrizado.

  • Empaquete el modelo cinemático, la métrica de distancia y la ley de control dentro de un espacio de estados personalizado y un propagador de estados.

  • Planifique una ruta para varios escenarios de problemas.

Definir la función de transición de estado

Este sistema de tractor-remolque está compuesto por dos cuerpos rígidos conectados a un enganche de pivote, que se modela como una junta giratoria. La carrocería del remolque hace contacto con el suelo en el eje trasero y la parte delantera del remolque está sostenida por el enganche, ubicado en algún lugar a lo largo de la línea central axial del camión.

TrailingConfiguration.pngOvercenterConfiguration.png

Configuración de seguimiento (izquierda, M < 0), configuración sobre el centro (derecha, M < 0)

Utilice la configuración geométrica para un sistema de camión-remolque de dos cuerpos del ejemplo de Estacionamiento automático de camiones y remolques usando MPC no lineal de etapas múltiples, expresada como:

qsys=[x2 y2 θ2 β],

donde:

  • x2 — Posición global x del centro del eje trasero del remolque.

  • y2 — Posición global y del centro del eje trasero del remolque.

  • θ2 — Ángulo global de la orientación del remolque, donde 0 es el este.

  • β — Orientación del camión con respecto al remolque, donde 0 está alineado.

Para fines de planificación, agregue un indicador de dirección, vsign, y la distancia total recorrida desde la configuración inicial, stot al vector de estado, para la notación del estado final:

q=[x2y2θ2βvsignstot]

  • vsign — Indica el modo de control deseado (avance o retroceso) o la velocidad requerida, asegurando que el sistema se propague hacia el objetivo en la dirección deseada.

  • stot — Modifica el comportamiento de la función distance del propagador. Puede modificar la propiedad TravelBias del propagador para cambiar la frecuencia con la que la comparación del vecino más cercano incluye o excluye el costo de raíz a nodo. Los valores más cercanos a 0 dan como resultado una búsqueda más rápida del espacio de planificación, a expensas de que se realicen más conexiones localmente óptimas. Los valores más cercanos a 1 pueden mejorar las soluciones del planificador, pero aumentan el tiempo de planificación.

Esta función de transición de estado es una extensión de TruckTrailerStateFcn. Para una derivación completa de la función de transición de estado, consulte exampleHelperStateDerivative, que es una simplificación de este modelo de N-trailer [1]:

q˙(L1,L2,M,q,uapp)=[x2˙y2˙θ2˙β˙0v]

Para simplificar, este modelo trata uapp=[v,αsteer] como el comando de velocidad instantánea y ángulo de dirección aplicado al sistema, generado por un controlador de nivel superior. Para obtener más información, consulte Crear leyes de control para movimiento estable hacia adelante y hacia atrás.

Definir parámetros del modelo geométrico y demostrar inestabilidad

Las características cinemáticas de este vehículo están fuertemente influenciadas por la elección de los parámetros del modelo. Crear una estructura que describa un sistema de tractor-remolque.

truckParams = struct;
truckParams.L1 = 6;     % Truck body length
truckParams.L2 = 10;    % Trailer length
truckParams.M  = 1;     % Distance between hitch and truck rear axle along truck body +X-axis

Defina propiedades relacionadas con la visualización y la verificación de colisiones.

truckParams.W1 = 2.5;               % Truck width
truckParams.W2 = 2.5;               % Trailer width
truckParams.Lwheel = 1;             % Wheel length
truckParams.Wwheel = 0.4;           % Wheel width

Utilizando la función exampleHelperShowOpenLoopDynamics y los parámetros de modelo especificados, propague el estado del sistema utilizando su dinámica de bucle abierto para demostrar que el ángulo interior es autoestabilizador durante el movimiento hacia adelante e inestable durante el movimiento hacia atrás para cualquier β0 distinto de cero.

exampleHelperShowOpenLoopDynamics(truckParams);

Figure contains 2 axes objects. Axes object 1 with title Interior Angle vs Time, v > 0, xlabel Time (s), ylabel Interior Angle (rad) contains 11 objects of type line. Axes object 2 with title Interior Angle vs Time, v < 0, xlabel Time (s), ylabel Interior Angle (rad) contains 11 objects of type line.

MATLAB figure

Cree leyes de control para un movimiento estable hacia adelante y hacia atrás

Este ejemplo emplea un controlador de cambio de modo multicapa para controlar el modelo de camión-remolque. En el nivel superior, un controlador de persecución pura calcula un punto de referencia, P=[Xp,Yp], entre una pose actual, qi, y un estado objetivo, qtgt. El controlador tiene dos modos, avance y retroceso. Para obtener información sobre la base de esta ley de control, consulte [1]. Para el movimiento hacia adelante, el controlador calcula un ángulo de dirección que, cuando se mantiene constante, impulsa el eje trasero del camión a lo largo de un arco que cruza el punto de referencia:

q1i=[x1,y1θ1]i

θerr=atan2(Xp-x1,Yp-y1)-θ1

αfwd=f(θerr)

Para el movimiento inverso, el eje trasero del remolque pasa al estado controlado, q2=[x2,y2,θ2]. Además, debido a que el sistema es inherentemente inestable durante el movimiento en reversa, la ley de control trata el ángulo de dirección devuelto por el controlador de nivel superior como un valor de referencia para un controlador LQ de ganancia programada, que busca estabilizar el ángulo interior del vehículo:

θerr=atan2(Xp-x2,Yp-y2)-θ2

βd=-atan(2L2sin(θerr)R)

βref=βd+Kp(βd-β)

Estabilización de retroalimentación LQ

Durante el movimiento en reversa, puede agregar una ganancia al ángulo de dirección que lleva el ángulo interior a un punto de equilibrio. Utilice el controlador LQ para calcular el ángulo de dirección deseado y las ganancias de retroalimentación. Las ganancias son la solución óptima a la ecuación algebraica de Ricatti, almacenada como una tabla de búsqueda que depende del ángulo de dirección deseado. Para obtener más información sobre la derivación de este controlador de retroalimentación, consulte exampleHelperCalculateLQGains:

% Define Q/R weight matrices for LQR controller
Q = 10; % Weight driving betaDot -> 0
R = 1; % Weight minimizing steering angle command

% Derive geometric steering limits and solve for LQR feedback gains
[alphaLimit, ...        % Max steady-state steering angle before jack-knife
 betaLimit, ...         % Max interior angle before jack-knife
 alphaDesiredEq, ...    % Sampled angles from stable alpha domain
 alphaGain ...          % LQ gain corresponding to desired alpha
] = exampleHelperCalculateLQGains(truckParams,Q,R);

Figure contains an axes object. The axes object with title Trailer Axial Velocity VS Steering Angle, xlabel Desired Steering Angle (rad), ylabel Axial Velocity (m/s) contains 2 objects of type line. One or more of the lines displays its values using only markers

Figure contains an axes object. The axes object with title LQ Gain vs Desired Steering Angle, xlabel Desired Steering Angle (rad), ylabel LQR Gain contains an object of type line.

% Add limits to the truck geometry
truckParams.AlphaLimit = alphaLimit;
truckParams.BetaLimit = betaLimit;

Especifique las distancias de anticipación para el controlador de persecución pura, exampleHelperPurePursuitGetSteering,, y la información de velocidad y lapso de tiempo para nuestro simulador de modelos, exampleHelperPropagateTruck. Debido a que el movimiento en reversa es inestable y solo tiene control indirecto sobre el ángulo interior, especifique una distancia de anticipación mayor en reversa. Esto le da al sistema más tiempo para minimizar el error de dirección virtual mientras mantiene un ángulo interior estable.

% Select forward and reverse lookahead distances. For this example,
% use a reverse lookahead distance twice as long as the forward
% lookahead distance, which itself is slightly longer than the 
% wheelbase. You can tune these parameters can be tuned for
% improved performance for a given geometry.
rFWD = truckParams.L1*1.2;
rREV = rFWD*2;

% Define parameters for the fixed-rate propagator and add them to the
% control structure
controlParams.MaxVelocity = 3; % m/s
controlParams.StepSize = .1; % s
controlParams.MaxNumSteps = 50; %#ok<STRNU> % Max number of steps per propagation

Crear una estructura de la información relacionada con el control.

% Store gains and control parameters in a struct
controlParams = struct(...
    'MaxSteer',alphaLimit, ...          % (rad)
    'Gains',alphaGain, ...              % ()
    'AlphaPoints',alphaDesiredEq, ...   % (rad)
    'ForwardLookahead',rFWD, ...        % (m)
    'ReverseLookahead',rREV, ...        % (m)
    'MaxVelocity', 3, ...               % (m/s)
    'StepSize', 0.1, ...                % (s)
    'MaxNumSteps', 200 ...               % ()
    );

Definir una heurística de distancia

Defina una heurística de distancia para aproximar el coste entre diferentes configuraciones en el espacio de estados del sistema. El propagador de estado usa esto cuando el planificador intenta encontrar el nodo del árbol más cercano a un estado muestreado. Calcule el costo sin conexión utilizando la función exampleHelperCalculateDistanceMetric, que lo almacena en una tabla de búsqueda.

distanceHeuristic = exampleHelperCalculateDistanceMetric(truckParams,controlParams);

Figure contains 2 axes objects. Axes object 1 with title Forward Simulations, xlabel x1, ylabel y1 contains 2 objects of type line. These objects represent Trajectories, XY Error. Axes object 2 with title Forward Cost, xlabel x1, ylabel y1 contains an object of type image.

Figure contains 2 axes objects. Axes object 1 with title Reverse Simulations, xlabel x2, ylabel y2 contains 2 objects of type line. These objects represent Trajectories, XY Error. Axes object 2 with title Reverse Cost, xlabel x2, ylabel y2 contains an object of type image.

Adaptar el sistema para su uso con el planificador cinemático

Adaptar el sistema a un marco utilizable por el planificador de trayectoria cinemático, plannerControlRRT. Cree 3 clases personalizadas: exampleHelperTruckStateSpace, exampleHelperTruckPropagator y exampleHelperTruckValidator, que heredan de las subclases nav.StateSpace, nav.StatePropagator y nav.StateValidator, respectivamente.

Inicializar espacio de estados

El objeto del espacio de estados es el principal responsable de:

  • Muestreo de estados aleatorios para el planificador.

  • Definir y hacer cumplir los límites estatales dentro de una trayectoria.

Define límites xy- para la región de búsqueda. Inicialice el espacio de estados utilizando estos límites y los límites β determinados por las propiedades geométricas del remolque del camión.

Dado que el planificador cinemático utiliza la función distance del propagador de estados para su búsqueda del vecino más cercano, deje el método distance del espacio de estados sin definir. Deje los métodos interpolate y sampleGaussian del espacio de estados igualmente sin definir.

% Define limits of searchable region
xyLimits = [-60 60; -40 40];

% Construct our state-space
stateSpace = exampleHelperTruckStateSpace(xyLimits, truckParams);

Inicializar validador de estado

En este ejemplo, el validador de estado utiliza cuadros delimitadores orientados (OBB) para verificar si el vehículo colisiona con el entorno. El camión está representado por dos rectángulos con poses definidas por el estado y la geometría del vehículo del camión contenido en el objeto del espacio de estados. El entorno está representado por una lista de rectángulos con sus ubicaciones, orientaciones y dimensiones especificadas en una estructura de 1 por N. Cargue un archivo MAT que contenga el entorno en el espacio de trabajo y utilice los obstáculos y el objeto del espacio de estado para construir el validador de estado.

% Load a set of obstacles
load("Slalom.mat");

% Construct the state validator using the state space and list of obstacles
validator = exampleHelperTruckValidator(stateSpace,obstacles);

Inicializar propagador de estado

En la planificación cinemática, el objeto propagador de estado es responsable de:

  • Estimación de la distancia entre estados.

  • Muestreo de controles iniciales para propagarlos a lo largo de un intervalo de control, o capturar entradas de control como valores de referencia para controladores de nivel inferior durante la propagación.

  • Propagar el sistema hacia un objetivo y devolver la parte válida de la trayectoria al planificador.

Para obtener mejores resultados, la función distance debe estimar el costo de la trayectoria generada al propagarse entre estados.

% Construct the state propagator using the state validator, control parameters,
% and distance lookup table
propagator = exampleHelperTruckPropagator(validator,controlParams,distanceHeuristic);

Planificador de construcción y ruta del plan

Construya un planificador de rutas cinemático que utilice el propagador de estado para buscar una ruta entre las dos configuraciones.

% Define start configuration
start = [35 5 pi/2 0 0 0];

% Define the goal configuration such that the truck must reverse into
% position.
goal  = [-35 20 -pi/2 0 -1 nan];

% Display the problem
figure
show(validator)
hold on
configs = [start; goal];
quiver(configs(:,1),configs(:,2),cos(configs(:,3)),sin(configs(:,3)),.1)

Figure contains an axes object. The axes object contains 5 objects of type rectangle, patch, quiver.

% Define a function to check if planner has reached the true goal state
goalFcn = @(planner,q,qTgt)exampleHelperGoalReachedFunction(goal,planner,q,qTgt);

% Construct planner
planner = plannerControlRRT(propagator,GoalReachedFcn=goalFcn,MaxNumIteration=30000);
planner.NumGoalExtension = 3;
planner.MaxNumTreeNode = 30000;
planner.GoalBias = .25;
% Search for the path
rng(0)
[trajectory,treeInfo] = plan(planner,start,goal)
trajectory = 
  navPathControl with properties:

    StatePropagator: [1×1 exampleHelperTruckPropagator]
             States: [23×6 double]
           Controls: [22×4 double]
          Durations: [22×1 double]
       TargetStates: [22×6 double]
          NumStates: 23
        NumSegments: 22

treeInfo = struct with fields:
     IsPathFound: 1
        ExitFlag: 1
     NumTreeNode: 2201
    NumIteration: 1196
    PlanningTime: 5.3061
        TreeInfo: [6×6602 double]

% Visualize path and waypoints
exampleHelperPlotTruck(trajectory);
hold off

Figure contains an axes object. The axes object contains 14 objects of type patch, line, rectangle, quiver.

En lugar de producir soluciones óptimas, como las generadas en el ejemplo de estacionamiento automático de camiones y remolques utilizando MPC no lineal de etapas múltiples, la ventaja de este planificador radica en su capacidad para encontrar trayectorias viables para una amplia variedad de problemas. En el siguiente escenario, por ejemplo, la ruta generada se puede usar tal cual, o como una suposición inicial para un solver MPC, lo que ayuda a evitar mínimos locales en el espacio del problema no convexo:

% Load scenario obstacles
nonConvexProblem = load("NonConvex.mat");

% Update validator and state space
validator.Obstacles = nonConvexProblem.obstacles;
validator.StateSpace.StateBounds(1:2,:) = [-100 100; -40 40];
figure
show(validator)

% Define start and goal
start = [10 0 0 0 NaN 0];
goal  = [-10 0 pi 0 -1 0];

% Update goal reached function
goalFcn = @(planner,q,qTgt)exampleHelperGoalReachedFunction(goal,planner,q,qTgt);
planner.GoalReachedFcn = goalFcn;

% Turn off optional every-step goal propagation
planner.NumGoalExtension = 0;

% Increase goal sampling frequency
planner.GoalBias = .25;

% Balanced search vs path optimality
propagator.TravelBias = .5;

% Plan path
rng(0)
trajectory = plan(planner,start,goal);

% Visualize result
exampleHelperPlotTruck(trajectory);

Figure contains an axes object. The axes object contains 13 objects of type patch, line, rectangle.

Referencias

[1] Holmer, Olov. "Planificación del movimiento para un sistema reversible de camiones y remolques a gran escala". EM. tesis, Universidad de Linköping, 2016.