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.

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