Mover Tortuga (TurtleSim)
Resumen
Move Turtle es un sencillo script de Python para ROS que mueve la tortuga en TurtleSim de ROS a coordenadas (puntos) especificados. Este proyecto comenzó como un proyecto de clase para CSCI473 en la Colorado School of Mines (CSOM) y luego evolucionó en un proyecto que utilicé para aprender cómo se pueden crear sistemas de bucle cerrado, conocimiento que luego usé para ayudarme en mi trabajo en el Laboratorio de Robótica Humana (HCR) de CSOM.
Contexto
Para algo de contexto, ROS significa Robot Operating Systems. ROS es un middleware de robótica de código abierto, usualmente combinado con el sistema operativo Ubuntu, que se usa para gestionar mejor los componentes/clusters de software de un sistema robótico. Puedes aprender más sobre cómo usar ROS en la wiki oficial de ROS. El código que escribes en ROS está en C++ o Python.
TurtleSim es un simple simulador de robot 2D usado como introducción a ROS y sus paquetes para nuevos usuarios de ROS. Todo lo que hace TurtleSim es abrir una pantalla 2D simple con una tortuga. Esa tortuga actúa como el “robot” y puedes enviar mensajes a ese “robot” para moverlo y/o girarlo. Además, TurtleSim genera algún error aleatorio para simular la física del mundo real de forma simple.
Sabiendo qué son ROS y TurtleSim, ¿por qué los estaba usando? Bueno, en la primavera de 2020 estaba tomando una clase llamada “Human Centered Robotics” en la Colorado School of Mines como parte de mi carga de clases de informática de pregrado. La clase la impartió el Dr. Hao Zhang. La clase consistía en tres proyectos y el primer proyecto consistía en configurar ROS, aprender a usar ROS e implementar un algoritmo de bucle abierto o cerrado que hiciera que la tortuga en TurtleSim dibujara una M. La descripción original del proyecto se puede ver AQUÍ.
Cuando estaba tomando la clase, completé este proyecto implementando un algoritmo de bucle abierto. Esta solución funcionó pero realmente era mala y dibujó una A que era “suficientemente buena” pero no estaba cerca de “excelente”. Después de entregar el proyecto a mediados de febrero de 2020, lo olvidé hasta un año después, alrededor de febrero de 2021.
Desafío
En febrero de 2021, fui contratado como Asistente de Investigación en el Laboratorio de Robótica Humana (HCR) en la Colorado School of Mines, donde trabajé bajo el Dr. Hao Zhang. El objetivo del laboratorio es investigar la “autonomía colaborativa de por vida, con el objetivo de permitir que los robots operen y se adapten durante largos períodos”. A partir del 1‑9‑2022 (1 de septiembre de 2022), el laboratorio se trasladó de la Colorado School of Mines a la Universidad de Massachusetts Amherst. Pero, cuando trabajé allí, todavía estaban ubicados en Colorado.
En el Laboratorio HCR, me asignaron trabajar en el proyecto Triton. El proyecto Triton consistía en múltiples, decenas, de robots llamados Tritons. Los Tritons eran robots terrestres de rueda omni triangular que se veían así:
Junto con los Tritons, ocho Cámaras IR de OptiTrack dispuestas en un “orden octagonal” a pocos pies del suelo. Usando esas cámaras, el software Motive de Optitrack, una PC con Windows 10 y ROS, se crea un espacio de 2 m × 2 m × 2 m (x, y, z) donde se puede determinar la posición real de objetos con marcadores de captura de movimiento.
Mi primera tarea con el proyecto Triton fue crear scripts que hicieran que el robot Triton se moviera a una posición real específica. En ese momento, no estaba seguro de cómo lograrlo, pero recordaba el primer proyecto de CSCI473 donde se me introdujo la idea de un sistema de bucle cerrado, así que comencé a investigar los sistemas de bucle cerrado y, a su vez, los sistemas de retroalimentación.
Investigación
Durante mi investigación, descubrí este gran video de AerospaceControlsLab:
En este video se mostró y explicó la idea de un sistema PID. Un sistema PID es un sistema de bucle cerrado que produce salidas específicas basadas en datos del mundo real. En términos básicos, es un sistema de retroalimentación que ajusta su salida según la diferencia entre el valor deseado y el valor medido. Esta es la fórmula de un controlador PID:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ es la señal de control.
- $K_p$, $K_i$, $K_d$ son las ganancias proporcional, integral y derivada, respectivamente.
- $e(t)$ es la señal de error (la diferencia entre el valor deseado y el real).
- $\int e(t) dt$ es la integral del error en el tiempo.
- $\frac{de(t)}{dt}$ es la derivada del error.
Para aprender más, consulta el video de AerospaceControlsLab o este increíble artículo de Wikipedia del cual proviene la fórmula.
Después de mi investigación y con ayuda de amigos y profesores, determiné que usar un controlador proporcional (P) sería lo mejor para ayudar al Triton a alcanzar una coordenada específica.
Dado que el Triton es un robot terrestre, solo necesito preocuparme por las coordenadas X e Y. Con esto, tuve que determinar qué valores deseados y medidos medir y procesar dentro del controlador P. En mi investigación encontré este increíble post en la wiki de ROS llamado Go to Goal donde se enfocan en los siguientes errores:
- Error de distancia: La diferencia de distancia entre la ubicación deseada (X, Y) y la ubicación actual (X, Y).
- Error de theta: La diferencia entre la orientación deseada y la orientación actual.
Solución Propuesta
Con todo esto, la solución para que el Triton se mueva a una coordenada real específica es usar un controlador proporcional para el error de distancia y el error de theta del Triton respecto a la coordenada objetivo y la coordenada actual del Triton. Pero antes de implementarlo en un sistema físico, quería probar la idea en una simulación y, en ese momento, pensé que usar TurtleSim como simulación era la mejor opción.
Pruebas en Simulación
Con la solución teórica delineada, opté por validar inicialmente mediante simulación, en lugar de un escenario real. El mundo real suele estar lleno de ruido que puede enturbiar la efectividad de la solución y generar problemas irrelevantes. Reconociendo esto, revisité mi proyecto de CSCI473 y lo adapté como un terreno de pruebas para esta solución teórica.
Después de actualizar el código antiguo de ROS Melodic a ROS Noetic y con refinamiento iterativo, logré que la solución propuesta funcionara en TurtleSim. Demostraciones de su funcionalidad, con algunas rutas de coordenadas objetivo interesantes, se pueden encontrar al final de este blog. El código de todo esto se puede ver AQUÍ.
Conclusión
En resumen, con este proyecto, la tortuga de TurtleSim navega eficazmente a coordenadas establecidas usando el sistema de bucle cerrado, superando significativamente mi sistema de bucle abierto de 2020. Tras probarlo con éxito, implementé esta solución con los robots Triton. Sin embargo, el ruido del mundo real introdujo problemas inesperados que requirieron semanas de depuración y pruebas reales. Después de esas semanas, finalmente logré que el Triton alcanzara coordenadas reales específicas usando la solución probada en TurtleSim. Aquí hay una demo del Triton moviéndose a coordenadas reales usando el método probado en TurtleSim:
En retrospectiva, desearía haber usado una simulación que simulase mejor la física del mundo real. TurtleSim es excelente para aprender, pero no para probar ideas de robótica real. En ese momento pensé que sería suficiente para mi caso simple, pero luego se demostró lo contrario.
El objetivo principal de este blog era describir la creación de un sistema de bucle cerrado que permite a la tortuga en TurtleSim, y posteriormente a los robots Triton, navegar con precisión a posiciones objetivo especificadas (X, Y). Creo que se logró, aunque podría haber generado interés en mi trabajo en el Laboratorio HCR. Con esto, planeo escribir más blogs sobre mi experiencia en el HCR Lab…
Demos de Mover Turtle (TurtleSim)
Este video contiene los siguientes demos:
- Cayley Nodal: Un diseño simple de Cayley Nodal
- Circles: Un diseño tipo telaraña
- Inner Circles: Un diseño de “círculos dentro de círculos”
- M: Un diseño muy simple de M