Aller au contenu

Génération de scénarios par IA — décrivez une manœuvre, obtenez un scénario vérifié

Écrire un scénario à la main oblige à nommer la route, la voie, le déclencheur et la dynamique de chaque acteur. Avec la génération par IA, il suffit de décrire la manœuvre — et le brouillon obtenu est exécuté dans un simulateur et vérifié avant d’atteindre votre canevas. Tout se passe dans votre navigateur, avec votre propre clé API.

Pour commencer : d’un canevas vide à un scénario

Section intitulée « Pour commencer : d’un canevas vide à un scénario »

Le chemin le plus court vers un scénario fonctionnel. Dessinez une voie, placez deux voitures, et dites ce qui doit se passer :

Vehicle2 cuts in front of Vehicle1.

D'un canevas vide à un cut-in en cours d'exécution : dessinez une voie à la main, placez deux véhicules, tapez une phrase, et le scénario généré est vérifié, appliqué puis joué — avant d'être rejoué au ralenti avec des traces fantômes et retouché à la main pour une seconde exécution.

Cinq étapes, rien de plus :

  1. Dessinez une voie avec l’outil Lane, puis passez en mode Scenario depuis le menu hamburger.
  2. Placez deux véhicules sur la voie avec Add actor.
  3. Ouvrez le panneau IA (le bouton AI sur la carte LOGIC) et tapez ce qui doit se passer. Cliquez sur un acteur du canevas pour insérer son nom.
  4. Cliquez sur Generate. Ce qui passe les vérifications est appliqué au canevas sous forme de phases et d’événements ordinaires — appuyez sur ▶ pour le voir tourner.
  5. Ajustez à la main. Les événements générés sont à vous, libre de les modifier. Dans la vidéo, l’exécution est rejouée avec les traces fantômes activées, la timeline est ramenée au moment du cut-in, et un événement est retouché dans l’éditeur avant une nouvelle lecture.

Rien dans le résultat n’est traité à part : parcourez la timeline, changez une vitesse ou un déclencheur, ajoutez une condition d’échec, ou exportez le .xosc — exactement comme pour un scénario que vous auriez écrit vous-même. Vous pouvez aussi continuer à dialoguer avec le panneau plutôt que de tout régénérer, voir Affiner en mots.

Le même principe sur un réseau routier OpenDRIVE importé — ici une carte CARLA Town05 — avec une requête plus longue : un dépassement qui se rabat et freine.

Vehicle2 comes up behind the Ego in the same lane, moves to the left lane, overtakes the Ego, and cuts back into the Ego’s lane soon after passing, leaving only a small gap. Immediately after cutting in, Vehicle2 brakes to 20 km/h. The Ego follows and keeps a safe distance.

Une seule prise sur une carte CARLA Town05 : importez le réseau routier, placez deux véhicules, décrivez le dépassement, et le scénario généré franchit les quatre filtres puis se rejoue avec un verdict PASS.
  1. Vous placez les acteurs sur le canevas et tapez la requête. L’emplacement que vous avez choisi pour un véhicule est traité comme une décision fixe — le modèle reçoit l’instruction explicite de ne pas le déplacer.
  2. Le modèle répond avec un storyboard — phases, événements, actions et déclencheurs — dans le format interne de drawtonomy, plutôt qu’en XML brut.
  3. Quatre filtres vérifient la réponse (voir ci-dessous). L’échec d’un filtre se transforme en une liste d’erreurs concrètes — quel champ, quel est le problème, comment le corriger — renvoyée au modèle pour une nouvelle tentative, jusqu’à trois fois.
  4. Un brouillon qui passe est appliqué au canevas sous forme de phases et d’événements ordinaires. Rien n’est appliqué sans avoir été exécuté au préalable, sauf si vous le demandez explicitement.

Le panneau de résultat après génération : quatre points verts pour les filtres, les phases générées dans la timeline, et la zone d'affinage

FiltreAffiché commeCe qu’il vérifie
1SyntaxLa réponse s’analyse correctement et respecte le schéma du storyboard — champs requis, types d’action et de déclencheur reconnus.
2LogicLes identifiants de voie existent sur la carte, les sens de circulation sont cohérents, les déclencheurs peuvent se déclencher, et la manœuvre correspond à la route réellement présente.
3RunLe scénario est réellement exécuté par esmini — compilé en WebAssembly, dans votre navigateur. Les événements qui ne se déclenchent jamais, les acteurs bloqués, les collisions et les sorties de route échouent ici.
4MeaningLa trajectoire enregistrée est mesurée par rapport à ce que demandait la requête. Un cut-in qui ne franchit jamais la ligne de voie échoue, même si l’exécution elle-même s’est déroulée sans accroc.

Le filtre 4 est une vérification géométrique sur la trajectoire enregistrée, pas un second avis donné par un modèle de langage. Si vous avez demandé un cut-in, quelque chose doit réellement s’insérer.

Indépendamment des filtres, une revue sémantique compare le storyboard généré à votre formulation et peut soulever des réserves — une étape capable de bloquer l’application automatique et de vous laisser la décision (Apply with concerns). Ces réserves sont indicatives ; ce sont les filtres qui constituent la barrière stricte.

Quand un filtre détecte un problème, il le corrige

Section intitulée « Quand un filtre détecte un problème, il le corrige »
  • Le problème exact — quel champ, quelle est l’erreur, comment la corriger — repart directement vers le modèle, qui retente sa chance. La plupart des requêtes passent dès la première ou la deuxième tentative.
  • Vous pouvez suivre le processus en direct : le panneau compte les tentatives et nomme l’étape en cours, de “Asking the AI…” à “Checking it matches your request…”, avec le détail filtre par filtre disponible sous Details.
  • Si une requête a besoin d’un coup de pouce de votre part, le bouton Try again apparaît, le brouillon reste visible dans la timeline, et tout scénario appliqué sans exécution propre est clairement signalé — de sorte qu’un scénario vérifié et un scénario non vérifié ne sont jamais confondus.

Le panneau de résultat après une génération réussie, avec le scénario appliqué et la ligne de revue sémantique

La génération s’appuie sur la carte que vous avez importée, pas sur des suppositions :

  • Routes et voies — identifiants de route, identifiants et types de voie, sens de circulation, quelles voies sont adjacentes, et laquelle se trouve à gauche ou à droite du point de vue du conducteur.
  • Les placements que vous avez faits — la route, la voie et la position le long de celle-ci pour chaque véhicule, marquées comme fixes.
  • Ce qui tient sur cette route — combien de route reste devant chaque acteur, et donc quelles vitesses et quelle durée de scénario sont réalisables. Si une vitesse demandée ne tient pas sur la route disponible, le panneau l’indique sous Fitted to the road plutôt que de la modifier en silence.

Les véhicules peuvent être placés sur des voies de circulation et sur des voies de bretelle (entrée, sortie, insertion, déboîtement, voie de raccordement) ; les piétons, sur les trottoirs, les passages piétons et les accotements. La même règle décide où vous pouvez déposer un acteur à la main, si bien que ce que vous pouvez dessiner et ce que l’IA peut proposer restent toujours alignés.

Le prompt tapé dans le panneau IA, avec les acteurs placés listés sous forme de puces au-dessus

drawtonomy traite l’ego comme l’élément que l’on teste, pas comme un acteur de plus à scripter. Dans la démo ci-dessus, rien dans le storyboard généré ne demande à l’ego de ralentir — la requête dit seulement “The Ego follows and keeps a safe distance.” Le freinage que vous observez est le contrôleur de régulation de référence qui réagit au cut-in et au ralentissement de la voiture rouge :

Vitesse
Voiture rouge (scriptée)60 km/h → 20 km/h, à partir de 0,7 s après son insertion dans la voie
Ego (non scriptée)40 km/h → 21 km/h, en suivant à 10 m

C’est la forme même d’un test utile : le stimulus est écrit, et la réponse est ce que vous mesurez réellement. Voir conditions de fin et d’échec pour transformer cette réponse en un verdict de réussite ou d’échec.

L'instant du cut-in : la voiture rouge s'installe dans la voie de l'ego et commence à freiner

Une fois un scénario appliqué, la même zone de saisie devient une zone d’affinage : décrivez le changement plutôt que de tout régénérer. Les affinages sont appliqués comme des modifications ciblées — une vitesse, un seuil de déclencheur, un événement ajouté ou supprimé, la durée du scénario — de sorte que les parties que vous avez déjà retouchées à la main restent inchangées.

Les ordres numériques simples sont traités sans faire appel au modèle. “Set Vehicle2 to 40 km/h” nomme un acteur, un nombre et une unité, donc drawtonomy le résout directement et le panneau signale qu’aucun appel à l’IA n’a été nécessaire. Tout ce qui reste ambigu est transmis au modèle.

Ce que le générateur peut exprimer aujourd’hui — et comment il se comporte quand une requête va au-delà.

  • Un vocabulaire de manœuvres complet — changements de vitesse, changements de voie, décalages latéraux, téléportations, maintien de distance et suivi de trajectoire, déclenchés par le temps de simulation, la distance relative, l’intervalle temporel, la vitesse, ou l’état d’un autre événement. Tout ce que vous générez arrive sous forme de phases et d’événements ordinaires, donc tout ce qui sort de ce vocabulaire n’est qu’à une modification manuelle de distance.
  • Des tentatives que vous ne voyez jamais — une requête peut être résolue dès le premier essai ou nécessiter jusqu’à trois tentatives, chacune corrigée par les filtres. Ce qui arrive sur votre canevas est la tentative qui a réussi.
  • Une durée d’exécution ajustée à la route — la durée du scénario est calculée à partir de la manœuvre, des vitesses et de la route disponible devant, de sorte que l’exécution se termine toujours sur du bitume réel. Besoin de plus long ? Demandez-le dans la zone d’affinage, et cela sera appliqué comme une modification ciblée.
  • De la place pour manœuvrer — un dépassement a besoin de route. Donnez aux acteurs un tronçon d’environ 30 m ou plus, et le solveur aura de quoi travailler.

La génération utilise votre propre clé API, si bien que les requêtes s’exécutent sur votre compte et votre quota. La clé est stockée dans votre navigateur et envoyée directement au fournisseur que vous avez choisi — elle n’atteint jamais un serveur de drawtonomy, ni un fichier, ni un journal.

Ouvrez le panneau AI dans l’éditeur de scénarios et cliquez sur API key en bas :

La ligne de clé API dans le panneau IA : une liste déroulante de fournisseur réglée sur Anthropic, un champ de clé, et un bouton Clear

  1. Choisissez un fournisseur — Anthropic (par défaut), OpenAI (ChatGPT), ou Gemini.
  2. Collez la clé et cliquez sur Save. Le champ affiche alors Replace key, et un bouton Clear apparaît pour la supprimer à nouveau.
  3. Les clés sont mémorisées par fournisseur, donc changer de fournisseur ne supprime pas l’autre clé.

Créez-en une dans la console Anthropic (Settings → API keys → Create Key). Un compte Anthropic avec du crédit API est nécessaire ; les formules d’abonnement Claude sont distinctes de l’accès à l’API.

Le panneau indique la cause plutôt que d’échouer en silence :

Ce que vous voyezQue faire
The key was rejectedVérifiez que la clé est valide, qu’elle a accès à l’API, et qu’elle est limitée à un seul workspace (voir ci-dessus).
The API is rate limiting this keyAttendez un instant et cliquez sur Try again.
The API is temporarily unavailableUne panne temporaire côté fournisseur ; réessayez sous peu.