Main Content

Simular un robot móvil en un almacén con Gazebo

En este ejemplo se muestra cómo simular un robot de almacén en Gazebo. Gazebo permite simular un robot móvil que utiliza un sensor de distancia mientras realiza determinadas tareas en un entorno de simulación. Este ejemplo muestra cómo utilizar un simulador para aplicar el ejemplo Ejecutar tareas para un robot de almacén, donde un robot entrega paquetes en un escenario de almacén. El robot utiliza el sensor de distancia simulado en Gazebo para detectar y evadir posibles colisiones con un entorno dinámico.

Requisitos previos

Visión general del modelo

Abra el modelo.

open_system('simulateWarehouseRobotInGazebo.slx')

El modelo se puede dividir en los siguientes elementos:

  • Detectar: leer datos de los sensores en Gazebo.

  • Planificar: asignar paquetes y planificar rutas para que los robots entreguen los paquetes.

  • Controlar: generar comandos para seguir la ruta predefinida y evadir obstáculos.

  • Accionar: enviar comandos a Gazebo para que el robot se accione en el entorno.

Planificar

El robot realiza la tarea de moverse entre la estación de recarga, la estación de carga y la estación de descarga tal y como se indica en el Planificador.

Detectar

La pose actual del robot, la velocidad de las ruedas y las lecturas del sensor de distancia se leen desde el entorno de simulación en Gazebo. La siguiente figura es la vista ampliada del subsistema Read From Gazebo Sensors.

Control

El controlador genera comandos de control para seguir los waypoints utilizando el bloque Pure Pursuit. Si el sensor de distancia del robot detecta un obstáculo dentro del umbral avoidCollisionDistance, el robot se detiene. El robot también se detiene cuando está lo suficiente cerca del objetivo.

Accionar

El subsistema Pioneer Wheel Control genera un valor de par motor para cada rueda basándose en los comandos de control generados. El par motor se aplica como un comando ApplyJointTorque.

Configuración

Almacén

Cargue el archivo de mapa de ejemplo, map, que es una matriz de valores lógicos que indica el espacio ocupado en el almacén. Invierta esta matriz para indicar el espacio libre y cree un objeto binaryOccupancyMap. Especifique una resolución de 100 celdas por metro.

El mapa se basa en el archivo warehouseExtensions.world, que se creó utilizando Building Editor en el mismo factor de escala que menciona a continuación. Se puede crear un archivo .png para el mapa utilizando el complemento collision_map_creator_plugin para generar la matriz del mapa. Para más detalles sobre cómo instalar el complemento, consulte Collision Map Creator Plugin.

mapScalingFactor = 100;
load gazeboWarehouseMap.mat map
logicalMap = ~map;
map = binaryOccupancyMap(logicalMap,mapScalingFactor);
show(map)

Asigne las ubicaciones xy de la estación de recarga, estación de clasificación y la ubicación de descarga cerca de las estanterías del almacén. Los valores seleccionados se basan en el mundo simulado Gazebo.

chargingStn = [12,5];
loadingStn = [24,5];
unloadingStn = [15,24];

Muestre las distintas ubicaciones en el mapa.

hold on;

text(chargingStn(1), chargingStn(2), 1, 'Charging');
plotTransforms([chargingStn, 0], [1 0 0 0])

text(loadingStn(1), loadingStn(2), 1, 'Sorting Station');
plotTransforms([loadingStn, 0], [1 0 0 0])

text(unloadingStn(1), unloadingStn(2), 1, 'Unloading Station');
plotTransforms([unloadingStn, 0], [1 0 0 0])

hold off;

Sensor de distancia

El bloque Read Lidar Scan en la sección Sensing se utiliza para leer los valores de distancia del sensor de distancia simulado. El archivo warehouseExtensions.world contiene los detalles de varios modelos y actores (personal de almacén) en la escena. Dado que las etiquetas actor> son enlaces estáticos solo con mallas visuales, el tipo de sensor del sensor de distancia es gpu_ray.

Además, el sensor de distancia tiene una distancia de 640, pero el valor predeterminado es de 128. Esto requiere modificar los buses utilizados en el bloque Read Lidar Scan. Cargue el archivo exampleHelperWarehouseRobotWithGazeboBuses.mat para obtener un bus modificado con Gazebo_SL_Bus_gazebo_msgs_LaserScan.range establecido en 640. Los buses modificados se guardaron en un archivo .mat utilizando Type Editor.

load exampleHelperWarehouseRobotWithGazeboBuses.mat

Evasión de colisiones

Los actores del mundo real recorren una trayectoria predefinida. El robot utiliza un sensor de distancia para comprobar obstáculos dentro de una distancia de 2,0 m (avoidCollisionDistance) con ángulos de distancia desde [-pi/10, pi/10]. Si la lectura es distinta de cero dentro de esa distancia y vista, el robot se detiene y solo continúa después de que se despeja la distancia. El bloque de función "Stop Robot On Sensing Obstacles" incorpora esta lógica.

Mientras se ejecuta la simulación, el indicador Stop se ilumina en verde cuando el robot detecta que puede proceder. Si se ha detenido, el indicador se ilumina en rojo.

avoidCollisionDistance = 2; 

Realizar la simulación

Para simular el escenario, configure la conexión con Gazebo.

En primer lugar, ejecute el simulador Gazebo. En el equipo virtual, haga clic en el icono Gazebo Warehouse Robot. Si el simulador de Gazebo no se abre, es posible que tenga que volver a instalar el complemento. Consulte Instalar el complemento de Gazebo de forma manual en Realizar cosimulación entre Simulink y Gazebo.

En Simulink, abra el bloque Gazebo Pacer y haga clic en Configure Gazebo network and simulation settings. Especifique Network Address como Custom, , Hostname/IP Address para la simulación Gazebo y Port 14581, que es el puerto predeterminado para Gazebo. El escritorio del VM muestra la dirección IP.

Para obtener más información sobre la conexión a Gazebo para habilitar la cosimulación, consulte Realizar cosimulación entre Simulink y Gazebo.

Haga clic en el botón Initialize Model en la parte superior del modelo para inicializar todas las variables indicadas anteriormente.

Ejecute la simulación. El robot se traslada por el entorno y se detiene en cuanto una persona entra dentro del umbral definido.