Aller au contenu

Phase 3 : Déploiement (ROS 2)

On y est. Après des heures de collecte de données et d'entraînement de modèles, il est temps de lâcher notre IA dans la nature (enfin... dans Gazebo).

Cette page documente comment notre modèle .onnx prend vie dans un vrai système robotique ROS 2. On parle nœuds, topics, sécurité, et surtout : comment éviter que l'IA ne finisse dans le décor.

Enfin la Phase Finale !

C'est le moment de vérité. Votre réseau de neurones va enfin conduire. Attachez vos ceintures.


1. Vue d'Ensemble

L'architecture de déploiement suit un principe de sécurité par conception : l'humain a toujours la priorité sur l'IA.

autopilot_diagramme

Le flux est simple : les 3 caméras alimentent le nœud Autopilot qui charge le modèle ONNX et prédit l'angle de braquage. En parallèle, le joystick envoie ses commandes via Teleop-command. Le command_mux fusionne ces deux sources en donnant toujours la priorité à l'humain. La sortie finale (/audibot_cmd) est envoyée à Gazebo pour contrôler le véhicule.

Promis, c'est rapide !

On vous explique la théorie ci-dessous, mais pas de panique : c'est court cette fois. Si vous êtes pressés, les commandes sont tout en bas. 👇


2. Le Modèle ONNX

Le fichier .onnx exporté en Phase 2 est stocké dans iliar_solution/models/. C'est le "cerveau" du véhicule : un graphe de calcul figé, ultra-rapide, sans dépendance Python.

Le modèle attend 3 images en entrée (une par caméra) et produit 1 angle en sortie.

Type Nom Dimensions Description
Entrée left (1, 3, 128, 128) Image caméra gauche (normalisée 0-1)
Entrée forward (1, 3, 128, 128) Image caméra centre
Entrée right (1, 3, 128, 128) Image caméra droite
Sortie output (1,) Angle de braquage prédit (radians)

3. Nœud autopilot.py

C'est le nœud qui fait "tourner l'IA". Il réalise l'inférence en temps réel.

I. Pipeline d'Inférence

Étape Action
1 Chargement — Au démarrage, charge le modèle ONNX via onnxruntime
2 Synchronisation — Attend les 3 images caméras (message_filters)
3 Prétraitement — Décode JPEG → Resize 128x128 → Normalise → Transpose CHW
4 Inférence — Appelle ort_session.run() avec les 3 tenseurs
5 Publication — Envoie l'angle prédit sur /autopilot/steering_cmd

II. Topics ROS

⬅️ Entrées Type Description
left_image CompressedImage Image caméra gauche
front_image CompressedImage Image caméra centre
right_image CompressedImage Image caméra droite
➡️ Sorties Type Description
steering_cmd Float64 Angle volant prédit
throttle_cmd Float64 Commande gaz

III. Paramètres

Paramètre Type Description
model_path string Chemin absolu vers le fichier .onnx
max_throttle float Vitesse maximale autorisée

4. Nœud Command Mux

Ce nœud est le gardien de sécurité. Il assure que l'humain a toujours le dernier mot, même si l'IA "délire".

I. Rôle

Le Command Mux est un multiplexeur qui fusionne deux sources de commandes :

Source Priorité Topics
Teleop (Joystick) 🥇 Haute /teleop/steering_cmd, /teleop/throttle_cmd
Autopilot (IA) 🥈 Basse /autopilot/steering_cmd, /autopilot/throttle_cmd

La sortie finale (/audibot/*_cmd) est envoyée au véhicule.

II. Logique d'Arbitrage

Événement Action
Commande Teleop reçue Transmise immédiatement + on mémorise l'heure
Commande Autopilot reçue On vérifie si Teleop est inactif depuis timeout secondes
↳ Si inactif On transmet la commande IA
↳ Si actif On bloque la commande IA (silence)

Exemple : Si l'humain touche le joystick, l'IA est coupée pendant 0.5s. Pendant ce temps, même si l'autopilot envoie des commandes, elles sont ignorées.

III. Topics ROS

⬅️ Entrées Type Source
/teleop/steering_cmd Float64 Joystick
/teleop/throttle_cmd Float64 Joystick
/autopilot/steering_cmd Float64 Autopilot
/autopilot/throttle_cmd Float64 Autopilot
➡️ Sorties Type Destination
/audibot/steering_cmd Float64 Voiture
/audibot/throttle_cmd Float64 Voiture

IV. Paramètres

Paramètre Type Défaut Description
timeout float 0.5 Durée (s) pendant laquelle l'IA reste bloquée après une action humaine

5. Launcher autopilot.launch.xml

Ce fichier XML orchestre le démarrage complet de la stack de pilotage autonome.

I. Nœuds Lancés

# Nœud Package Rôle
1 simu_gui.launch.xml iliar_solution Infrastructure (Gazebo + RViz)
2 command_mux iliar_solution Arbitre de sécurité Teleop/Autopilot
3 teleop_command iliar_solution Joystick → /teleop/*_cmd
4 autopilot iliar_solution ONNX → /autopilot/*_cmd
5 path_publisher iliar_solution Publie le tracé du circuit
6 path_dilater iliar_solution Génère les voies dilatées
7 dist_to_path iliar_solution Calcule le CTE (Cross Track Error)

II. Arguments du Launch

Argument Type Défaut Description
circuit string circuit3.sdf Fichier monde Gazebo à charger
onnx_filename string models/PilotNetResNet.onnx Chemin vers le modèle ONNX
spawn_car bool true Faire apparaître la voiture dans la simulation

III. Exemples de Commandes

Lancement par défaut :

ros2 launch iliar_solution autopilot.launch.xml

Avec un circuit spécifique :

ros2 launch iliar_solution autopilot.launch.xml circuit:=circuit1.sdf

Avec un modèle ONNX custom :

ros2 launch iliar_solution autopilot.launch.xml onnx_filename:=/chemin/vers/MonModel.onnx

Sans spawn de voiture (pour debug) :

ros2 launch iliar_solution autopilot.launch.xml spawn_car:=false

Commande complète :

ros2 launch iliar_solution autopilot.launch.xml circuit:=circuit2.sdf onnx_filename:=/home/user/models/best.onnx spawn_car:=true