Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Simular diferentes modelos cinemáticos para robots móviles

En este ejemplo se muestra cómo modelar diferentes modelos de cinemática robótica en un entorno y compararlos.

Definir robots móviles con restricciones cinemáticas

Hay varias maneras de modelar la cinemática de los robots móviles. Todos dictan cómo las velocidades de las ruedas están relacionadas con el estado del robot: , como coordenadas y un rumbo robot, , en radianes.[x y theta]xy-theta

Modelo cinemático unicíclico

La forma más sencilla de representar la cinemática de vehículos robóticos móviles es con un modelo de unciclo, que tiene una velocidad de rueda establecida por una rotación sobre un eje central, y puede pivotar sobre su eje z. Tanto los modelos cinemáticos de tracción diferencial como los de bicicleta se reducen a la cinemática de uniciclo cuando se proporcionan entradas, ya que no se tiene en cuenta la velocidad del vehículo y la velocidad de rumbo del vehículo y otras limitaciones.

unicycle = unicycleKinematics("VehicleInputs","VehicleSpeedHeadingRate");

Modelo cinemático de accionamiento diferencial

El modelo de accionamiento diferencial utiliza un eje de conducción trasero para controlar tanto la velocidad del vehículo como la velocidad de la cabeza. Las ruedas del eje de conducción pueden girar en ambas direcciones. Dado que la mayoría de los robots móviles tienen alguna interfaz con los comandos de rueda de bajo nivel, este modelo volverá a utilizar la velocidad del vehículo y la velocidad de rumbo como entrada para simplificar el control del vehículo.

diffDrive = differentialDriveKinematics("VehicleInputs","VehicleSpeedHeadingRate");

Para diferenciar el comportamiento del modelo de uniciclo, añada una restricción de velocidad de velocidad de rueda al modelo cinemático de accionamiento diferencial

diffDrive.WheelSpeedRange = [-10 10]*2*pi;

Modelo cinemático de bicicleta

El modelo de bicicleta trata al robot como un modelo similar a un coche con dos ejes: un eje de conducción trasero y un eje delantero que gira sobre el eje z. El modelo de bicicleta funciona bajo el supuesto de que las ruedas en cada eje se pueden modelar como una sola rueda centrada, y que el rumbo de la rueda delantera se puede ajustar directamente, como una bicicleta.

bicycle = bicycleKinematics("VehicleInputs","VehicleSpeedHeadingRate","MaxSteeringAngle",pi/8);

Otros modelos

El modelo cinemático Ackermann es un modelo similar a un coche modificado que asume la dirección de Ackermann. En la mayoría de los vehículos similares a los automóviles, las ruedas delanteras no giran sobre el mismo eje, sino que encienden ejes ligeramente diferentes para asegurarse de que se montan en círculos concéntricos sobre el centro del giro del vehículo. Esta diferencia en el ángulo de giro se llama dirección Ackermann, y normalmente se aplica mediante un mecanismo en vehículos reales. Desde el punto de vista de la cinemática del vehículo y la rueda, se puede aplicar tratando el ángulo de dirección como una entrada de velocidad.

carLike = ackermannKinematics;

Configurar parámetros de simulación

Estos robots móviles seguirán un conjunto de waypoints que está diseñado para mostrar algunas diferencias causadas por la cinemática diferente.

waypoints = [0 0; 0 10; 10 10; 5 10; 11 9; 4 -5]; % Define the total time and the sample rate sampleTime = 0.05;               % Sample time [s] tVec = 0:sampleTime:20;          % Time array  initPose = [waypoints(1,:)'; 0]; % Initial pose (x y theta)

Crear un controlador de vehículo

Los vehículos siguen un conjunto de waypoints usando un controlador Pure Pursuit. Dado un conjunto de waypoints, el estado actual del robot y algunos otros parámetros, el controlador emite la velocidad del vehículo y la velocidad de rumbo.

% Define a controller. Each robot requires its own controller controller1 = controllerPurePursuit("Waypoints",waypoints,"DesiredLinearVelocity",3,"MaxAngularVelocity",3*pi); controller2 = controllerPurePursuit("Waypoints",waypoints,"DesiredLinearVelocity",3,"MaxAngularVelocity",3*pi); controller3 = controllerPurePursuit("Waypoints",waypoints,"DesiredLinearVelocity",3,"MaxAngularVelocity",3*pi);

Simular los modelos utilizando un solver ODE

Los modelos se simulan utilizando la función para actualizar el estado.derivative En este ejemplo se utiliza un solucionador de ecuaciones diferenciales ordinarias (ODE) para generar una solución. Otra manera sería actualizar el estado usando un bucle, como se muestra en .Seguimiento de ruta para un robot de accionamiento diferencial

Dado que el solucionador ODE requiere que todas las salidas se proporcionen como una sola salida, el controlador de persecución puro debe estar envuelto en una función que genere la velocidad lineal y la velocidad angular de encabezado como una sola salida. Un ejemplo de ayudante, , se utiliza para ese propósito.exampleHelperMobileRobotController El ayudante de ejemplo también se asegura de que el robot se detiene cuando está dentro de un radio especificado del objetivo.

goalPoints = waypoints(end,:)'; goalRadius = 1;

se llama una vez para cada tipo de modelo.ode45 La función derivada calcula las salidas de estado con el estado inicial establecido por .initPose Cada derivado acepta el objeto de modelo cinemático correspondiente, la pose del robot actual y la salida del controlador en esa pose.

% Compute trajectories for each kinematic model under motion control [tUnicycle,unicyclePose] = ode45(@(t,y)derivative(unicycle,y,exampleHelperMobileRobotController(controller1,y,goalPoints,goalRadius)),tVec,initPose); [tBicycle,bicyclePose] = ode45(@(t,y)derivative(bicycle,y,exampleHelperMobileRobotController(controller2,y,goalPoints,goalRadius)),tVec,initPose); [tDiffDrive,diffDrivePose] = ode45(@(t,y)derivative(diffDrive,y,exampleHelperMobileRobotController(controller3,y,goalPoints,goalRadius)),tVec,initPose);

Resultados de la gráfica

Los resultados del solver ODE se pueden ver fácilmente en una sola gráfica utilizando para visualizar los resultados de todas las trayectorias a la vez.plotTransforms

Las salidas de pose deben convertirse primero en matrices indizadas de traducciones y cuaterniones.

unicycleTranslations = [unicyclePose(:,1:2) zeros(length(unicyclePose),1)]; unicycleRot = axang2quat([repmat([0 0 1],length(unicyclePose),1) unicyclePose(:,3)]);  bicycleTranslations = [bicyclePose(:,1:2) zeros(length(bicyclePose),1)]; bicycleRot = axang2quat([repmat([0 0 1],length(bicyclePose),1) bicyclePose(:,3)]);  diffDriveTranslations = [diffDrivePose(:,1:2) zeros(length(diffDrivePose),1)]; diffDriveRot = axang2quat([repmat([0 0 1],length(diffDrivePose),1) diffDrivePose(:,3)]);

A continuación, el conjunto de todas las transformaciones se puede trazar y ver desde la parte superior. Los caminos de los robots de uniciclo, bicicleta y unidad diferencial son rojo, azul y verde, respectivamente. Para simplificar el trazado, solo muestre cada décima salida.

figure plot(waypoints(:,1),waypoints(:,2),"kx-","MarkerSize",20); hold all plotTransforms(unicycleTranslations(1:10:end,:),unicycleRot(1:10:end,:),'MeshFilePath','groundvehicle.stl',"MeshColor","r"); plotTransforms(bicycleTranslations(1:10:end,:),bicycleRot(1:10:end,:),'MeshFilePath','groundvehicle.stl',"MeshColor","b"); plotTransforms(diffDriveTranslations(1:10:end,:),diffDriveRot(1:10:end,:),'MeshFilePath','groundvehicle.stl',"MeshColor","g"); view(0,90)