Battle robotique Alstom

De Wiki Clubelek
Révision datée du 26 juin 2026 à 11:06 par Matthieu.felten (discussion | contributions) (Ajout de la desciption et de conseils de l'année 2026 !)

Introduction

Chaque année depuis 2024, Alstom organise une Battle Robotique avec plusieurs écoles Lyonnaises. Elle a lieu vers mai dans leurs locaux (vers vaulx-en-velin, compter une bonne demi-heure en vélo pour y aller).

Cette page a pour vocation de recenser les conseils pour faire le meilleur score !

Détails de la compétition

En 2024, 2025 et 2026, le jour J se présentait comme trois manches avec un terrain qui s'agrandit entre chaque manche. Vous avez environ 3 minutes par manche, et 1h entre deux manches, sauf la dernière avec 30min. L'objectif est de marquer le plus de points (en s'arrêtant aux gares) en en perdant le moins (pas de sortie de voie, pas d'accident et pas d'interventions humaines).

Ah et au fait il y a pas le droit à de l'électronique en plus sur le terrain, donc tout espoir de feu de signalisation part à la poubelle.

Il y a un "kickoff" qui sert à QUE DALLE, juste ils vous expliquent ce que je vous ai dit en 1 paragraphe. Mais bon il faut y aller quand même, mais si vous avez cours vous emmerdez pas.

Le cash prize va sûrement changer, les années précédentes, c'était 1000 euros pour les premiers, puis 500 pour les autres (mais en 2025, on a volé de la colle UHU donc techniquement on a plus gagné que les 3e et 4e) et en 2026, on a fait premier !!!!

Les robots

Le coupable 🖕

Sauf changement, Alstom utilise des petits bangers de robots qui s'appellent les Edison. (/s évidemment ils sont rincés du cul).

Vous en aurez genre 2 pour vous préparer (avant le jour J, environ 4 semaines) et 5 le jour de la compétition, ou un truc du genre.

Leurs specs

  • 2 récepteurs IR (droite/gauche) (GROSSE MERDE)
  • 2 émetteur IR (droite/gauche)
  • 1 buzzer
  • 2 photorésistances (droite/gauche)
  • 1 capteur de suivi de ligne
  • 2 LEDs (droite/gauche)
  • 2 moteurs CC en boucle ouverte

Et c'est tout.

Voici les conseils des années précédentes (sauf de 2026) :

Dans l'idée c'est pas mal, en revanche il est impossible de les faire communiquer entre eux. Oui, même votre super idée de protocole de communication mesh en infrarouge avec correction d'erreur qui marche super au club. Il y a beaucoup trop d'interférences IR le jour de la compétition, la range max est de 3 cm à tout péter.

De plus, le capteur suivi de ligne est utilisable uniquement en 0 ou 1. Il renvoie une valeur analogique, mais ca varie tellement avec l'éclairage et l'état de la piste (les roues des robots font des traces sur le tapis) que vous allez juste galérer pour rien.

Ces conseils sont donnés après deux années d'expérience avec ces robots de merde, et environ 1200 lignes de code qui essaie de les faire moins puer leur mère, soldées à chaque fois par un échec cuisant et une réecriture du code en 20 lignes.

/!\ Leurs batteries font changer la vitesse des moteurs et de la préscision des capteurs (y compris le suivis de ligne) donc gardez les tous les plus chargés possibles sinon ils risquent de se rattraper.

Conseils de 2026 :

La communication est possible (et nécéssaire pour une manche), mais ne basez rien d'autre là dessus, ce sera juste de la récéption d'un octet....

/!\ Le capteur de distance doit être calibré avant la compétition : https://meetedison.com/content/Edison-robot-barcodes.pdf

La texture de la map à changé, et est beaucoup mieux (moins de traces par les robots) et avec une echelle de gris pour les gares et intersections. Des exemples sont dans un des casiers du club.

Le code

Pour programmer ces robots, vous ferez la connaissance de EdPy, qui est je pense le pire language que j'ai jamais utilisé (et j'ai fait du brainfuck sur papier un jour). Globalement c'est du python en moins bien. Vous ne pourrez pas les flash depuis autre chose que leur interface de merde.

Les limitations de EdPy

  • Un seul fichier
  • Pas de classe
  • Pas de liste 2D (donc pas de liste de string)
  • Pas de fonctions built-in
  • Uniquement des variables en int
  • Plein d'autre trucs mais j'avoue flemme de les lister, en gros, c'est du C mais transformé avec la syntaxe de Python :/

Bon le conseil principal que je peux vous donner : faites au plus simple. Utilisez le suivi de ligne le plus simple possible, ne communiquez pas entre les robots, hardcodez le plus possible.

Un conseil pour que ce soit plus tolérable : vous pouvez coder sur VSCode et copier/coller votre code dans l'interface. Pour avoir l'autocomplétion, j'ai ajouté un fichier avec toutes les fonctions que j'ai trouvé ici : https://github.com/Bdanilko/EdPy/blob/master/src/EdPy.py

Utilisez le gitlab, un dossier est déjà créé à l'interrieur, et prenez plusieurs PC, quand vous faites une maj et que vous devez patch tous les robots à 3 minutes du démarrage de la manche vous serez contents d'êtres plusieurs sur le coup. => Là rentre en jeu la numérotation des robots et une feuille avec la liste des robots qui ont étés patch.

Les conseils généraux

Le lieu

  • L'éclairage change au fil de la journée : si vous êtes à côté de la baie vitrée, vous aurez un soleil rasant pour la dernière manche (=> attention à recalibrer les capteurs IR au fil du temps), pour le moment, on y a été toutes les années (et les stores ne voulais pas se baisser).
  • Le buffet (bonbons l'année dernière) est bien mais se fait raid rapidement, après 16h il reste plus grand chose.
  • Une multiprise est fournie mais pas de chargeur USB. Prévoyez des hub et des chargeurs en rab pour garder tous les robots à 100% avant chaque manche.
  • Vous aurez pas mal de robots, numérotez les dès le départ pour pas oublier d'en update/charger un. Vous êtes pas obligés de tous les utiliser à chaque fois, ça peut être renta d'en retirer pour éviter que ce soit le zbeul.

Les stratégies

  • La stratégie de 2026 à été de faire fonctionner les robots au max de leur vitesse (sans qu'ils sortent de la ligne) et de désservir un maximum de gares. Le capteur de distance ne marchant pas, on a juste poser les robots à equidistance au début, et quand certains se rapprochaient, on les a juste remis en place (tant pis pour la pénalité). Les autre équipes avaient des robots beaucoup plus lent, et donc on gagnés moins de points (on a roulé sur tout le monde).
  • Les capteurs IR marchent pas si mal en détection d'obstacle (non, pas pour 2026), une fois calibrés. Pour les calibrer, il faut scanner le code barre Calibrate Obstacle Detection ici : https://meetedison.com/content/Edison-robot-barcodes.pdf . Imprimez cette feuille et ramenez la, ça sauve des vies.
  • Vous pouvez calibrer la vitesse des roues pour presque avoir l'impression qu'il y a un PID derrière le suivi de ligne.
  • Si vous voulez aller vite, faire deux fois Ed.DriveRightMotor(Ed.FORWARD, Ed.SPEED_FULL , Ed.DISTANCE_UNLIMITED) va plus vite qu'une seule fois.
  • Pour les embranchements, vous pouvez choisir leur direction en changeant la ligne 16 pour faire un suivi de ligne à gauche ou à droite.
  • En 2024 et 2025, on a recouvert les robots de scotch alu pour "améliorer la détection IR" mais je pense c'est placebo, par contre ca faisait qu'ils étaient vachement stylés et tout le monde trouvait ca drôle donc possiblement à continuer.
  • Une "cape" qui augmente la taille verticale des robots aide à la détection par l'arrière (+ points de swag) (non, pas d'après 2026...)

Le code de 2026

Le code est disponible sur le gitlab : https://gitlab.clubelek.fr/matthieu.felten/alstom-2026-robotique

Pour notre année, les lignes que les robots devait suivre étaient en échelle de gris. Donc il fallait trouver les valeurs breakpoint de chaque robots pour passer d'un gris à un autre.

Dedans, il y a :

  • Les modèles 3D des éléments du décor utilisés
  • Le script de calibration pour les échelles de gris
  • Un tuto pour l'utiliser (dans le README)
  • Le fichier principal qu'on a utilisés durant la compétition (et qui nous a fait gagné !)

Les constantes ont étés trouvés un peu au pif en fesant de l'asservissement manuel, mais elles ont l'air de bien fonctionner. Juste les informations de calibrations doivent être redéfini pour chaque rabot dès que l'on change de lieu ou de lumière.

Le code de 2025

Nous avions le droit a des robots "gares", qui avaient des tubes à la place des roues et qui faisaient barrière. Il fallait donc que les robots "trains" s'arrêtent avant, puis continuent lorsque la barrière est levée. Nous avions une solution ultra complexe qui a pas marché du tout, et donc en 45 minutes entre les deux manches, nous avons fait ca pour les trains :

import Ed

Ed.EdisonVersion = Ed.V3

Ed.DistanceUnits = Ed.CM
Ed.Tempo = Ed.TEMPO_MEDIUM

Ed.TimeWait(250, Ed.TIME_MILLISECONDS)
Ed.ObstacleDetectionBeam(Ed.ON)

Ed.LineTrackerLed(Ed.ON)

driving = True;
while True:
    if driving :
        if Ed.ReadLineState()==Ed.LINE_ON_WHITE :
            Ed.DriveLeftMotor(Ed.STOP, Ed.SPEED_1, Ed.DISTANCE_UNLIMITED)
            Ed.DriveRightMotor(Ed.FORWARD, Ed.SPEED_8 , Ed.DISTANCE_UNLIMITED)
        else :
            Ed.DriveLeftMotor(Ed.FORWARD, Ed.SPEED_FULL, Ed.DISTANCE_UNLIMITED)
            Ed.DriveRightMotor(Ed.STOP, Ed.SPEED_1, Ed.DISTANCE_UNLIMITED)
    else :
        Ed.Drive(Ed.STOP, Ed.SPEED_FULL, Ed.DISTANCE_UNLIMITED)
    if Ed.ReadObstacleDetection() > 0 :
        driving = False
    else :
        driving = True
        
    Ed.ReadObstacleDetection()

Dans l'idée ils suivent la ligne tant qu'ils ont pas d'obstacle. Les différentes vitesses ont étées ajustées par la méthode scientifique pour avoir les meilleures perfs possibles (c'est faux on a fait au pif). Pour s'arrêter aux gares, nous avions mis des bouts de papier sur les barrières qu'ils détectaient. Mais comment faisions-nous pour que les gares s'ouvrent toutes en même temps et laissent passer les robots ? Très simple :

import Ed
Ed.DistanceUnits = Ed.CM
Ed.Tempo = Ed.TEMPO_MEDIUM
Ed.EdisonVersion = Ed.V3


def openBarrier() :
    Ed.Drive(Ed.SPIN_LEFT, Ed.SPEED_4, 47)

def closeBarriers() :
    Ed.Drive(Ed.SPIN_RIGHT, Ed.SPEED_4, 47)

Ed.TimeWait(4, Ed.TIME_SECONDS)
while True:
    openBarrier()
    Ed.TimeWait(500, Ed.TIME_MILLISECONDS);
    closeBarriers();
    Ed.TimeWait(8, Ed.TIME_SECONDS);

Ouais c'est tout, juste on hardcodait des valeurs au pif. Ca a bien marché, on est passés de big derniers à deuxième en jouant que deux manches sur trois.