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.

Controla un robot de accionamiento diferencial en Gazebo con Simulink

Este ejemplo muestra cómo controlar un robot de accionamiento diferencial en la cosimulación de Gazebo mediante Simulink. El robot sigue un conjunto de waypoints leyendo las posiciones del codificador de pose y rueda y genera comandos de control de par para conducirlo.

Para descargar la máquina virtual (VM) utilizada en este ejemplo, consulte Máquina virtual con ROS 2 Bouncy y Gazebo.

Para obtener una introducción a la co-simulación de Gazebo y conectarse por primera vez, consulte .Realizar co-simulación entre Simulink y Gazebo

Ejecute la máquina virtual

Abra la máquina virtual instalada desde Máquina virtual con ROS 2 Bouncy y Gazebo.

Gazebo World

En este ejemplo se utiliza un mundo dado en la máquina virtual, como un plano de tierra simple con la configuración de física predeterminada.differentialDriveRobot.world El mundo utiliza un robot Pioneer con los controladores predeterminados eliminados, para que los controladores incorporados no compitan con los pares proporcionados por Simulink. El robot Pioneer está disponible en las instalaciones predeterminadas de Gazebo. El plugin Gazebo hace referencia al plugin necesario para la conexión a Simulink, como se detalla en .Realizar co-simulación entre Simulink y Gazebo

Haga doble clic en el icono.Gazebo Differential Drive Robot

Alternativa, ejecute estos comandos en el terminal:

cd /home/user/src/GazeboPlugin/export  export SVGA_VGPU10=0  gazebo ../world/differentialDriveRobot.world 

Descripción general del modelo

Abra el modelo:

open_system('GazeboDifferentialDriveControl') 

El modelo tiene cuatro secciones:

  • Gazebo Pacer

  • Leer datos del sensor

  • Robot móvil de control

  • Enviar datos de actuación a Gazebo

Gazebo Pacer

Esta sección establece la conexión con Gazebo. Haga doble clic en el bloque para abrir sus parámetros y, a continuación, haga clic en el vínculo.Gazebo PacerConfigurar la red de Gazebo y los ajustes de simulación Esto abrirá un cuadro de diálogo.

Especifique el para la máquina virtual.Dirección IP De forma predeterminada, Gazebo se conecta en el puerto.14581 Haga clic en el botón para verificar la conexión a Gazebo.Prueba

Si la prueba no se realiza correctamente, asegúrese de comprobar las instrucciones y asegúrese de que Gazebo está configurado correctamente y el mundo asociado está en funcionamiento.Realizar co-simulación entre Simulink y Gazebo

Salidas de sensor Gazebo

Las salidas del sensor leen los datos del sensor desde Gazebo y los pasan a los bloques Simulink apropiados. Un gráfico XY traza la posición actual del robot y los datos de pose se guardan en la salida de simulación.

El subsistema extrae la postura del robot y los datos del sensor de rueda.Read Gazebo Sensors Los datos de la pose son las coordenadas y un cuaternión de cuatro elementos para la orientación.xy Las velocidades de las ruedas se calculan en función de la velocidad de cambio de las posiciones de las ruedas a medida que giran.

Control de robots móviles

La sección acepta un conjunto de waypoints de destino, postura de corriente y las velocidades actuales de la rueda, y emite los pares de rueda necesarios para que el robot siga un camino que persiga los waypoints.Control de robots móviles

Hay tres componentes principales.

El bloque es un controlador que especifica la velocidad del vehículo y la velocidad angular del rumbo del vehículo necesario para seguir los waypoints a una velocidad fija, dada la postura actual.Pure Pursuit

El bloque Función MATLAB convierte la velocidad del vehículo y la velocidad angular de rumbo a la velocidad de la rueda izquierda y derecha, utilizando la cinemática de un robot de accionamiento diferencial:Set Wheel Speed

<math display="block">
<mrow>
<msub>
<mrow>
<mover accent="true">
<mrow>
<mi>ϕ</mi>
</mrow>
<mrow>
<mo>˙</mo>
</mrow>
</mover>
</mrow>
<mrow>
<mi mathvariant="italic">L</mi>
</mrow>
</msub>
<mo>=</mo>
<mfrac>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mi mathvariant="italic">r</mi>
</mrow>
</mfrac>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="italic">v</mi>
<mo>-</mo>
<mfrac>
<mrow>
<mi mathvariant="normal">𝜔d</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
</mrow>
<mo>)</mo>
</mrow>
<mtext></mtext>
</mrow>
</math>

<math display="block">
<mrow>
<msub>
<mrow>
<mover accent="true">
<mrow>
<mi>ϕ</mi>
</mrow>
<mrow>
<mo>˙</mo>
</mrow>
</mover>
</mrow>
<mrow>
<mi mathvariant="italic">R</mi>
</mrow>
</msub>
<mo>=</mo>
<mfrac>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mi mathvariant="italic">r</mi>
</mrow>
</mfrac>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="italic">v</mi>
<mo>+</mo>
<mfrac>
<mrow>
<mi>𝜔d</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
</mrow>
<mo>)</mo>
</mrow>
<mtext></mtext>
<mtext></mtext>
</mrow>
</math>

<math>
<msub>
<mrow>
<mover accent="true">
<mrow>
<mi>ϕ</mi>
</mrow>
<mrow>
<mo>˙</mo>
</mrow>
</mover>
</mrow>
<mrow>
<mi mathvariant="italic">L</mi>
</mrow>
</msub>
</math>
Y
<math>
<msub>
<mrow>
<mover accent="true">
<mrow>
<mi>ϕ</mi>
</mrow>
<mrow>
<mo>˙</mo>
</mrow>
</mover>
</mrow>
<mrow>
<mi mathvariant="italic">R</mi>
</mrow>
</msub>
</math>
son las velocidades de las ruedas izquierda y derecha,
<math display="inline">
<mrow>
<mi mathvariant="italic">v</mi>
</mrow>
</math>
es la velocidad del vehículo,
<math>
<mi>𝜔</mi>
</math>
es la velocidad angular de rumbo del vehículo,
<math display="inline">
<mrow>
<mi mathvariant="italic">d</mi>
</mrow>
</math>
es el ancho de la vía, y
<math>
<mi mathvariant="italic">r</mi>
</math>
es el radio de la rueda. Además, esta función MATLAB® incluye código para limitar la velocidad de la rueda. Puesto que el bloque utiliza una velocidad fija en todo, dentro del bloque Function de MATLAB, hay dos instrucciones if.Pure Pursuit El primero ralentiza la velocidad a una velocidad proporcional a la distancia a la meta cuando el robot está dentro de un cierto umbral de distancia. La segunda declaración if detiene al robot cuando está dentro de un umbral estrecho. Esto ayuda al robot a detenerse suavemente.

Por último, el subsistema convierte las velocidades de rueda deseadas en pares utilizando un controlador proporcional.Pioneer Wheel Control

Comandos de par del actuador

La última sección del modelo toma los comandos de par producidos por el controlador y lo envía a Simulink usando bloques de laGazebo Co-Simulation Library.

Dentro de cada uno de los subsistemas de este bloque, se utiliza un bloque para asignar el par de unión a la unión correcta.Bus Assignment

Por ejemplo, dentro del subsistema, mostrado anteriormente, se utiliza a con el tipo de comando para especificar el tipo de bus.Left Wheel Gazebo Torque Command Gazebo Blank MessageApplyJointTorque El modelo y el nombre de la articulación son proporcionados por el bloque, que está vinculado a la articulación asociada con la rueda izquierda en el mundo Gazebo, .Gazebo Select Entityleft_wheel_hinge El par se aplica durante todo el tiempo de paso, 0,01 segundos, especificado en nanosegundos, ya que estas entradas deben proporcionarse como enteros. La salida del bus se pasa a un bloque.Gazebo Apply Command

Simular el robot

Para ejecutar el modelo, inicialice los waypoints y establezca el tiempo de muestra:

waypoints = [0 0; 4 2; 3 7; -3 6]; sampleTime = 0.01;

Haga clic en el botón o utilice el comando para ejecutar el modelo.Jugarsim Durante la ejecución, el robot debe moverse en Gazebo, y una actualización de la pose observada en Simulink.Gráfica XY

Las figuras trazan el conjunto de waypoints y la ruta final ejecutada del robot.