Piloter le robot ================ **S'applique à :** :bdg-info-line:`Simulation` :bdg-warning-line:`Robot réel` Le robot se pilote au clavier, à la manette ou par programme, de la même façon en simulation et sur le robot réel. Les commandes se lancent **sur le PC**, le robot étant démarré (voir :doc:`demarrage`). .. important:: Avant de faire rouler un robot réel, sachez **l'arrêter** : voir :doc:`arrets`. La vitesse est plafonnée à **0,18 m/s** en ligne droite et **1,5 rad/s** en rotation, quelle que soit la commande, en simulation comme sur le robot réel. À la manette ------------ C'est la façon recommandée : une manette de type **DualShock 4**, branchée en USB sur le PC. Depuis la racine du dépôt : .. code-block:: bash ./scripts/ratbot joy La commande vérifie d'abord que la manette est branchée, puis rappelle les gestes ci-dessous. Elle équivaut à ``ros2 launch ratbot_bringup joy_fleet.launch.py``. Une seule manette pilote ainsi **jusqu'à quatre robots** : la gâchette que l'on tient désigne le robot qui bouge. .. list-table:: :header-rows: 1 :widths: 40 60 * - geste - effet * - **L1** tenue + stick gauche - pilote **le robot 1**, en vitesse lente (6 cm/s), pour se placer précisément * - **L2**, **R1**, **R2** tenues - pilotent les robots **2**, **3** et **4** * - **CARRÉ**, *en plus* de la gâchette - vitesse normale. **CARRÉ seul ne fait rien bouger** * - relâcher la gâchette - le robot s'arrête * - **PS** - **arrête tout le parc**, et ne relance jamais de lui-même * - **ROND** tenu + **SHARE** tapé 5 fois - **réarme** le parc après un arrêt par PS Le robot n'obéit que si sa gâchette est tenue : c'est le bouton **homme mort**. Le relâcher l'arrête. .. tab-set:: :sync-group: env .. tab-item:: Simulation :sync: sim Avec Docker, la manette doit être branchée **avant** le démarrage du conteneur, sans quoi elle n'y est pas visible. Vérifier : ``ls /dev/input/js*``. .. tab-item:: Robot réel :sync: reel La manette se branche sur le **PC**, pas sur le robot. Les ordres passent ensuite par le Wi-Fi : si celui-ci coupe, le robot s'arrête de lui-même. .. important:: **La manette doit être en mode PlayStation** : sa LED est **bleue**. Beaucoup de manettes génériques ont aussi un mode Xbox, LED **verte**, et basculent parfois de l'un à l'autre sur certaines combinaisons de boutons. En mode Xbox, les boutons ne sont plus à leur place : le logiciel le détecte, **bloque tous les robots** et affiche une erreur dans le terminal. Remettre la manette en mode PlayStation. .. warning:: **PS n'est pas un arrêt d'urgence.** Il passe par le Wi-Fi et par le PC : si l'un des deux fait défaut, il ne fait rien. Le vrai arrêt d'urgence est le bouton d'arrêt de chaque robot (voir :doc:`arrets`). Plusieurs manettes ~~~~~~~~~~~~~~~~~~ Pour une manette **par robot**, ``joy_teleop`` attribue un robot à une manette ; ``device_id`` désigne la manette (0 pour ``js0``, 1 pour ``js1``) : .. code-block:: bash ros2 launch ratbot_bringup joy_teleop.launch.py robot_id:=1 device_id:=0 ros2 launch ratbot_bringup joy_teleop.launch.py robot_id:=2 device_id:=1 Dans ce mode, le bouton **PS** n'arrête pas le parc : seul ``joy_fleet`` le gère. Une autre manette ~~~~~~~~~~~~~~~~~ La correspondance des axes et des boutons est réglée pour la DualShock 4. Pour un autre modèle, relever les numéros en manipulant la manette, pendant que ``./scripts/ratbot joy`` tourne : .. code-block:: bash ros2 topic echo /ratbot_fleet/joy Noter l'indice de ``axes[]`` qui varie quand on pousse le stick vers l'avant, celui qui varie vers la gauche, et l'indice de ``buttons[]`` de la gâchette. Les reporter dans ``ratbot_bringup/config/joystick.yaml``, recompiler (``./scripts/ratbot build --packages-select ratbot_bringup``), puis relancer la manette. Un axe inversé se corrige par une échelle négative. Au clavier ---------- Sans manette, le clavier : .. code-block:: bash ./scripts/ratbot key 1 Touches ``i`` avancer, ``,`` reculer, ``j`` / ``l`` tourner, ``u`` ``o`` ``m`` ``.`` en courbe, ``k`` ou **espace** arrêter ; ``q`` / ``z`` plus vite / moins vite (``w`` / ``x`` la vitesse seule, ``e`` / ``c`` la rotation seule). Vitesse de départ : 10 cm/s, au plus 0,18 m/s, la limite de la carte. La fenêtre du terminal doit avoir le focus pour que les touches soient prises en compte. **Une touche suffit** : on appuie une fois sur ``i``, le robot roule, sans tenir la touche, **jusqu'à** ``k``. Le clavier a la même priorité que la manette, et passe comme elle par le limiteur de vitesse et l'arrêt de flotte. .. warning:: **Le robot continue tant qu'on n'a pas arrêté**, même si l'on regarde ailleurs. Pour arrêter : ``k``, espace, ou **n'importe quelle autre touche** ; Ctrl-C arrête aussi le robot avant de quitter. Si le programme meurt ou si le réseau tombe, la carte arrête le robot d'elle-même en une demi-seconde. Jusqu'au 2026-10-19, il fallait tenir la touche, et le robot avançait par à-coups : le clavier ne répète une touche tenue qu'après environ 600 ms, plus que la demi-seconde au bout de laquelle la carte arrête un robot qui ne reçoit plus d'ordre. Une fois arrêté, le clavier se tait : la navigation, de priorité plus basse, peut reprendre la main sans qu'on ferme le programme. Par programme ------------- Le robot obéit à un message ``geometry_msgs/Twist`` publié sur ``/ratbot_N/base/cmd_vel`` : vitesse d'avance ``linear.x`` en m/s, vitesse de rotation ``angular.z`` en rad/s, positive vers la gauche. .. code-block:: bash ros2 topic pub /ratbot_1/base/cmd_vel geometry_msgs/msg/Twist \ "{linear: {x: 0.1}, angular: {z: 0.0}}" Le robot roule tant que la commande est publiée, et s'arrête une demi-seconde après la dernière. Les détails — priorités entre les sources de commande, topics des capteurs — sont dans :doc:`interface_ros`. Qui a la priorité ----------------- Plusieurs sources peuvent commander le même robot. La **manette et le clavier l'emportent** sur les programmes, qui l'emportent sur la navigation autonome : saisir la manette pendant une navigation suffit à reprendre la main, sans rien arrêter.