Odométrie

L’odométrie est une forme de localisation qui utilise des données provenant de capteurs tels que des encodeurs pour obtenir une position estimée par rapport à un point de départ. La localisation est un moyen de localiser la position du robot à un moment donné. L’odométrie est particulièrement utile dans les programmes autonomes car elle permet de faciliter l’exécution de différentes tâches sur le terrain grâce à la compréhension de sa propre position.

Pose

Nous nous référons à la pose, qui est la position d’un corps (comme un robot), normalement dans le contexte d’un espace bidimensionnel, puisque le mouvement du robot est généralement contraint à un seul plan. Nous notons la pose du robot comme \(\vec{x}\). Une pose contient deux entrées : la position et le cap du robot ; la position est généralement en coordonnées cartésiennes, de sorte que la pose peut être représentée par \(x\), \(y\), et \(\theta\). Un « cap » est un terme qui désigne la direction vers laquelle l’avant du robot est orienté. Pour cette raison, le cadre de coordonnées du robot est configuré de manière à ce que l’axe x global soit aligné sur le cap 0.

Les axes directionnels du robot par rapport à son corps

Road Runner Coordinate Frame Documentation

Nous pouvons nous référer à la position actuelle (:math:vec{x}_0`) du robot comme :math:begin{pmatrix} x_0 \ y_0 theta_0 end{pmatrix}`. C’est juste une notation fantaisiste pour un point sur le champ \((x_0, y_0)\) avec une orientation spécifiée du robot - le titre :math:theta_0`. Une pose a généralement un point d’origine dans le cadre de coordonnées.

Mise à jour de la pose

Le changement de pose sur une très petite période de temps est :math:Delta vec{x}`. La différence de temps entre la pose actuelle et la dernière pose doit être aussi petite que possible pour améliorer les approximations mathématiques. Les équipes doivent mettre à jour la position de leur robot à chaque cycle de leur boucle de contrôle.

La mise à jour de la pose est aussi simple que l’ajout du changement transformé à la pose précédente où :math:varphi = \Delta\theta

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

L’idée de l’odométrie est d’utiliser les données des capteurs et les mathématiques pour former une approximation de la position du robot au fil du temps.

Détermination du changement de position

Afin de déterminer la position actuelle du robot et de mettre à jour sa pose, le changement doit être calculé à l’aide des données lues par les capteurs. Pour un robot, vous pouvez utiliser trois capteurs : deux qui sont parallèles au corps du robot dans la direction \(x\) et un qui est aligné avec la direction \(y\) du mouvement (perpendiculaire aux roues motrices).

Angle et déplacement

Le déplacement (ou changement de position) du capteur gauche est \(Delta x_l\) et le déplacement du capteur droit est :math:Delta x_r`. La distance latérale entre ces deux capteurs est appelée largeur de la voie, notée \(L\). Cette valeur est très importante pour déterminer l’angle des approximations de virage. Cette valeur devra être ajustée, c’est-à-dire testée à plusieurs reprises, puis amenée à une valeur convergente proche de la mesure réelle.

La distance latérale, le décalage vers l'avant et l'emplacement des capteurs

17508 Rising Tau’s 2019/20 Skystone Bot

Le calcul de la valeur de :math:varphi devient alors simple :

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

Pour effectuer les calculs ultérieurs, nous avons besoin de connaître le déplacement du robot dans la direction x par rapport à son centre plutôt que par rapport aux deux capteurs parallèles. Pour ce faire, nous prenons la moyenne pour obtenir \(\Delta x_c\), ou le déplacement du centre :

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

Le dernier déplacement dont nous avons besoin avant de pouvoir déterminer le changement de pose est le déplacement horizontal :math:Delta x_perp`. Il s’agit du déplacement du capteur perpendiculaire :math:Delta x_h` avec une correction pour le décalage vers l’avant \(F\). Pour obtenir des approximations précises, il faut tenir compte du décalage vers l’avant. Lorsque le capteur est plus proche de l’arrière, le décalage est négatif, mais lorsqu’il est plus proche de l’avant, il est positif. Cela permet de prendre en compte le changement de position du capteur en fonction de la rotation des points.

Par conséquent, nous pouvons définir notre déplacement horizontal comme suit :

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

Note

Si vous n’avez pas de capteurs perpendiculaires, qui ne sont pas nécessaires si le robot ne peut pas se déplacer dans la direction latérale, :math:``Delta x_perp` n’est pas nécessaire.

Pour cette valeur, utilisez 0 si vous n’avez pas de capteur horizontal.

Deltas relatifs aux robots

Proposons une méthode simplifiée et non optimale pour calculer les deltas de pose relatifs du robot, que nous pourrons ensuite transformer en changements de coordonnées relatifs au champ. Pour ce faire, nous devons transformer les deltas relatifs du robot via une matrice de rotation où nous faisons pivoter la différence de pose relative par le cap d’origine. Nous pouvons dériver les valeurs de :math:Delta x` et :math:Delta y`.

\[\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} \Delta x_c\\ \Delta x_\perp\\ \varphi \end{pmatrix}\end{split}\]

À partir de là, nous pouvons calculer notre changement de position relatif au champ :

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

Note

Cette méthode d’approximation de la position est connue sous le nom d’intégration d’Euler, mais nous l’utilisons pour les deltas de pose stricts au lieu d’intégrer la vitesse (il s’agit essentiellement d’une version très simplifiée de la théorie originale).

Avertissement

Ceci s’adresse aux programmeurs avancés ; bien que la mise en œuvre de cette méthode à partir de zéro soit un excellent exercice d’apprentissage, ce n’est probablement pas la meilleure façon d’obtenir la meilleure auto. Il existe plusieurs ressources pour produire une odométrie de qualité, bien testée et facile à mettre en œuvre.

Pseudocode d’Odométrie

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

Utilisation des exponentielles de pose

Cette méthode utilise des équations différentielles pour résoudre la position non linéaire du robot à courbure constante. L’intégration d’Euler suppose que le robot suit une trajectoire rectiligne entre les mises à jour, ce qui peut conduire à des approximations inexactes lorsqu’il se déplace dans des courbes. Si vous êtes intéressé par les mathématiques elles-mêmes, nous vous recommandons de consulter ce livre pour les commandes FRC®.

Nous traiterons la façon dont elle est résolue dans cette page comme une boîte noire, et nous déduirons la formule en appliquant une correction pour cette courbure non linéaire dans notre équation d’intégration d’Euler relative aux deltas des robots :

\[\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}\]

Ressources pour l’odométrie

Il existe plusieurs ressources excellentes pour l’odométrie. Nous recommandons vivement Road Runner. Pour les mathématiques de Road Runner (qui utilisent des exponentielles de pose), vous pouvez également lire l’article de Ryan <https://github.com/acmerobotics/road-runner/blob/master/doc/pdf/Mobile_Robot_Kinematics_for_FTC.pdf>`_. Une ressource supplémentaire pour Road Runner est Learn Road Runner qui est un guide de procédure étape par étape qui explique comment travailler avec le Road Runner quickstart.

Nous recommandons également le livre de Tyler <https://file.tavsys.net/control/controls-engineering-in-frc.pdf>_, car il explique en détail divers systèmes de contrôle en robotique FIRST*®.

Si vous utilisez d’autres ressources, il est important de ne pas utiliser celles qui utilisent l’intégration d’Euler, car elle est moins optimale pour les approximations réelles de la pose du robot.