Calibrer le gyroscope ===================== **S'applique à :** :bdg-warning-line:`Robot réel` Le robot porte un **gyroscope**, dans sa centrale inertielle, qui mesure ses rotations indépendamment des roues. Il sert à la **sécurité** (le robot qui patine) et à la **navigation** : l'EKF le fusionne avec l'odométrie des roues. Comme les roues, il faut le **calibrer**. Sinon, au lieu d'améliorer l'odométrie, il la **dégrade**. Mesuré sur RatBot : avec un gyroscope mal réglé, la position estimée après un carré de 1,3 m était fausse de **30 cm**, contre **7 cm** une fois réglé. Un gyroscope a deux défauts possibles. Le zéro : automatique --------------------- Immobile, un gyroscope ne lit jamais exactement zéro : il « dérive » lentement, comme si le robot tournait de quelques degrés par minute. Cette dérive **change d'un jour à l'autre**, et même d'un démarrage à l'autre. **Vous n'avez rien à faire.** La carte du robot remesure ce zéro **toute seule, chaque fois que le robot est vraiment immobile** : roues arrêtées et aucun mouvement pendant deux secondes et demie. Pendant un trajet, le zéro ne change pas ; il se remet à jour au premier arrêt prolongé. .. tip:: Laissez le robot **immobile quelques secondes après l'avoir posé**, avant de le faire rouler. C'est ce qui lui permet de mesurer son zéro. Pour vérifier qu'il le fait, deux compteurs du bloc ``imu`` des diagnostics (voir :doc:`diagnostics`) : ``gyro_zero_updates`` augmente à chaque remesure, et ``gyro_zero_z_urads`` donne la dérive retirée en ce moment. L'échelle : à mesurer une fois par robot ---------------------------------------- Le second défaut est l'\ **échelle** : un gyroscope peut compter un tour complet comme 357° ou 363° au lieu de 360°. Cette erreur est **propre à chaque puce** : elle se mesure **une fois par robot**, comme le diamètre de ses roues. Le test est simple : **le robot tourne sur place jusqu'à ce que son gyroscope ait compté dix tours**, et vous regardez **de combien il dépasse** sa position de départ, ou s'arrête avant. Sur dix tours, une erreur de 1 % fait 36° d'écart : elle se voit à l'œil. Le même test mesure aussi l'échelle des **roues** en rotation, ce qui vérifie au passage l'entraxe trouvé par la calibration de l'odométrie (:doc:`calibration`). La correction s'écrit ensuite dans la carte, dans le réglage ``gyro_scale`` (voir :doc:`parametres`), et y reste, même robot éteint. **Ce qu'elle apporte, mesuré sur RatBot** : le gyroscope comptait 1,007 tour pour un vrai tour. Une fois corrigé, la position estimée par la fusion roues + gyroscope, après un carré de 1,3 m, est passée de 4,3 cm d'erreur à **2,3 cm** — contre 4,2 cm pour les roues seules. Ce qu'il vous faut ~~~~~~~~~~~~~~~~~~ - environ **50 cm × 50 cm** de sol dégagé ; - une **ligne de référence au sol** : une latte de parquet, un joint de carrelage, ou un morceau de ruban adhésif ; - le robot **allumé et prêt** (voyant bleu), le **ST-Link débranché** ; - un terminal sur le Raspberry Pi du robot. La façon simple : la calibration guidée ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Depuis la racine du dépôt : .. code-block:: bash ./scripts/ratbot-calibrate 1 gyro Le script vérifie que le robot répond et que rien d'autre ne le pilote (navigation, exploration ou cartographie de ce robot : il refuse de démarrer), sauvegarde les réglages de la carte, enchaîne le test dans les deux sens, puis affiche les deux échelles, leur écart et la **valeur proposée** (leur moyenne). Il ne l'écrit dans la carte qu'après votre accord, puis sauvegarde les nouveaux réglages dans ``cahier_de_labo/config/``. Les mesures sont rangées dans ``cahier_de_labo/campagnes/``. **Le robot ne tourne qu'après un « o » tapé par vous.** .. warning:: **Pendant les tours, le bouton PS de la manette n'arrête pas le robot** : l'outil commande les roues directement, sans passer par la chaîne de commande habituelle. Pour l'arrêter, utilisez le **bouton d'arrêt du robot**. ``./scripts/ratbot-calibrate 1 stats`` affiche ensuite l'échelle mesurée et sa date. Pour vérifier que le gyroscope améliore bien la position du robot, chaque mesure UMBmark compare les roues seules à robot_localization (roues + IMU) : voir ``compare`` dans :doc:`calibration`. ``apply`` réécrit plus tard les réglages d'une campagne (voir :doc:`calibration`, *Consulter et décider*). Les sections suivantes détaillent le test, sa lecture et la correction ; elles donnent aussi les commandes pour le faire à la main. Faire le test ~~~~~~~~~~~~~ 1. Posez le robot **par terre**, pas sur sa boîte : il doit vraiment tourner. 2. **Alignez un bord du robot** sur la ligne de référence. Ici, une croix de ruban adhésif : le robot est posé dessus, ses bords parallèles aux deux bandes. .. figure:: _static/gyroscope/position-initiale.jpg :align: center :width: 70% La position de départ, sur une croix de ruban adhésif. 3. Lancez : .. code-block:: bash ros2 run ratbot_calibration gyro-scale-run --robot 1 --direction ccw \ --out ~/calibration_gyro 4. Appuyez sur **Entrée**. Le robot reste **immobile 3 secondes** — ne le touchez pas, il mesure son zéro — puis **tourne dix fois sur place**, vers la gauche, pendant environ 80 secondes. 5. À l'arrêt, regardez le bord du robot par rapport à la ligne, et répondez à la question : **de combien de degrés a-t-il dépassé la ligne**, dans son sens de rotation ? - **positif** s'il est allé **trop loin** ; - **négatif** s'il s'est arrêté **avant**. Une estimation à 2 ou 3° près suffit. L'outil vous relit votre réponse en clair : confirmez. Pour la lire, tracez au crayon, sur le ruban, la direction du bord du robot à l'arrêt, puis mesurez l'angle avec la ligne de départ à l'aide d'un rapporteur. .. figure:: _static/gyroscope/mesure-depassement.jpg :align: center :width: 70% Après les dix tours : les traits au crayon, un par sens de rotation, et le rapporteur qui mesure leur écart à la ligne de départ. 6. Recommencez **dans l'autre sens**, avec ``--direction cw``. Lire le résultat ~~~~~~~~~~~~~~~~ .. code-block:: text gyro scale 1.00540 (1 real turn counted 361.94 deg) wheels scale 0.99881 (1 real turn counted 359.57 deg) gyro_scale on the board: 1.00000 -> to set: 1.00540 Average the ccw and cw values, then: ros2 param set /ratbot_1/ratbot_controller gyro_scale wheelbase implied by the wheels: 0.141475 m (set: 0.141643) .. list-table:: :header-rows: 1 :widths: 30 70 * - ligne - ce qu'elle veut dire * - ``gyro scale`` - l'échelle du gyroscope. **1,000 = parfait.** 1,008 veut dire qu'il compte 362,9° pour un vrai tour : 0,8 % de trop * - ``wheels scale`` - la même chose pour les roues. Un écart à 1 veut dire que l'entraxe réglé n'est pas le vrai * - ``to set`` - la valeur de ``gyro_scale`` à écrire dans la carte, **en tenant compte de celle déjà en place** : refaire le test après une correction l'affine * - ``wheelbase implied`` - l'entraxe qui rendrait les roues justes en rotation. Il doit être proche de celui trouvé par la calibration de l'odométrie **Les deux sens doivent donner presque la même échelle.** S'ils diffèrent de plus de quelques millièmes, refaites le test : le robot a peut-être glissé, ou la mesure du dépassement est douteuse. Chaque test écrit un fichier ``…_gyro_scale_ccw.yaml`` ou ``…_cw.yaml`` dans le dossier donné par ``--out``. **Gardez-les** : ils disent d'où vient la valeur réglée. .. tip:: **Si les deux sens donnent des échelles un peu différentes**, regardez aussi l'échelle des roues : si elle bouge **dans le même sens**, c'est votre estimation du dépassement qui varie, pas le capteur. Le rapport ``gyro scale`` ÷ ``wheels scale`` ne dépend pas de cette estimation ; si vos roues ont été calibrées par UMBmark, c'est la valeur la plus sûre. Sur RatBot : 1,0054 et 1,0087 selon le sens, mais 1,0066 et 1,0076 en rapport — d'où **1,007**. Appliquer la correction ~~~~~~~~~~~~~~~~~~~~~~~ Faites la moyenne des deux sens, puis : .. code-block:: bash cd ~/ratbot_ws ./scripts/ratbot config 1 save cahier_de_labo/config/ratbot1_avant_gyro.yaml ros2 param set /ratbot_1/ratbot_controller gyro_scale 1.007 ./scripts/ratbot config 1 save cahier_de_labo/config/ratbot1.yaml \ --origin "echelle gyroscope $(date +%F)" Pour vérifier, refaites un test : l'échelle mesurée doit maintenant être très proche de **1,000**. Le diagnostic ``gyro_scale_ppm``, dans le bloc ``imu`` (voir :doc:`diagnostics`), montre la valeur appliquée : 1007000 pour 1,007. En cas de souci ~~~~~~~~~~~~~~~ **« the robot was not still during the bias measurement »** Quelqu'un a touché le robot, ou la table a bougé, pendant les 3 secondes d'immobilité. Relancez. **Le robot s'arrête en orange avant la fin** Une sécurité s'est déclenchée — le plus souvent le patinage, si le sol est glissant. Réarmez (5 appuis sur SW1, voir :doc:`arrets`), et essayez une vitesse plus faible : ``--speed 0.5``. **« FAILED: no IMU or odometry »** La pile du robot ne tourne pas, ou le robot vient juste de démarrer. Attendez le voyant bleu.