Interface ROS 2

S’applique à : Simulation Robot réel

Cette page décrit ce qu’un programme voit du robot : les topics à publier pour le commander, ceux à lire pour connaître son état, et les services. Tous sont des types ROS 2 standards : un programme n’a besoin d’aucun paquet du RatBot pour piloter ou observer un robot.

Les noms sont donnés relativement à l’espace de noms du robot : base/cmd_vel désigne /ratbot_1/base/cmd_vel pour le robot 1. Seuls les noms commençant par / sont absolus.

Commander le robot

Le point d’entrée est base/cmd_vel (geometry_msgs/Twist) :

ros2 topic pub /ratbot_1/base/cmd_vel geometry_msgs/msg/Twist \
   "{linear: {x: 0.1}, angular: {z: 0.0}}"

linear.x est la vitesse d’avance, en m/s ; angular.z la vitesse de rotation, en rad/s, positive vers la gauche. Les autres champs ne s’appliquent pas à une base différentielle et sont ignorés.

Avertissement

ros2 topic pub publie en continu : le robot roule jusqu’à Ctrl+C. Inversement, un programme doit republier sa consigne régulièrement : la carte du robot arrête les moteurs une demi-seconde après la dernière commande reçue.

La chaîne de commande

Les commandes n’atteignent pas directement les moteurs. Elles traversent trois étages :

base/cmd_vel_teleop  (priorité 100) ┐
base/cmd_vel         (priorité 50)  ┼─► twist_mux ─► limiteur ─► garde-barrière ─► moteurs
base/cmd_vel_nav     (priorité 10)  ┘
Arbitrage (twist_mux)

Retient la source active la plus prioritaire : la manette et le clavier (cmd_vel_teleop) l’emportent sur les programmes (cmd_vel), qui l’emportent sur la navigation autonome (cmd_vel_nav). Une source est considérée inactive une demi-seconde après son dernier message.

Limiteur

Plafonne la vitesse à 0,18 m/s et 1,5 rad/s, quelles que soient les valeurs demandées. Réglage : ratbot_bringup/config/velocity_limits.yaml.

Garde-barrière

Force la commande à zéro tant que l’arrêt de flotte est actif. Placé en dernier, aucun autre étage ne peut l’adoucir.

Un programme publie sur base/cmd_vel, en tête de chaîne : il bénéficie ainsi des protections. Les topics situés en aval ne doivent pas être publiés directement.

Lire l’état du robot

Topic

Type

Contenu

base/odom

nav_msgs/Odometry

odométrie des roues seules, sans fusion

odometry/filtered

nav_msgs/Odometry

odométrie fusionnée roues + gyroscope

base/joint_states

sensor_msgs/JointState

position et vitesse de chaque roue

scan

sensor_msgs/LaserScan

mesures du lidar

sensors/tof/depth

sensor_msgs/Image

capteur de distance avant : 8 × 8 distances en millimètres, 0 = pas de mesure (voir Le capteur de distance avant)

sensors/tof/points

sensor_msgs/PointCloud2

les mêmes en points 3D, le sol posé à hauteur nulle

sensors/tof/clearing

sensor_msgs/PointCloud2

rayons d’effacement du capteur de distance (Nav2 seulement) : tout le champ, jusqu’à la mesure ou jusqu’à 1,5 m

sensors/imu/data_raw

sensor_msgs/Imu

accélérations et vitesses angulaires de la centrale

sensors/battery

sensor_msgs/BatteryState

état de la batterie

sensors/temperature

sensor_msgs/Temperature

température de la carte

status/emergency_stop

std_msgs/Bool

true tant que le bouton d’arrêt du robot est enfoncé, ou que son arrêt n’a pas été réarmé. L’arrêt automatique n’y figure pas : il se lit dans les diagnostics, bloc motion guard

/diagnostics

diagnostic_msgs/DiagnosticArray

santé détaillée du robot (voir Diagnostics)

Les deux « odom »

Le mot désigne trois choses, source fréquente de malentendus :

Nom

Nature

Contenu

base/odom

topic

odométrie des roues brute, publiée par la carte du robot

odometry/filtered

topic

fusion des roues et du gyroscope, par robot_localization

ratbot_N/odom

repère

repère de position produit par la fusion, donc fusionné

La cartographie et la navigation utilisent le repère odom, donc la position fusionnée, comme le veut l’usage ROS. Le topic base/odom reste brut à dessein : comparé à la fusion, il sert de témoin indépendant, et c’est sur lui que se mesure la qualité de l’odométrie (voir Calibrer l’odométrie).

Toute odométrie dérive : les erreurs de mesure et les glissements s’accumulent sans limite. Seul un capteur extérieur — le lidar, en cartographie et en navigation — permet de la recaler.

Arrêter et réarmer par programme

L’arrêt de flotte arrête tous les robots à la fois. C’est le même que celui du bouton PS de la manette (voir Arrêter et relancer le robot) :

ros2 topic pub --qos-reliability reliable --qos-durability transient_local \
   /ratbot_fleet/emergency_stop std_msgs/msg/Bool "data: true"

data: false lève l’arrêt. Le topic est absolu : il vaut pour tout le parc. La qualité de service transient_local est indispensable : le dernier message est conservé et transmis aux robots qui démarrent ensuite, faute de quoi un robot allumé après l’ordre d’arrêt l’ignorerait.

Important

Ce n’est pas un organe de sécurité : il passe par le réseau et par du logiciel. Pour protéger quelqu’un, il y a le bouton d’arrêt de chaque robot.

Les services de la carte du robot :

Service

Type

Effet

rearm

std_srvs/Trigger

réarme après un arrêt par le bouton du robot ou un arrêt automatique ; refusé tant que le bouton est enfoncé

bench_mode

std_srvs/SetBool

mode banc : met l’arrêt automatique en pause (voir Arrêter et relancer le robot)

reset_odometry

std_srvs/Trigger

remet l’odométrie des roues à zéro

log, log_clear

std_srvs/Trigger

lit ou efface le journal de bord (voir Journal de bord)

ros2 service call /ratbot_1/rearm std_srvs/srv/Trigger