Tous les articles

hid_ros2 : une passerelle matérielle à plus de 500 Hz pour ROS 2 (retour sur mon exposé à la ROSConFr)

Le problème : intégrer du matériel sur mesure dans ROS 2

L'un des plus gros points de friction en robotique, c'est connecter du matériel sur mesure à ROS 2. Pince, capteur d'effecteur, contrôleur à microcontrôleur ou périphérique d'entrée maison : le parcours actuel est pénible.

  1. Écrire un driver d'interface matérielle en C++ (qui demande une bonne maîtrise de ROS 2 et du contrôle)
  2. Le compiler avec les bibliothèques ROS 2 du système
  3. Déboguer l'intégration
  4. Recommencer pour chaque nouvel appareil

Il doit y avoir plus simple.


L'idée : l'USB-HID comme standard universel

L'USB-HID (Human Interface Device) est partout : souris, claviers, manettes, joysticks maison. C'est un protocole standard intégré à tous les systèmes d'exploitation. Pourtant, les roboticiens y pensent rarement comme à un outil robotique.

Et si l'on inversait la démarche ? Au lieu d'écrire du C++ pour chaque appareil, on pourrait :

  1. Décrire la structure de données de l'appareil dans un simple fichier de configuration YAML
  2. Brancher son microcontrôleur (Teensy, ESP32, STM32…) qui parle HID
  3. Obtenir immédiatement une interface matérielle ros2_control, sans compilation

C'est hid_ros2.


L'architecture

hid_ros2 est un plugin d'interface matérielle unique et réutilisable pour ros2_control qui assure :

La découverte et la gestion du matériel

  • Détection automatique des périphériques HID par identifiant fabricant/produit
  • Gestion propre du branchement à chaud (déconnexion/reconnexion)
  • Connexions persistantes et résilientes

Une intégration pilotée par la configuration

  • Le fichier YAML décrit :
    • les identifiants fabricant/produit ;
    • la structure des rapports (quels octets correspondent à quels capteurs/actionneurs) ;
    • les types de données, facteurs d'échelle, décalages ;
    • la fréquence de mise à jour (100 Hz, 500 Hz, 1000 Hz selon le système).
  • Aucun changement de code pour prendre en charge un nouvel appareil

Des E/S performantes

  • Accès USB-HID au niveau du noyau via libhidapi (multiplateforme : Linux, macOS, Windows)
  • File de données sans verrou pour la sûreté temps réel
  • Fréquences d'interrogation garanties jusqu'à 1000 Hz sur du matériel compatible
  • Communication déterministe à faible latence (< 5 ms en général, souvent < 2 ms)

Une intégration native ROS 2

  • Interface matérielle ros2_control standard, compatible avec tous les contrôleurs ros2_control
  • Communication sûre en temps réel (mémoire préallouée)
  • Intégration transparente avec MoveIt2, les contrôleurs de trajectoire et les publieurs d'état

Exemple : un effecteur sur mesure

Imaginez une pince sur mesure à 4 degrés de liberté avec 4 moteurs asservis en position et 6 capteurs tactiles. Votre microcontrôleur (disons une Teensy 4.1) est déjà programmé pour :

  • lire 4 consignes moteur dans un rapport HID (8 octets, 2 par moteur) ;
  • mesurer 4 positions de codeur et les renvoyer dans un rapport HID (8 octets, 2 par codeur) ;
  • mesurer 6 capteurs tactiles analogiques et les envoyer dans le même rapport (12 octets, 2 par capteur).

Avec hid_ros2, votre configuration ressemble à ceci :

device:
  vendor_id: 0x16C0     # Teensy's default VID
  product_id: 0x0486    # Your custom PID
  report_rate_hz: 500

joints:
  motor_0:
    out_report: [0, 1]    # bytes 0-1 of outgoing HID report
    in_report: [0, 1]     # bytes 0-1 of incoming (encoder feedback)
    scale: 0.01           # encoder counts to radians
  motor_1:
    out_report: [2, 3]
    in_report: [2, 3]
    scale: 0.01
  # ... (motor_2, motor_3)

sensors:
  tactile_0:
    in_report: [8, 9]     # byte 8-9 of incoming report
    scale: 0.001          # analog to normalized pressure
  # ... (tactile_1 through tactile_5)

Ensuite, dans votre fichier de lancement, vous chargez le contrôleur de pince ros2_control standard, et c'est terminé. Aucun driver C++ à écrire.


Pourquoi c'est important

Pour les roboticiens qui ne développent pas de drivers

On peut intégrer du matériel sur mesure sans être programmeur système C++. L'intégration matérielle devient accessible à tous.

Pour les fabricants de matériel

Décrire une fois, fonctionner partout. Un fabricant de pinces peut livrer un seul fichier YAML avec son produit, et ses utilisateurs peuvent brancher et utiliser sur n'importe quelle plateforme ROS 2.

Pour l'accessibilité

Une barrière d'entrée plus basse, c'est plus de monde qui construit des robots. Un matériel plus varié, c'est plus d'innovation.

Pour la performance

L'USB-HID est natif dans le noyau de tous les systèmes modernes. On obtient une communication déterministe à faible latence sans privilèges particuliers.

Pour la reproductibilité

Les équipes peuvent partager leurs configurations matérielles et reproduire des résultats. Les laboratoires collaborent plus facilement.


L'exposé à la ROSConFr 2025

Présentation de hid_ros2 à la ROSConFr
Présentation de hid_ros2 à la ROSCon France 2025 (en toute transparence : la photo est générée par IA faute de photographe sur place, mais j'y étais vraiment !)

Les chiffres (présentés à la ROSConFr 2025)

Mesures de performance sur un poste Linux classique :

  • Latence de communication : 1,2 ms en général, < 2 ms au 99e centile
  • Utilisation CPU : < 5 % sur un système 4 cœurs
  • Fréquence d'interrogation : jusqu'à 1000 Hz (selon l'appareil et le système ; 500 Hz couramment)
  • Temps de configuration : moins d'une minute pour un nouvel appareil (écrire le YAML, tester, c'est fait)
  • Code à écrire par nouvel appareil : zéro ligne de C++

Exemple concret : nous avons intégré 3 plateformes matérielles sur mesure (une pince à microcontrôleur, une matrice de capteurs, un périphérique d'entrée maison) en une seule session de la ROSCon France, littéralement pendant l'exposé.


Open source et communauté

hid_ros2 est publié sous licence Apache 2.0, entièrement open source :

GitHub : adnan-saood/hid_ros2 Documentation : guides d'installation, exemples de configuration, dépannage Communauté : déjà utilisé dans plusieurs laboratoires et start-up ; les contributions sont les bienvenues


Et ensuite ?

Fonctionnalités prévues :

  • un outil graphique pour générer les configurations YAML (détection de l'appareil, correspondance automatique) ;
  • la prise en charge des périphériques HID composites (plusieurs points de terminaison) ;
  • un signal de vie pour la sûreté temps réel (chiens de garde) ;
  • journalisation et télémétrie intégrées pour le débogage.

Vision à long terme : Un écosystème standardisé et indépendant des fabricants, où matériel et logiciel s'intègrent aussi facilement que dans l'électronique grand public.


Merci à la ROSConFr 2025

Ce travail a mûri grâce aux retours de la formidable communauté robotique de la ROSCon France. Merci en particulier :

  • aux équipes d'ICube Strasbourg et de l'U2IS pour les tests en conditions réelles ;
  • aux mainteneurs de ROS 2 / ros2_control pour la qualité du framework ;
  • aux communautés Teensy, STM32 et ESP32 qui prennent en charge le HID nativement.

Si vous avez un projet matériel et voulez essayer hid_ros2, commencez ici : README sur GitHub, ou installez le binaire ROS 2 depuis apt.ros.org.


À voir aussi :