MecanumRob
Contenido
Tareas pendientes
- Sistema de gestión de batería
- Documentación: arquitectura del software (diagramas y ejemplos de código, información de parámetros relevantes y launchfiles).
- Actualizar página del CERLab con el Mecanum: Hardware, Software y videos de demostración.
- Prueba para determinar drift del giroscopio.
- Licencias para abrir el código y Copyright y sin garantía ("as is").
- Calibración de la odometría: sistema de adquisición de postura global basado en visión por computador.
- Obtener las covarianzas de los sensores: buscar los de la IMU en la página del fabricante.
- Calibración de SLAM.
- Fusión de los 2 sensores Hokuyo para el SLAM.
- Filtro de Kalman: implementación y filtrar mensajes por frecuencia más o menos constante.
- Deadman switch para ejecutar cualquier algoritmo si se presiona un botón.
- Buscar otros algoritmos SLAM.
- Propagar el software a los otros robots.
- Separar los puntos de anclaje para el transporte del robot.
Terminadas
- Calibración de la IMU en la página del fabricante.
- Calibración del acelerómetros
- Calibración del giroscopio
- Filtro para IMU
- Botón para cambiar la velocidad máxima (análogo).
- Calibración de evasión de obstáculos y graficación/visualización en tiempo real.
- Buscar algoritmos de evasión ya implementados en ROS y hacer una comparativa.
- Se encontraron los algoritmos: Elastic Band, Timed Elastic Band, Dynamic Window Approach y Active Scene Recognition. Todos los algoritmos están integrados al ROS Navigation Stack, para hacer una comparativa efectiva probablemente sea necesario adecuar el algoritmo VFH+ al estándar (migrar a C++ y separar funcionalidades de detección y evasión) y adecuar los nodos que ya se desarrollaron al estándar.
Sensores y actuadores
- PhidgetsSpacial Precision 3/3/3 High Resolution [1]
- Roboclaw 2x30A Motor Controller (x2) [2]
- URG-04LX-UG01 Scanning Laser Rangefinder (x2) [3]
Calibración
IMU
Consultar la hoja del fabricante.
Para calibrar los sensores de la IMU tenemos que entender que hay dos fuentes importantes de error que debemos corregir. La primera es el ruido blanco o error de alta frecuencia (White Noise). Este se corrige promediando las mediciones a través del tiempo. El segundo tipo de error es el camino aleatorio o ruido de baja frecuencia (Random Walk o Drift). Este tipo de ruido tiende a hacer que el valor medio de las muestras se aleje del valor real con el paso del tiempo. La forma en que se corrige es que aproxima su efecto mediante un experimento y se resta a cada muestra. Para aproximar el Random Walk lo que se debe hacer es tomar mediciones durante un largo período (un día entero) sin mover el sensor, y ver cuanto divergen las mediciones de los valores iniciales. Sabiendo esta diferencia y el total de tiempo del experimento, se puede calcular un aproximado del error por unidad de tiempo. Para mayor información consultar este artículo sobre Desviación de Allan.
Para la calibración del acelerómetro, la principal fuente de error es el ruido blanco, por lo que la técnica más efectiva es promediar los valores sobre un intervalo de tiempo. En el caso del Phidgets, si se selecciona una tasa de datos menor a la máxima, el dispositivo automáticamente promedia tantas muestras como pueda en esa ventana de tiempo. Para más información consultar este artículo del fabricante
En el caso del giroscopio, la caminata aleatoria rápidamente se vuelve una fuente importante de error. Hay dos formas de contrarrestar esto, usando la función de cero del girosocopio, o restando un estimado del error a cada muestra. Eso sí, para poner en cero el giroscopio el robot debe estar inmóvil, por lo que se recomienda una combinación de ambas técnicas, constantemente restar el error y cada cierto tiempo prudencial usar la función de cero.
Para la calibración del magnetómetro es necesario seguir las instrucciones de instalación de la librería phidgets para Ubuntu 16.04 y luego descargar y compilar el programa de calibración dado por el fabricante. En el comprimido se incluye un README con instrucciones. Para más información ver [4] y [5].
ROS
El MecanumRob usa los siguientes paquetes de ROS:
- mecanumrob_common: contiene las definiciones de menajes y servicios usados en los demás nodos, además de los .launch files, las reglas udev y el nodo para el control de play.
- mecanumrob_roboclaw: el controlador de las motores, envía los comandos a los motores y publica la velocidad de las ruedas.
- mecanumrob_model: el modelo cinemático del robot, tanto directo como inverso. Además el nodo que publica las transformaciones (próximamente el filtro de Kalman) y las pruebas para la odometría.
- vfhp_local_planner: el módulo de evasión de obstáculos.
- urg_node: controla un sensor Hokuyo.
- phidgets_imu: controla la IMU.
- gmapping: SLAM basado en las lecturas de los sensores láser.
- joy: maneja el control de play.
Servicio
Para hacer que ROS corra automáticamente desde el arranque se usó el paquete robot_upstart. Lo que hace este paquete es crear un servicio del sistema operativo a partir de uno o mas .launch files. Si por alguna razón fuera necesario reiniciar el servicio (si por ejemplo algún nodo no responde) se puede usar el siguiente comando desde la terminal:
$ sudo service mecanumrob stop $ sudo service mecanumrob start
Acceso Remoto
Para iniciar ROS en el mecanum desde una laptop debe conectarse por ssh, tiene que estar conectado al wifi del CERLab.
$ ssh -X mecanumrob02@mecanumrob02.local
Una vez conectado se recomienda abrir una terminal gráfica (remota)
$ gnome-terminal
Hay un servicio que corre ROS con algunos de los nodos en el startup, primero se debe detenerlo
$ sudo service mecanumrob stop
Finalmente se debe iniciar ROS y correr los launch files
$ roscore
Desde otra pestaña remota (ctrl + shift + t) lanzar el launch file básico del robot, este launch file inicia los nodos que requiere la base móvil: motores sensores, modelo y odometría.
$ roslaunch mecanumrob_common mecanum.launch
Para controlar el robot se puede usar el control de PlayStation. Desde otra pestaña remota:
$ roslaunch mecanumrob_common dualshock4.launch
Para conectar rviz desde una laptop al ROS del mecanum es necesario definir ciertas variables de entorno, en particular ROS_MASTER_URI que le indica a ROS en qué computadora está corriendo el master, y ya sea ROS_IP o ROS_HOSTNAME que permite a los nodos identificar en qué máquina están corriendo.
Modelado
Primero es necesario definir el sistema de coordenadas del robot (local) y el estático (global).
Se define el marco de referencia local tal que el eje corresponde al frente del robot y el eje corresponde al lado izquierdo. Además, se define la velocidad angular de las ruedas según la ley de la mano derecha tal que una rotación positiva se proyecta en dirección positivo. Luego, se define el marco de referencia global con ejes , . Para encontrar la posición del robot en este marco de referencia global al partir del movimiento de las ruedas se usa el modelo cinemático directo. Por otro lado, para determinar los comandos que se le deben enviar a los motores para alcanzar una cierta velocidad lineal o angular se usa el modelo cinemático inverso.
Modelo Cinemático Directo
El modelo cinemático directo nos permite obtener la velocidad del robot a partir de la velocidad de las ruedas. Definimos la velocidad respecto al marco de referencia local . Además queremos encontrar la velocidad respecto al marco de referencia global , para poder integrar y así obtener la posición. Para el robot mecanum se tiene que:
con
Con esto obtenemos la velocidad lineal y angular del robot respecto al marco de referencia local. Luego, para obtener velocidades globales se debe multiplicar por la matriz de rotación
Así, el modelo completo del movimiento del robot es:
Modelo Cinemático Inverso
El modelo cinemático inverso se usa para determinar las velocidades de las ruedas necesarias para obtener un movimiento determinado. Es decir a partir de un comando de velocidad en el marco de referencia local (muévase hacia adelante a 3 m/s) determina la velocidad a la que debe rotar cada rueda para obtener el movimiento local deseado.