La simulación robótica en Unity es tan fácil como contar hasta tres

CAMERON GREENE Anonymous
Nov 19, 2020|9 minutos
La simulación robótica en Unity es tan fácil como contar hasta tres
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

Los flujos de trabajo de desarrollo de robots se basan en la simulación para pruebas y entrenamiento, y queremos mostrarle cómo los especialistas en robótica pueden usar Unity para la simulación robótica. En esta primera publicación de blog de una nueva serie, describimos un flujo de trabajo de desarrollo robótico común. Además, presentamos un nuevo conjunto de herramientas que hacen que la simulación robótica en Unity sea más rápida, más efectiva y más fácil que nunca.

Cómo aprovechar Unity mediante la robótica

Debido a que desarrollar y probar aplicaciones utilizando un robot real es costoso y requiere mucho tiempo, la simulación se está convirtiendo en una parte cada vez más importante del desarrollo de aplicaciones robóticas. Validar la aplicación en simulación antes de implementarla en el robot puede acortar el tiempo de iteración al revelar posibles problemas de forma temprana. La simulación también facilita la prueba de casos extremos o escenarios que pueden ser demasiado peligrosos para probarlos en el mundo real.

Los elementos clave de una simulación robótica eficaz incluyen los atributos físicos del robot, la escena o el entorno donde opera el robot y el software que se ejecuta en el robot en el mundo real. Asegurarse de que estos tres elementos de la simulación sean lo más parecidos posible al mundo real es vital para realizar pruebas y entrenamientos válidos.

Uno de los marcos más comunes para el desarrollo de software de robots es el Sistema Operativo de Robot (ROS). Proporciona formatos estándar para descripciones de robots, mensajes y tipos de datos utilizados por miles de expertos en robótica en todo el mundo, para casos de uso tan variados como el ensamblaje industrial, los vehículos autónomos e incluso el entretenimiento. Una comunidad de usuarios vibrante contribuye con muchos paquetes de código abierto para funcionalidades comunes que pueden impulsar el desarrollo de nuevos sistemas.

Los especialistas en robótica a menudo diseñan una aplicación robótica como un conjunto modular de nodos ROS que pueden implementarse tanto en robots reales como en computadoras que interactúan con simuladores. En una simulación, los desarrolladores construyen un mundo virtual que refleja el caso de uso objetivo del robot real. Al realizar pruebas en este ecosistema simulado, los usuarios pueden iterar los diseños rápidamente antes de probarlos en el mundo real y, en última instancia, implementarlos en producción.

Imagen del sistema operativo del robot (ROS)

Un flujo de trabajo de desarrollo de robótica común, donde las pruebas en simulación se realizan antes de las pruebas en el mundo real.

Esta publicación de blog utiliza el ejemplo de una simple tarea de manipulación de selección y colocación para ilustrar cómo los usuarios pueden aprovechar Unity para este flujo de trabajo de simulación.

1: Definición de la tarea del robot

Siguiendo el flujo de trabajo anterior, digamos que la tarea de nuestro robot es recoger un objeto y colocarlo en una ubicación determinada. El robot educativo de seis ejes Niryo One sirve como brazo robótico. El entorno es mínimo: una habitación vacía, una mesa en la que se sienta el robot y un cubo (es decir, el objeto objetivo). Para llevar a cabo la parte de planificación de movimiento de la tarea, utilizamos un conjunto popular de paquetes ROS de planificación de movimiento llamados colectivamente MoveIt. Cuando estamos listos para comenzar la tarea, enviamos una solicitud de planificación desde el simulador a MoveIt. La solicitud contiene las poses de todas las articulaciones del robot, la pose del cubo y la posición objetivo del cubo. Luego, MoveIt calcula un plan de movimiento y envía este plan al simulador para su ejecución.

Ahora que hemos planteado el problema, veamos cómo usar Unity en este flujo de trabajo de simulación.

2: Llevando tu robot a la simulación

Una simulación robótica consiste en crear un entorno virtual (una sala básica, como en este ejemplo, o algo más complejo, como una fábrica con cintas transportadoras, contenedores, herramientas y piezas) y añadir a este entorno una representación virtual del robot que se va a entrenar o probar. El editor de Unity se puede utilizar para crear infinitas permutaciones de entornos virtuales. Pero ¿cómo podemos llevar nuestros robots a estos entornos?

Al modelar un robot en simulación, necesitamos representar sus mallas visuales, mallas de colisión y propiedades físicas. Las mallas visuales son necesarias para representar el robot de manera realista. Las mallas de colisión son necesarias para calcular las colisiones entre los “enlaces” del robot, los miembros rígidos que conectan las articulaciones, y otros objetos del entorno, así como consigo mismo. Estas mallas suelen ser menos complejas que las mallas visuales para permitir una verificación de colisiones más rápida, que puede requerir un uso intensivo de recursos informáticos. Por último, las propiedades físicas, como la inercia, los coeficientes de contacto y la dinámica de las articulaciones, son necesarias para una simulación física precisa, es decir, para calcular cómo las fuerzas sobre los enlaces resultan en cambios en el estado del robot, por ejemplo, postura, velocidad o aceleración.

Afortunadamente para nosotros, cuando utilizamos el flujo de trabajo de desarrollo ROS, existe una forma estandarizada de describir todas estas propiedades: Formato de descripción universal de robot (URDF). Los archivos URDF son archivos XML que nos permiten especificar estas propiedades visuales, de colisión y físicas en un lenguaje de marcado legible para humanos. Los archivos URDF también pueden incluir archivos de malla para especificar geometrías complejas. El siguiente ejemplo muestra un extracto del archivo URDF del robot Niryo One.

La imagen muestra un extracto del archivo URDF del robot Niryo One.

URDF del robot Niryo One

Para facilitar a los expertos en robótica la importación de sus robots a Unity, lanzamos URDF Importer, un paquete de Unity de código abierto para importar un robot a una escena de Unity usando su archivo URDF. Este paquete aprovecha nuestro nuevo soporte para “articulaciones” en Unity, posible gracias a las mejoras en PhysX 4.1. Esta actualización nos permite modelar con precisión las características físicas de un robot para lograr simulaciones cinemáticas más realistas.

Cuando se instala en Unity Editor, este paquete permite al usuario seleccionar un archivo URDF para importar. Analiza el archivo XML detrás de escena y almacena los enlaces y uniones en las clases C# apropiadas. Luego crea una jerarquía de GameObjects, donde cada GameObject es un componente ArticulationBody que representa un vínculo particular en el robot. Asigna propiedades del URDF a los campos correspondientes en ArticulationBody. Cuando los usuarios agregan un robot a Unity, el Importador URDF crea automáticamente un controlador conjunto de teclado rudimentario. Los usuarios pueden reemplazar este controlador con un controlador personalizado utilizando las API de ArticulationBody.

Por ejemplo, aquí está el activo Unity Niryo One, creado después de importar el archivo URDF anterior.

Ejemplo de activo de Unity de Niryo One, creado después de importar el archivo URDF anterior.

Un robot virtual Niryo One en Unity, importado a través del Importador URDF

3: Conectando su simulación a ROS

Ahora que el robot está en el Editor de Unity, debemos probar nuestro algoritmo de planificación de movimiento, ejecutándose en un conjunto de nodos ROS. Para respaldar esto, necesitamos configurar una interfaz de comunicación entre Unity y ROS. Unity necesita pasar mensajes a ROS que contengan información de estado (es decir, las poses del robot, el objeto objetivo y la ubicación del objetivo) junto con una solicitud de planificación al servicio de movimiento. A su vez, ROS debe devolver un mensaje de trayectoria a Unity correspondiente al plan de movimiento (es decir, la secuencia de posiciones articulares necesarias para completar la tarea de selección y colocación).

Dos nuevos paquetes de integración ROS-Unity ahora facilitan la conexión de Unity y ROS. Estos paquetes permiten que los mensajes ROS pasen entre nodos ROS y Unity con baja latencia; cuando se probó en una sola máquina, un simple mensaje basado en texto realizó el viaje desde Unity a un suscriptor ROS en milisegundos y una imagen de 1036 x 1698 en unos pocos cientos de milisegundos.

Dado que la comunicación en ROS utiliza un modelo pub/sub, el primer requisito para la comunicación ROS-Unity son las clases en Unity correspondientes a los tipos de mensajes de ROS. Cuando los usuarios agregan el paquete Unity ROS-TCP-Connector al Editor de Unity, pueden usar el complemento MessageGeneration para generar clases C#, incluidas funciones de serialización y deserialización, desde archivos .msg y .srv de ROS. El paquete ROS-TCP-Connector también incluye scripts que el usuario puede ampliar para publicar mensajes desde Unity a un tema ROS, suscribirse en Unity a mensajes en un tema ROS y crear solicitudes y respuestas de servicio ROS. En el lado de ROS, un paquete ROS llamado ROS-TCP-Endpoint puede crear un punto final para habilitar la comunicación entre los nodos ROS y una escena de Unity utilizando estos scripts ROS-TCP-Connector.

Veamos ahora cómo utilizar estos paquetes de integración ROS-Unity para la tarea en cuestión. Primero, usamos los paquetes de integración ROS-Unity para crear un publicador en Unity para enviar los datos de pose a ROS a través de TCP. En el lado de ROS, necesitamos configurar un punto final ROS-TCP para suscribirse a estos mensajes de pose.

A continuación, crearemos un botón “Publicar” en la escena de Unity junto con una devolución de llamada OnClick. Esta función de devolución de llamada realiza una solicitud de servicio al planificador de movimientos MoveIt. La solicitud de servicio incluye la pose actual del robot, la pose del objeto objetivo y la ubicación del objetivo. Cuando MoveIt recibe la solicitud de planificación, intenta calcular un plan de movimiento. Si tiene éxito, el servicio devuelve el plan, es decir, una secuencia de posiciones articulares, y un script de Unity ejecuta la trayectoria utilizando las API de ArticulationBody. De lo contrario, devuelve un mensaje de error.

El gif a continuación muestra una simulación de Unity del brazo Niryo One realizando con éxito la tarea de recoger y colocar.

Simulación de una tarea de pick-and-place en un robot Niryo One en Unity usando ROS y MoveIt para planificación de movimiento

Simulación de una tarea de pick-and-place en un robot Niryo One en Unity usando ROS y MoveIt para planificación de movimiento

Este ejemplo es sólo el comienzo. Los desarrolladores pueden usar esta demostración como base sobre la cual crear escenas de Unity más complejas, agregar diferentes robots e integrar otros paquetes ROS. Manténgase atento a futuras publicaciones que cubran la integración de tareas orientadas a la visión por computadora y al aprendizaje automático en un marco de simulación robótica.

Conclusión

Estas herramientas sientan las bases para una nueva generación de pruebas y entrenamiento en simulación y hacen que sea más fácil que nunca usar Unity para la simulación robótica. Nuestro equipo está trabajando arduamente para hacer posibles estos casos de uso de próxima generación, que incluyen capacitación en aprendizaje automático para robótica, modelado de sensores, pruebas a escala y más. Manténgase atento a nuestra próxima publicación de blog en esta serie, que le mostrará cómo entrenar un modelo de aprendizaje automático basado en visión para estimar la pose del objeto objetivo en la tarea de elegir y colocar.

Próximos pasos

Comience a utilizar nuestras herramientas de simulación robótica de forma gratuita. Consulta nuestro tutorial de selección y colocación en GitHub.

Para más proyectos de robótica, visita Unity Robotics Hub en GitHub. Para ver cómo nuestro equipo está facilitando el entrenamiento de sistemas de visión artificial utilizando Unity, lea nuestraserie de blogs sobre visión artificial.

Para obtener más información sobre cómo se puede utilizar Unity para satisfacer sus necesidades de simulación robótica, visite nuestra página oficial de robótica.

Si desea comunicarse directamente con nuestro equipo con preguntas, comentarios o sugerencias, envíenos un correo electrónico a unity-robotics@unity3d.com.