Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Ruta siguiente para un robot de accionamiento diferencial

Este ejemplo muestra cómo controlar un robot para seguir una ruta deseada usando un simulador de robot. El ejemplo utiliza la ruta Pure Pursuit siguiendo el controlador para conducir un robot simulado a lo largo de una ruta predeterminada. Una ruta de acceso deseada es un conjunto de puntos de referencia definidos explícitamente o calculados mediante un planificador de rutas (consulte).Planificación de rutas en entornos de diferente complejidad Se crea la ruta de acceso Pure Pursuit siguiente controlador para un robot de unidad diferencial simulado y calcula los comandos de control para seguir una ruta determinada. Los comandos de control calculados se utilizan para conducir el robot simulado a lo largo de la trayectoria deseada para seguir la ruta deseada basada en el controlador Pure Pursuit.

Nota: A partir de R2016b, en lugar de utilizar el método STEP para realizar la operación definida por el objeto System™, puede llamar al objeto con argumentos, como si se tratara de una función. Por ejemplo, y realizar operaciones equivalentes.y = step(obj,x)y = obj(x)

Definir waypoints

Define un conjunto de waypoints para la ruta deseada para el robot

path = [2.00    1.00;         1.25    1.75;         5.25    8.25;         7.25    8.75;         11.75   10.75;         12.00   10.00]; 

Establezca la ubicación actual y la ubicación del objetivo del robot tal y como se define en la ruta.

robotCurrentLocation = path(1,:); robotGoal = path(end,:);

Asuma una orientación inicial del robot (la orientación del robot es el ángulo entre el encabezado del robot y el eje X positivo, medido en sentido contrario a las agujas del reloj).

initialOrientation = 0;

Definir la pose actual para el robot [x y Theta]

robotCurrentPose = [robotCurrentLocation initialOrientation];

Inicializar el robot Simulator

Un simulador de robot simple se utiliza en este ejemplo que actualiza y devuelve la pose del robot de accionamiento diferencial para las entradas de control dadas. Un simulador externo o un robot físico requerirá un mecanismo de localización para proporcionar una postura actualizada del robot.

Inicialice el simulador de robot y asigne una pose inicial. El robot simulado tiene ecuaciones cinemáticas para el movimiento de un robot de accionamiento diferencial de dos ruedas. Las entradas a este robot simulado son velocidades lineales y angulares. También tiene capacidades de trazado para mostrar la ubicación actual del robot y dibujar la trayectoria del robot.

robotRadius = 0.4; robot = ExampleHelperRobotSimulator('emptyMap',2); robot.enableLaser(false); robot.setRobotSize(robotRadius); robot.showTrajectory(true); robot.setRobotPose(robotCurrentPose);

Visualice la ruta deseada

plot(path(:,1), path(:,2),'k--d') xlim([0 13]) ylim([0 13])

Defina la ruta siguiente controlador

En función de la ruta definida anteriormente y de un modelo de movimiento de robot, necesita una ruta que sigue al controlador para conducir el robot a lo largo del camino. Cree la vía de acceso siguiente controlador utilizando el objeto.robotics.PurePursuit

controller = robotics.PurePursuit;

Utilice la ruta definida anteriormente para establecer los waypoints deseados para el controlador

controller.Waypoints = path;

Establezca la ruta siguiendo los parámetros del controlador. La velocidad lineal deseada se fija a 0,3 metros/segundo para este ejemplo.

controller.DesiredLinearVelocity = 0.3;

La velocidad angular máxima actúa como un límite de saturación para la velocidad de rotación, que se establece en 2 radianes/segundo para este ejemplo.

controller.MaxAngularVelocity = 2;

Como regla general, la distancia de búsqueda anticipada debe ser mayor que la velocidad lineal deseada para un trayecto suave. El robot puede cortar las esquinas cuando la distancia de búsqueda anticipada es grande. Por el contrario, una pequeña distancia de búsqueda anticipada puede dar lugar a una ruta inestable siguiendo el comportamiento. Para este ejemplo se eligió un valor de 0,5 m.

controller.LookaheadDistance = 0.5;

Usando el controlador de ruta siguiente, conduce el robot sobre los waypoints deseados

La ruta siguiente controlador proporciona señales de control de entrada para el robot, que el robot utiliza para conducir a sí mismo a lo largo de la ruta deseada.

Defina un radio de objetivo, que es el umbral de distancia deseado entre la ubicación final del robot y la ubicación del objetivo. Una vez que el robot se encuentra a esta distancia de la meta, se detendrá. Además, computa la distancia actual entre la ubicación del robot y la ubicación del objetivo. Esta distancia se comprueba continuamente contra el radio del objetivo y el robot se detiene cuando esta distancia es menor que el radio del objetivo.

Tenga en cuenta que el valor demasiado pequeño del radio de objetivo puede hacer que el robot pierda el objetivo, lo que puede resultar en un comportamiento inesperado cerca de la meta.

goalRadius = 0.1; distanceToGoal = norm(robotCurrentLocation - robotGoal);

El objeto calcula los comandos de control para el robot.robotics.PurePursuit Conduzca el robot utilizando estos comandos de control hasta que alcance dentro del radio del objetivo. Si está utilizando un simulador externo o un robot físico, entonces las salidas del controlador deben ser aplicadas al robot y un sistema de localización puede ser necesario para actualizar la pose del robot. El controlador funciona a 10 Hz.

controlRate = robotics.Rate(10); while( distanceToGoal > goalRadius )          % Compute the controller outputs, i.e., the inputs to the robot     [v, omega] = controller(robot.getRobotPose);          % Simulate the robot using the controller outputs.     drive(robot, v, omega);          % Extract current location information ([X,Y]) from the current pose of the     % robot     robotCurrentPose = robot.getRobotPose;          % Re-compute the distance to the goal     distanceToGoal = norm(robotCurrentPose(1:2) - robotGoal);          waitfor(controlRate);      end

El robot simulado ha alcanzado la ubicación del objetivo utilizando la ruta que sigue al controlador a lo largo de la ruta deseada. Cierre la simulación.

delete(robot)

Uso de la ruta siguiente controlador junto con PRM

Si el conjunto de waypoints deseado es calculado por un planificador de paths, la ruta que sigue al controlador se puede usar de la misma manera. Inicie el simulador de robot con un mapa simple.

 robot = ExampleHelperRobotSimulator('simpleMap',2); robot.enableLaser(false); robot.setRobotSize(robotRadius);

robot.showTrajectory(true);

Puede calcular el uso del algoritmo de planificación de rutas PRM.path Ver para más detalles.Planificación de rutas en entornos de diferente complejidad

mapInflated = copy(robot.Map); inflate(mapInflated,robotRadius); prm = robotics.PRM(mapInflated); prm.NumNodes = 100; prm.ConnectionDistance = 10;

Busque una ruta entre la ubicación inicial y final. Tenga en cuenta que la voluntad será diferente debido a la naturaleza probabilística del algoritmo PRM.path

startLocation = [2.0 1.0]; endLocation = [12.0 10.0]; path = findpath(prm, startLocation, endLocation)
path = 6×2

    2.0000    1.0000
    1.5851    1.3808
    4.0668    6.7417
    7.0353    8.6624
   11.8252   10.6359
   12.0000   10.0000

Mostrar la ruta

show(prm, 'Map', 'off', 'Roadmap', 'off');

Definió una ruta siguiendo el controlador que se puede reutilizar para calcular los comandos de control de un robot en este mapa. Para volver a usar el controlador y redefinir los waypoints mientras mantienes la otra información igual, usa la función.release

release(controller); controller.Waypoints = path;

Establezca la ubicación actual y el objetivo del robot según lo definido por la ruta

robotCurrentLocation = path(1,:); robotGoal = path(end,:);

Asuma una orientación inicial del robot

initialOrientation = 0;

Definir la pose actual para el movimiento del robot [x y Theta]

robotCurrentPose = [robotCurrentLocation initialOrientation];

Restablezca la posición actual del robot simulado al inicio del trayecto.

robot.setRobotPose(robotCurrentPose) show(prm, 'Map', 'off', 'Roadmap', 'off');

Calcule la distancia a la ubicación del objetivo

distanceToGoal = norm(robotCurrentLocation - robotGoal);

Defina un radio de objetivo

goalRadius = 0.1;

Conduzca el robot utilizando la salida del controlador en el mapa dado hasta que alcance el objetivo. El controlador funciona a 10 Hz.

reset(controlRate); while( distanceToGoal > goalRadius )          % Compute the controller outputs, i.e., the inputs to the robot     [v, omega] = controller(robot.getRobotPose);          % Simulate the robot using the controller outputs     drive(robot, v, omega);          % Extract current location information from the current pose     robotCurrentPose = robot.getRobotPose;          % Re-compute the distance to the goal     distanceToGoal = norm(robotCurrentPose(1:2) - robotGoal);          waitfor(controlRate); end

El robot simulado ha alcanzado la ubicación del objetivo utilizando la ruta que sigue al controlador a lo largo de la ruta deseada. Detengan al robot.

drive(robot, 0, 0);

Cierre la simulación.

delete(robot);

Consulte también