Main Content

Realizar cosimulación entre Simulink y Gazebo

Este ejemplo muestra cómo configurar una simulación sincronizada entre Simulink™ y Gazebo para enviar comandos y recibir datos de Gazebo.

Configurar el entorno de simulación Gazebo

Para este ejemplo, use su propio entorno Linux con Gazebo o descargue el equipo virtual (VM) proporcionado con ROS y Gazebo. En el equipo virtual (VM), el complemento de Gazebo necesario se encuentra en /home/user/src/GazeboPlugin.

Para obtener más información sobre el equipo virtual (VM) Linux y los requisitos para configurar su propio entorno Linux con Gazebo, consulte Requisitos y limitaciones del entorno de simulación Gazebo.

Si usa su propio entorno Linux, siga los pasos para Instalar el complemento de Gazebo de forma manual. De lo contrario, vaya a Iniciar el entorno de simulación Gazebo.

Instalar el complemento de Gazebo de forma manual

Obtenga el código fuente del complemento como un paquete zip. Esta función crea una carpeta denominada GazeboPlugin en el directorio de trabajo actual y la comprime en el archivo GazeboPlugin.zip.

packageGazeboPlugin

Copie el archivo GazeboPlugin.zip en su equipo Linux que cumpla con el siguiente requisito:

Descomprima el paquete en su plataforma Linux; para este ejemplo lo descomprimimos en /home/user/src/GazeboPlugin.

Ejecute estos comandos en el terminal para compilar el complemento.

cd /home/user/src/GazeboPlugin

Si la carpeta build ya existe, elimínela.

rm -r build

Instale el complemento.

mkdir build
cd build
cmake ..
make

La ubicación del complemento es /home/user/src/GazeboPlugin/export/lib/libGazeboCoSimPlugin.so.

Elimine el complemento generado del equipo host.

if exist('GazeboPlugin', 'dir')
    rmdir('GazeboPlugin', 's');
end

if exist('GazeboPlugin.zip', 'file')
    delete('GazeboPlugin.zip');
end

Iniciar el entorno de simulación Gazebo

Abra un terminal en el VM o en su propio sistema operativo Linux y ejecute los siguientes comandos para iniciar el simulador Gazebo.

cd /home/user/src/GazeboPlugin/export
export SVGA_VGPU10=0
gazebo ../world/multiSensorPluginTest.world --verbose

Estos comandos inician un simulador Gazebo con:

  • Dos telémetros láser: hokuyo0 y hokuyo1

  • Dos cámaras RGB: camera0 y camera1

  • Dos cámaras de profundidad: depth_camera0 y depth_camera1

  • Dos sensores IMU: imu0 y imu1

  • Modelo de caja unitaria: unit_box

El multiSensorPluginTest.world se encuentra en la carpeta /home/user/src/GazeboPlugin/world. Este archivo del mundo incluye el complemento de Gazebo para la cosimulación con Simulink usando las siguientes líneas en su cuerpo .xml:

<plugin name="GazeboPlugin" filename="lib/libGazeboCoSimPlugin.so"><portNumber>14581</portNumber></plugin>

El campo de nombre de archivo debe apuntar a la ubicación del complemento de Gazebo compilado. Esta ruta puede ser relativa a la ubicación en la que se inicia Gazebo o puede añadirla a la ruta de búsqueda del complemento de Gazebo ejecutando:

export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:/home/user/src/GazeboPlugin/export

Configurar cosimulación con Gazebo

Abra el modelo performCoSimulationWithGazebo, que demuestra cómo recibir datos de sensores de estos sensores simulados y cómo activar el modelo de caja unitaria de Simulink.

open_system("performCoSimulationWithGazebo")

Antes de simular el modelo, configure la cosimulación con Gazebo usando el bloque Gazebo Pacer (Pacer de Gazebo):

hilite_system('performCoSimulationWithGazebo/Gazebo Pacer')

Abra el bloque y haga clic en el enlace Configure Gazebo network and simulation settings (Configurar la red de Gazebo y las opciones de simulación).

open_system('performCoSimulationWithGazebo/Gazebo Pacer')

En el menú desplegable Network Address (Dirección de red), seleccione Custom. Introduzca la dirección IP de su equipo Linux. El Puerto predeterminado para Gazebo es el 14581. Configure Response timeout (Tiempo de respuesta) en 10 segundos.

Haga clic en el botón Test (Probar) para probar la conexión con el simulador Gazebo en ejecución.

Obtener datos de sensores

Use el bloque Gazebo Read (Lectura de Gazebo) para obtener datos sobre temas específicos de tres sensores:

  • IMU, /gazebo/default/imu0/link/imu/imu

  • Escaneo LiDAR, /gazebo/default/hokuyo0/link/laser/scan

  • Cámara RGB, /gazebo/default/camera0/link/camera/image

Muestre las lecturas del IMU y visualice el escaneo LiDAR y la imagen RGB usando los bloques de funciones de MATLAB®.

Activar modelo de Gazebo

Use el bloque Gazebo Apply Command (Aplicar comando de Gazebo) para aplicar una fuerza constante en la dirección z de la caja unitaria que produce una aceleración de 1 m/s2. Cree un mensaje ApplyLinkWrench en blanco usando Gazebo Blank Message (Mensaje en blanco de Gazebo). Especifique elementos del mensaje para aplicar la fuerza a la entidad unit_box/link usando el bloque Bus Assignment (Asignación de bus). Use Gazebo Read (Lectura de Gazebo) para generar la pose de validación ground-truth en el suelo de la caja. El desplazamiento de la caja durante un período de 1 segundo debe ser cercano a 0,5 metros.

Realizar cosimulación

Para iniciar la cosimulación, haga clic en Run (Ejecutar). También puede avanzar la simulación usando Step Forward (Avanzar). Step Back (Retroceder) no se admite durante la cosimulación.

Mientras se ejecuta la simulación, observe que el simulador Gazebo y la hora de Simulink están sincronizados.

Este modelo visualiza los datos del sensor de Gazebo usando el bloque de función de MATLAB y las funcionalidades de representación de MATLAB. Esta es una instantánea de los datos de imagen obtenidos de la cámara de Gazebo:

Esta es una instantánea de la imagen del escaneo LiDAR:

El diagrama de tiempo de la posición del bloque de la caja unitaria en la dirección z se puede visualizar usando Data Inspector. El bloque sigue una forma parabólica debido a la aceleración constante en el tiempo.

La posición de la caja unitaria al final de la simulación es 1,001, lo que genera un desplazamiento de 0,5001, que es ligeramente diferente del valor esperado de 0,5. Esto se debe al error del motor de física de Gazebo. Reduzca el tamaño de paso máximo en el motor de física de Gazebo para reducir este error.

Sincronización de tiempo

Durante la cosimulación, puede pausar Simulink y el simulador Gazebo en cualquier momento usando Pause (Pausa)

Nota: Gazebo se detiene una unidad de tiempo antes de la simulación.

Esto se debe a la siguiente secuencia de tiempo de cosimulación:

Los datos del sensor y los comandos de accionamiento se intercambian en la unidad de tiempo correcta. La ejecución elige primero el paso de Gazebo y luego Simulink. La ejecución de la simulación todavía está en t+1, Simulink solo permanece en el tiempo del paso anterior hasta que reanude el modelo.

Siguientes pasos