Odometría#

La odometría es una forma de localización que utiliza datos de sensores como codificadores para obtener una posición estimada en relación con un punto de partida. La localización es un medio para poder situar la posición del robot en un momento dado. La odometría es especialmente útil en programas autónomos porque permite realizar más fácilmente distintas tareas sobre el terreno gracias a la comprensión de la propia posición.

Pose#

Nos referimos a la pose, que es la posición de algún cuerpo (como un robot), normalmente en el contexto del espacio bidimensional, ya que el movimiento del robot está generalmente restringido a un solo plano. Anotamos la pose del robot como \(\vec{x}\). Una pose contiene dos entradas: la posición y el rumbo del robot; la posición suele estar en coordenadas cartesianas, por lo que la pose puede representarse con \(x\), \(y\) y \(\theta\). Un «rumbo» es un término para la dirección hacia la que está orientada la parte frontal del robot. Debido a esto, el marco de coordenadas del robot está configurado de tal forma que el eje x global está alineado con el rumbo 0.

Los ejes direccionales del robot con respecto a su cuerpo

Road Runner Documentación del Marco de Coordenadas#

Podemos referirnos a la pose actual (\(\vec{x}_0\)) del robot como \(\begin{pmatrix} x_0 \ y_0 \\theta_0 \end{pmatrix}\). Esto es sólo una notación de fantasía para un punto en el campo \((x_0, y_0)\) con una orientación especificada del robot–el rumbo \(\theta_0\). Una pose generalmente tiene un origen inicial en el marco de coordenadas.

Actualizar la pose#

El cambio de pose a lo largo de un periodo de tiempo muy pequeño es \(\Delta \vec{x}\). La diferencia de tiempo entre la pose actual y la última pose debe ser lo más pequeña posible para mejorar las aproximaciones matemáticas. Los equipos deben actualizar la pose de su robot en cada ciclo de su bucle de control.

Actualizar la pose es tan sencillo como añadir el cambio transformado a la pose anterior donde \(\varphi = \Delta\theta\)

\[\begin{split}\empezar{pmatrix} x \\ y \\ \theta \fin{pmatrix} = \Inicio{pmatrix} x_0 \\ y_0\\ \theta_0 \end{pmatrix} + \Inicio{pmatrix} \Delta x \Delta y \varphi \fin{pmatrix}\end{split}\]

La idea de la odometría es utilizar los datos de los sensores y las matemáticas para formar una aproximación de la pose del robot a lo largo del tiempo.

Determinación del cambio de posición#

Para determinar la posición actual del robot y actualizar su pose, el cambio debe calcularse utilizando los datos leídos de los sensores. Para un robot, habrá tres sensores posibles que se pueden utilizar: dos que son paralelos al cuerpo del robot en la dirección \(x\) y uno que está alineado con la dirección de movimiento \(y\) (perpendicular a las ruedas motrices).

Ángulo y desplazamiento#

El desplazamiento (o cambio de posición) del sensor izquierdo es \(\Delta x_l\) y el desplazamiento del sensor derecho es \(\Delta x_r\). La distancia lateral entre estos dos sensores se denomina ancho de vía, anotada como \(L\). Esto es muy importante para determinar el ángulo para aproximaciones de giro. Este valor tendrá que ser sintonizado, lo que significa probado repetidamente y luego llevado a algún valor convergente que esté cerca de la medición real.

La distancia lateral, el desplazamiento hacia delante y la ubicación de los sensores

17508 Rising Tau’s 2019/20 Skystone Bot#

Derivar el valor de \(\varphi\) se convierte entonces en algo sencillo:

\[\varphi = \frac{\Delta x_l - \Delta x_r}{L}\]

Para realizar los cálculos posteriores, necesitamos conocer el desplazamiento del robot en la dirección x respecto a su centro y no respecto a los dos sensores paralelos. Para ello, tomamos la media para obtener \(\Delta x_c\), o el desplazamiento central:

\[\Delta x_c = \frac{\Delta x_l + \Delta x_r}{2}\]

El desplazamiento final que necesitamos antes de poder determinar el cambio de pose es el desplazamiento horizontal \(\Delta x_\perp\). Este es el desplazamiento del sensor perpendicular \(\Delta x_h\) con una corrección por desplazamiento hacia delante \(F\). Para obtener aproximaciones precisas, es necesario tener en cuenta el desplazamiento hacia delante. Cuando el sensor está más cerca de la parte trasera, el desplazamiento es negativo, pero cuando está más cerca de la parte delantera, es positivo. Esto es para tener en cuenta el cambio en su posición basado en puntos de giro.

Como resultado de esto, podemos definir nuestro desplazamiento horizontal como:

\[\Delta x_\perp = \Delta x_h - (F * \varphi)\]

Nota

Si no tiene sensores perpendiculares, que no son necesarios si el robot no puede moverse en la dirección lateral, \(\Delta x_\perp\) no es necesario.

Para este valor, utilice 0 si no dispone de sensor horizontal.

Deltas relativos a robots#

Vamos a idear una forma simplificada y no óptima de calcular los deltas de la pose relativa de nuestro robot, que luego podremos transformar en cambios de coordenadas relativos al campo. Para ello, tenemos que transformar los deltas relativos al robot a través de una matriz de rotación donde giramos la diferencia de pose relativa por el rumbo original. Podemos obtener los valores de \(\Delta x\) y \(\Delta y\).

\[\begin{split}\Inicio{pmatrix} \Delta x \Delta y \varphi \fin{pmatrix} = \Inicio{pmatrix} \cos(\theta_0)&-\sin(\theta_0)&0\\ \sin(\theta_0)&\cos(\theta_0)&0\\ 0&0&1 fin{pmatrix} \Inicio{pmatrix} \Delta x_c \delta x-perp \varphi \fin{pmatrix}\end{split}\]

A partir de ahí, podemos calcular nuestro cambio de pose relativo al campo:

\[\Inicio{pmatrix} \Delta x \Delta y \varphi \fin{pmatrix} = \Inicio{pmatrix} \delta x_c \cos(\theta_0) - delta x_\perp \sin(\theta_0) \ \delta x_c sin (zeta_0) + delta x_perp sin (zeta_0) \VARPHI \Fin{pmatrix}\]

Nota

Este método de aproximación de la posición se conoce como integración de Euler, pero lo estamos utilizando para deltas de pose estrictos en lugar de integrar la velocidad (en esencia, se trata de una versión muy simplificada de la teoría original).

Advertencia

Esto es para programadores avanzados; mientras que implementar esto desde cero es un gran ejercicio de aprendizaje, probablemente no sea la forma óptima de obtener el mejor auto. Hay varios recursos por ahí para producir una gran odometría, bien probada y fácil de implementar.

Pseudocódigo de odometría#

while robot_is_active():
   delta_left_encoder_pos = left_encoder_pos - prev_left_encoder_pos
   delta_right_encoder_pos = right_encoder_pos - prev_right_encoder_pos
   delta_center_encoder_pos = center_encoder_pos - prev_center_encoder_pos

   phi = (delta_left_encoder_pos - delta_right_encoder_pos) / trackwidth
   delta_middle_pos = (delta_left_encoder_pos + delta_right_encoder_pos) / 2
   delta_perp_pos = delta_center_encoder_pos - forward_offset * phi

   delta_x = delta_middle_pos * cos(heading) - delta_perp_pos * sin(heading)
   delta_y = delta_middle_pos * sin(heading) + delta_perp_pos * cos(heading)

   x_pos += delta_x
   y_pos += delta_y
   heading += phi

   prev_left_encoder_pos = left_encoder_pos
   prev_right_encoder_pos = right_encoder_pos
   prev_center_encoder_pos = center_encoder_pos

Uso de exponenciales de pose#

Este método utiliza ecuaciones diferenciales para resolver la posición no lineal del robot dada una curvatura constante. La integración de Euler asume que el robot sigue una trayectoria recta entre actualizaciones, lo que puede conducir a aproximaciones inexactas cuando se viaja alrededor de curvas. Si usted está interesado en las matemáticas en sí, le recomendamos que consulte este libro para FRC® controles.

Trataremos la forma en que se resuelve en esta página como una caja negra, y derivaremos la fórmula implementando una corrección para esta curvatura no lineal en nuestra ecuación de deltas relativos al robot de integración de Euler:

\[\begin{split}\begin{pmatrix} \Delta x \\ \Delta y \\ \varphi \end{pmatrix} = \begin{pmatrix} \cos(\theta_0)&-\sin(\theta_0)&0\\ \sin(\theta_0)&\cos(\theta_0)&0\\ 0&0&1\end{pmatrix} \begin{pmatrix} \frac{\sin(\varphi)}{\varphi}&\frac{\cos(\varphi)-1}{\varphi}&0\\ \frac{1-\cos(\varphi)}{\varphi}&\frac{\sin(\varphi)}{\varphi}&0\\ 0&0&1\end{pmatrix} \begin{pmatrix} \Delta x_c\\ \Delta x_\perp\\ \varphi \end{pmatrix}\end{split}\]

Recursos para la odometría#

Existen varios recursos excelentes para la odometría. Recomendamos encarecidamente Road Runner. Para las matemáticas que hay detrás de Road Runner (que utiliza exponenciales de pose), también puedes leer el artículo de Ryan. Un recurso adicional para Road Runner es Learn Road Runner que es una guía de procedimiento paso a paso que explica cómo trabajar con el Road Runner quickstart.

También recomendamos el libro de Tyler ya que entra en gran detalle sobre varios controles en FIRST ® robótica.

Si utiliza otros recursos, es importante que no utilice los que utilizan la integración de Euler, ya que es menos óptima para las aproximaciones reales de la pose del robot.