jueves, 15 de diciembre de 2011

sobre Robótica: Estimación de posición por odometría

En esta entrada por fin hablaremos sobre la tantas veces mencionada odometrí­a. 
Tal y como se ha dicho en entradas anteriores, la odometrí­a se utiliza para estimar la posición relativa de un robot móvil. 
En nuestro caso, nos interesa la posición del robot en el plano, es decir, nos interesa estimar el vector (x, y, \theta)
Como se habrán dado cuenta, hay dos palabras clave en lo que llevamos de entrada: estimación y relativa.
Hablamos de estimación de posición ya que saber a ciencia cierta la posición de un robot móvil es sencillamente imposible.
 ¿Por qué? 
Por que los métodos que utilizamos para calcular esa posición no tienen una precisión absoluta.
 Es importante interiorizar esta idea. 
Nuestra única forma de obtener información de un robot móvil y su entorno es a través de los sensores. 
Sobre la información dada por esos sensores utilizaremos modelos matemáticos y cálculos más o menos complejos, pero nada puede remediar el hecho de que estamos trabajando sobre medidas hechas a partir de ciertos sensores. 
Esas medidas nunca se librarán de errores. 
Cómo no, los errores de los sensores serán inversamente proporcionales al precio de los mismos.
Y ¿qué pasa con la palabra relativa
Aunque todas las posiciones sean relativas a un marco de referencia y no exista un marco de referencia privilegiado en el universo (principio de la relatividad), en robótica sí­ que se privilegia a un marco concreto: a las llamadas coordenadas del mundo
Las posiciones que se dan respecto a las coordenadas del mundo, son a veces llamadas posiciones absolutas. 
Pues bien, las posiciones estimadas a partir de la odometría no tienen nada que ver con las coordenadas del mundo, ya que son relativas al punto de inicio.
Definimos como punto de inicio aquel punto en el que se comienza a calcular la posición mediante odometría. 
Para que nos entendamos, aquel punto en el que encendemos el robot y empieza a correr el programa que estima la posición.
 Tengan en cuenta que este punto de inicio puede estar en cualquier punto de nuestro entorno y no siempre debe coincidir con un punto conocido.

Encoders y cinemática diferencial


En su momento ya dijimos que los encoders son sensores que miden las revoluciones de un eje. 
Clasificamos estos sensores entre los propioceptivos puesto que nos dan información sobre el estado interno del robot.
 Y ya adelantamos que los encoders se utilizan para estimar la posición de un robot móvil. 
 Es ahora cuando explicaremos ese proceso en detalle.
Los encoders, como sensores que son, pueden estar basados en distintas tecnologí­as que no explicaremos de momento. Lo que nos interesa de los mismos es que miden las revoluciones de un eje. Es decir, un encoder nos dice cuantas vueltas ha dado un eje en un intervalo de tiempo dado.
 En un robot móvil, los encoders se suelen situar en los ejes de las ruedas, en cada uno de los grados de libertad de movimiento que pueda tener cada una de esas ruedas.
En esta entrada analizaremos una configuración concreta de ruedas para un robot móvil.
 A la configuración de ruedas y motores de un robot móvil se la denomina cinemática del robot. 
Nosotros veremos la más simple de todas: la cinemática diferencial. 
Un robot móvil de cinemática diferencial es aquel que cuenta con dos ruedas motrices unidas por un eje. 
Cada una de estas ruedas tiene su propio motor que la hace girar en el plano perpendicular al eje que une ambas ruedas.
En la figura hemos dibujado lo que serí­a un robot móvil con base circular y una cinemática diferencial.
Podemos apreciar como hay dos ruedas (rueda izquierda y rueda derecha) unidas por un eje. 
Estas son las ruedas motrices que harán que el robot se mueva. 
Cada una de estas ruedas tiene su propio motor y un encoder que mide las revoluciones del eje. 
Tengan en cuenta que estas ruedas sólo giran en el plano perpendicular al eje que une a ambas ruedas. 
En palabras más llanas, cada rueda sólo puede ir hacia adelante o hacia atrás. 
Entonces, ¿cómo puede rotar el conjunto del robot?
 Pues muy simple:
 haciendo que una rueda gire hacia adelante y la otra hacia atrás con la misma velocidad. 
Así, si la rueda derecha gira hacia adelante y la izquierda hacia atrás, el robot rotará hacia la izquierda.
 Para rotar a la derecha, hay que hacer justo lo contrario.
 Se entiende, ¿verdad?
En la figura anterior podemos observar que además de las ruedas motrices, también hemos dibujado dos ruedas locas
Las ruedas locas son ruedas pasivas (como las ruedas de los carritos de los supermercados), que simplemente se utilizan para darle estabilidad al robot móvil. 
No tienen motores y normalmente tampoco suelen tener encoders.
Para finalizar con esta parte y entrar en harina, nos falta por rematar la función de los encoders.
 Como hemos dicho, cada una de las ruedas motrices tiene su encoder en esta configuración. 
Por lo tanto, tenemos el encoder de la derecha y el de la izquierda.
 Estos encoders, suelen tener una resolución concreta que se mide en unidades de pulsos/revolución, es decir, cuantos pulsos mide el encoder en una revolución completa del eje. 
Los pulsos se pueden enteder como una medida discreta de los ángulos.
 Es decir, si nuestro encoder tiene una precisión de 360 pulsos/revolución, estamos diciendo que la resolución angular de nuestro encoder es de 1 grado. 
Por cada grado que gire el eje, tendremos unpulso. Ni que decir que los encoders comerciales tienen resoluciones mucho mayores que la de 1 grado.

Ecuaciones para estimar la posición en una base diferencial


Ya tenemos todos los ingredientes para resolver el problema de la estimación de la posición por odometrí­a.
 Recordemos nuestro objetivo: queremos estimar la posición de nuestro robot (x, y, \theta) utilizando la información dada por los encoders sabiendo que la cinemática de nuestro robot es del tipo diferencial.
 ¡Allá vamos!
Lo primero que tenemos que saber es cuánto se desplaza linealmente cada rueda por cada pulso registrado por el encoder.
 Es decir, queremos saber cuánto avanza una rueda por cada pulso avanzado por el eje. 
Para eso, tenemos que transformar el desplazamiento angular del eje en desplazamiento lineal de la rueda.
 Con un poco de física de bachillerato obtenemos que la ecuación que nos calcula el factor de conversión “pulso encoder/desplazamiento lineal” es:
c_m=2\pi R/nC_e
donde R es el radio de la rueda, n es la reducción de eje/rueda y C_e es la resolución de nuestro encoder. 
De todos estos conceptos, tal vez debamos explicar un poco el de la reducción eje/rueda que denotamos por n en la ecuación anterior. 
Normalmente, todos los sistemas rueda/motor suelen tener una reducción.
 La reducción no es más que el factor que mide cuantas vueltas da la rueda por vuelta dada por el eje del motor.
 Un buen ejemplo de esto son los cambios de una bicicleta. 
Cambiando de piñones y platos, podemos cambiar la relación de vueltas dadas por los pedales (eje del motor) y vueltas dadas por las ruedas.
 Lo mismo pasa con los cambios de un coche. 
Pero nosotros aquí no queremos entrar en este tema, por lo que podemos considerar que n = 1 y así nos olvidamos de la reducción.
Conociendo c_m es muy fácil saber el desplazamiento lineal de cada rueda para un intervalo de tiempo. 
Vamos a considerar que nuestros encoders leen los pulsos en intervalos regulares de tiempo. 
Siendo esto así­, el tiempo que discurre entre una lectura de pulso y la próxima lectura de pulso es constante. 
Llamemos ahoraN_{L, i} a la cantidad de pulsos leídos por el encoder de la rueda izquierda para el tiempo de muestreo i.
 Lo mismo hacemos con la rueda derecha y lo llamamos N_{R, i}.
 Entonces la distancia lineal avanzada por cada rueda en el intervalo
 (i-1, i) viene dada por las ecuaciones:
\Delta s_{L,i}=c_m N_{L,i}
\Delta s_{R,i}=c_m N_{R,i}
Sin embargo, a nosotros nos interesa averiguar cuánto ha avanzado el centro del robot en ese intervalo de tiempo (\Delta s_{c, i}) y calcular el incremento de orientación que ha tenido debido a ese desplazamiento lineal (\Delta \theta_{c, i}). 
 Las ecuaciones que utilizamos para calcular ambas variables a partir de los desplazamientos lineales de cada rueda son las siguientes:
\Delta s_{c,i}=(\Delta s_{R,i}+\Delta s_{L,i})/2
\Delta \theta_{c,i}=(\Delta s_{R,i}-\Delta s_{L,i})/L
donde L es la distancia entre las dos ruedas o la longitud del eje que une las dos ruedas. 
Vamos a deducir la procedencia de estas ecuaciones. 
Supongamos que cada una de las ruedas tiene una velocidad angular constante durante el tiempo. 
Si la velocidad de la rueda derecha fuera mayor a la de la rueda izquierda, el robot se movería en una trayectoria curva hacia su izquierda y viceversa. 
Siendo las dos velocidades constantes, esa trayectoria correspondería a la trayectoria de una circunferencia con un radio concreto. 
Es decir, de mantener este patrón de movimiento, el robot describirí­a una circunferencia en torno a un punto del entorno que llamaremos el Centro Instantáneo de Rotación o CIR. 
Por ahora no sabemos qué punto de nuestro espacio es el CIR, pero sabemos que debe estar en la lí­nea que une a ambas ruedas:

Por lo tanto, volviendo a los intervalos temporales de antes, la rueda izquierda ha descrito un arco de longitud \Delta s_{L, i} en el intervalo (i-1, i)

El radio de curvatura ha sido r (la distancia al CIR).

 Mientras tanto, la rueda derecha ha descrito un arco de longitud \Delta s_{R, i} 
con un radio de r + L

Con esto, es fácil deducir cual es el incremento en orientación:

\Delta s_{L,i}/r=\Delta \theta_i
\Delta s_{R,i}/(r+L)=\Delta \theta_i
Dos ecuaciones y dos incógnitas (r y \Delta \theta_i). 
Resolviendo obtenemos que:
\Delta \theta_i=(\Delta s_{R,i}-\Delta s_{L,i})/L
r=L\Delta s_{L,i}/(\Delta s_{R,i}-\Delta s_{L,i})
Por lo tanto el incremento de orientación \Delta \theta_i ya lo hemos deducido. 
Ahora, para saber el desplazamiento lineal del centro del robot sólo tenemos que pensar que el centro ha descrito un arco de longitud \Delta s_{c, i} 
con radio r + L/2.
 Aplicando la misma lógica de antes, sabemos que \Delta s_{c, i} / (r + L/2) = \Delta \theta_i
Sustituyendo \Delta \theta_i por el lado derecho de la ecuación
\Delta \theta_i=(\Delta s_{R,i}-\Delta s_{L,i})/L
y jugando un poco llegamos a:
 \Delta s_{c,i} = (\Delta s_{R, i} + \Delta s_{L, i}) / 2
que es igual a la ecuación \Delta s_{c,i}=(\Delta s_{R,i}+\Delta s_{L,i})/2 de desplazamiento lineal que dedujimos más arriba. 
Así que ¡objetivo cumplido!
Llegados a este punto sólo nos falta por calcular la x, la y y la \theta del centro del robot en el instante i
Para ello, suponemos que conocemos las coordendas del robot en el instante i-1, es decir, conocemos (x_{i-1}, y_{i-1}, \theta_{i-1})
Es lógico, puesto que estamos calculando los desplazamientos lineales y de orientación para cada intervalo de tiempo. 
Siendo esto así­, con un poco de trigonometrí­a tenemos que:
\theta_i = \theta_{i-1} + \Delta \theta_i
x_i=x_{i-1}+\Delta s_{c,i} cos\theta_i
y_i=y_{i-1}+\Delta s_{c,i} sin\theta_i
Fácil, ¿verdad? 
Este proceso iterativo tiene un inconveniente: 
tenemos que saber el valor de (x_0, y_0, \theta_0)
Lo que se suele hacer en estos casos es suponer que las coordenadas al comienzo son (0, 0, 0)
Por ello, la estimación de la posición basada en odometrí­a es relativa al punto de comienzo, tal y como hemos dicho al principio.

Inconvenientes de la odometría


Visto estos cálculos, parece que si sabemos relacionar el punto de inicio con un punto conocido del entorno, localizar el robot en el mismo es tarea trivial. 
Pero no es así, porque tal y como hemos venido diciendo, la odometrí­a sólo nos da una estimación de la posición. 
La cuestión es que el cálculo que hemos enseñado aquí­ se basa en supuestos que no siempre se cumplen. 
Por ejemplo: en las ecuaciones hemos hablado del radio de las ruedas. 
Una rueda idealmente rígida, no variarí­a su radio en contacto con el suelo.
 Sin embargo, las ruedas normales son deformables, por lo que el radio al contacto con el suelo varí­a. 
Esto, por si­ sólo, es una fuente de error.
 Más cosas, en nuestras ecuaciones también ha aparecido la resolución del encoder. 
Cuanto mayor sea ésta, menor error tendremos. 
Pero está claro que la resolución del encoder tambión es otra fuente de error. 
A esta clase de errores se les llama errores sistemáticos, ya que son propios del sistema y se repiten constantemente.
Como no podía ser de otra forma, también existen los errores no sistemáticos. Y estos son realmente difíciles de gestionar. 
El más clásico es el de la rueda que patina. 
Todas las deducciones que hemos realizado se basan en el supuesto de que el desplazamiento angular de una rueda se traduce en desplazamiento lineal de la misma. 
Este supuesto falla cuando tenemos una superficie resbaladiza. 
Imaginemos por ejemplo que nuestro robot cruza un charco de aceite.
 Alguna de las ruedas o ambas patinarán.
 En ese momento, nuestras ecuaciones fallarán ya que calcularán que el robot se está desplazando cuando no lo hace. 
Lo mismo puede pasar en un bache o irregularidad del terreno.
Por lo tanto, la odometría no es una forma fiable de localizar a nuestro robot. 
Nos da una forma sencilla de estimar la posición del robot, pero esa estimación va acumulando errores, tanto sistemáticos como no sistemáticos. 
Eso quiere decir que en trayectorias largas
 (trayectorias que superen los 15 metros normalmente), la estimación de la posición por odometría deja de ser fiable.
 Como consecuencia, tenemos que buscar la forma de aprovechar esta información y corregir esa estimación para que tengamos un sistema de localización del robot que funcione correctamente.

Algunos apuntes sobre esta entrada


En esta entrada hemos tratado la estimación de posición por odometrí­a para un robot con cinemática diferencial. 
Cabe señalar que hay muchas cinemáticas distintas en el mundo de la robótica móvil.
 Hemos escogido la diferencial por su simplicidad.
 Por si hay alguien interesado en el tema, puede buscar la cinemática de triciclo, la cinemática de Ackerman (que es la que usan los coches) o la cinemática omnidireccional.
 Cada una de ellas implica unos cálculos diferentes para estimar la posición, pero ninguna se sobrepone a los errores que hemos descrito.
 Por último, las cinemáticas juegan un papel muy importante en el control de los robots móviles ya que limitan las trayectorias que se pueden ejecutar. 
Este punto ya lo trataremos cuando hablemos de planificación y seguimiento de trayectorias.

No hay comentarios: