Toutes les modifications importantes du projet seront documentées dans ce fichier.
Le format s’inspire de Keep a Changelog, et le projet utilise une logique de versionnement stable à partir de la version v1.0.0.
Registre local de modèles nommés (scripts 10 et 11). Le pipeline passe d'un
modèle unique à un emplacement fixe (~/lerobot/outputs/train/act_so101_pick_place/)
à plusieurs modèles nommés sous ~/lerobot/outputs/train/<nom>/. On peut ainsi
entraîner et conserver plusieurs modèles issus de démonstrations différentes, puis
choisir explicitement lequel déployer — sans réentraîner entre deux démonstrations.
- Modèles nommés (scripts 10 et 11). Chaque entraînement crée ou reprend un modèle nommé sous
~/lerobot/outputs/train/<nom>/. Le nom est libre (validé par^[a-z0-9][a-z0-9_-]*$, il commence par une lettre ou un chiffre) et devient le nom exact du dossier, sans préfixe ajouté. Fonction partagéecheckpoint_chargeable(): un checkpoint n'est considéré valide que si sonpretrained_model/contientconfig.jsonetmodel.safetensors(les deux fichiers chargés parACTPolicy.from_pretrained()). - Script 10 : menu de sélection ou création de modèle en tête de l'entraînement (nouvelles fonctions
checkpoint_chargeable,lister_modeles,nom_modele_valide,selectionner_ou_creer_modele). - Script 11 : sélection explicite du modèle (aucun modèle par défaut) avant la sélection du checkpoint (nouvelle fonction
selectionner_modele) ; le résumé de fin d'exécution affiche le modèle utilisé en plus du checkpoint.
- Script 10 :
OUTPUT_DIRdynamique (base communeTRAIN_BASE = ~/lerobot/outputs/train). Le fichiersem_training_params.jsonest désormais écrit dans le dossier du modèle, après le lancement (et non plus « à côté du script »), afin de ne pas créer unoutput_dirnon vide qui ferait échouer un entraînement neuf. Menu de reprise : l'ancien « Nouveau » devient « Remplacer ce modèle » (suppression gardée par la saisie deSUPPRIMER), avec une nouvelle option « Choisir un autre modèle ». Un dossier existant même partiel (entraînement interrompu/échoué) ne bloque plus le nom : il est routé vers la reprise/le remplacement. - Script 11 :
selectionner_checkpoint()ne liste et ne recommande que des checkpoints chargeables (config.json+model.safetensors) ; sanslastchargeable, la recommandation retombe sur le plus grand checkpoint numérique chargeable. Le comptage des checkpoints affiché dans les menus repose lui aussi surcheckpoint_chargeable.
- Remplacement d'un modèle (script 10) gardé par une confirmation forte : saisie explicite du mot
SUPPRIMER. Fail-closed — aucune suppression silencieuse ; toute autre saisie conserve le modèle.
- Guides Phase 9 (entraînement) et Phase 10 (déploiement) réalignés : sélection/création de modèle nommé, convention de nommage sans préfixe, règle « ne pas renommer un dossier de modèle », menu de reprise (Remplacer/
SUPPRIMER, Autre modèle), sélection du modèle avant le checkpoint, chemin exactcheckpoints/<step>/pretrained_model/, et formulation du checkpoint recommandé (lasts'il est chargeable, sinon le plus grand checkpoint numérique chargeable). Atténuation du paragraphe sur l'« équivalence » de la prolongation (comportement de reprise à confirmer sur letrain.pyinstallé). - READMEs et documents annexes réalignés :
README_fichiers.md(sem_training_params.jsondésormais dans le dossier du modèle ; racineoutputs/train/par modèle nommé),README_scripts.md(descriptions des scripts 10/11, stockage par modèle nommé, filtre « chargeable »),README_guides.md(registre de modèles, sélection du modèle), etportage_autre_PC.md(copie de l'ensemble~/lerobot/outputs/train/— tous les modèles nommés — et note sur déploiement vs reprise d'un modèle porté).
Changement de direction sur la gestion de la lumière, validé par les tests machine réels de la chaîne complète (scripts 8 → 11 : enregistrement → consolidation → entraînement → déploiement).
Les versions précédentes cherchaient à rendre chaque session visuellement identique à une référence fixe enregistrée : verrouillage matériel de l'exposition, de la balance des blancs et du gain (camera_settings.json, module camera_config), et référence visuelle chiffrée par caméra avec contrôle de conformité et recalibrage vers cette référence (module camera_reference), plus un mode LEGACY pour les datasets antérieurs. Cette approche supposait un éclairage reproductible.
Or, en salle de classe, l'éclairage ne se contrôle pas (emplacement, heure, saison) : exiger la convergence de chaque session vers une référence fixe unique est physiquement intenable. Le nouveau principe inverse la logique : chaque caméra laisse son exposition (et sa balance des blancs) s'ajuster automatiquement à la lumière réelle de la salle, puis la fige pour la durée de la session (cohérence intra-session, sans exiger d'identité inter-session). La robustesse à la variété d'éclairage est recherchée en enregistrant des démonstrations sous des conditions lumineuses variées mais exploitables — une augmentation d'éclairage à l'entraînement pourra la renforcer ultérieurement. Un contrôle image simple sur l'image brute (plancher physique de lumière) remplace la comparaison à une référence.
- Module
SEM_so101_camera_auto.py: réglage de l'exposition (et de la balance des blancs) auto puis figée par session (viav4l2-ctl; secteur 50 Hz anti-scintillement ; convergence courte flux actif, puis figeage), et contrôle image simple sur l'image brute (avant masque) — luminosité et part de pixels très clairs / très sombres. La caméra globale est mesurée dans la zone utile du masque, la caméra pince en plein cadre. Verdict gradué 🟢 (exploitable) / 🟠 (limite) / 🔴 (cramée ou écrasée), fail-closed (un réglage non appliqué arrête le script appelant).
- Script 8 (enregistrement) migré vers
camera_auto: identification des caméras en fenêtre live (touches directes G / P / Q / Échap), réglage exposition auto puis figée au démarrage de session, puis contrôle image avant chaque bloc. Suppression du verrouillage matériel et des menus de référence. - Script 11 (déploiement) migré vers
camera_auto: réglage exposition auto puis figée et contrôle image avant l'inférence ; modèle chargé sur le périphérique disponible (GPU si présent, sinon CPU). Suppression du contrôle contre les références du dataset, du verrouillage matériel, de la résolution de la traçabilité méta (resoudre_meta_dataset) et du modeLEGACY. - Script 9 (consolidation) : suppression de la copie des références caméra dans le
meta/du dataset et des états de traçabilité associés (copiée / partielle / absente / échec).
- Du workflow courant : modules
SEM_so101_camera_config.py(verrouillage matériel) etSEM_so101_camera_reference.py(référence visuelle : zones, diagnostic de conformité, recalibrage), fichiercamera_settings.json, copie des références caméra dans lemeta/, et modeLEGACYau déploiement. guvcviewn'est plus un outil requis (optionnel, inspection manuelle uniquement) ;v4l-utils(commandev4l2-ctl) reste requis.
- Guides de phase réalignés sur le nouveau paradigme : Phase 1 (outils caméra :
v4l-utilsrequis,guvcviewoptionnel), Phase 7 (enregistrement : exposition auto puis figée + contrôle image, philosophie d'éclairage réécrite), Phase 8 (retrait de la traçabilité « référence visuelle »), Phase 10 (déploiement : contrôle image, GPU/CPU, prérequis calibration Follower). Guides des phases 2, 3, 4, 5, 6 et 9 inchangés (non concernés). - READMEs réalignés :
README_guides.md,README.md,README_EN.mdetREADME_scripts.md— retrait des modules et fichiers de l'ancien paradigme, section uniquecamera_auto, harmonisation GPU/CPU (« fortement recommandé ; CPU possible mais beaucoup plus lent »), tables d'identification et de contrôle image.
Fiabilisation de la définition de la position de repos (script 3) et de la chaîne de référence visuelle des caméras (module SEM_so101_camera_reference.py, version interne 8.2), avec alignement des guides correspondants (phases 3, 7, 10).
- Refonte du flux de calibration (script 2) : le mode
[1]calibre le Follower en premier (bras critique), puis enchaîne automatiquement le Leader. Les 6 servos d'un bras sont mesurés en mémoire ; le fichier de calibration n'est écrit qu'après validation du tableau ancien → nouveau ([O]valider,[N]recommencer les 6,[A]abandonner). Une interruption ou un abandon conserve l'ancienne calibration. Après un Follower validé, un Leader non finalisé devient un avertissement non bloquant (le bras critique reste enregistré). - Mode maintenance ciblé (script 2) : le mode
[2]recalibre explicitement un seul bras (Follower ou Leader) et sauvegarde immédiatement chaque servo validé — distinct du mode complet[1]à écriture différée. - Position de repos = Follower uniquement (script 3) : la capture (
C) et la saisie manuelle (M) ne sont proposées que lorsque le Follower est monitoré ; sur le Leader, le monitoring reste disponible mais ces touches sont refusées. Suppression du contournement « taper OUI » qui permettait d'enregistrer un repos depuis le Leader. Le repos est désormais affiché comme « référence Follower ». (repos_position.jsonest unique et partagé par les scripts 4, 5, 6, 7, 8 et 11 ; le Follower est le bras de référence du déploiement.) - Marge de tolérance et bornage du repos (script 3) : une position est acceptée dans
[min − 2 %, max + 2 %]de l'amplitude calibrée (jeu mécanique en butée), mais le pourcentage enregistré reste borné à[0, 100]— cohérent avec les consommateurs (scripts 11 et 4) qui rejettent toute valeur hors[0, 100]et bornent les cibles de déploiement à[min, max]. - Récapitulatifs du repos (script 3) : affichage distinct du % brut (position physique, non borné, informatif) et du % enregistré (borné, réellement stocké) ; en saisie manuelle (
M), une table de référence (position actuelle, %, MIN/CENTRE/MAX, repos déjà enregistré) précède la saisie. - Réglages caméra
[R]toujours accessibles (module de référence caméra) : le (re)réglage via guvcview est désormais disponible même lorsque les réglages sont verrouillés ; refaire les réglages invalide la référence, qui doit alors être recréée avec[4]. - Validation d'un écart orange
[V]dans le recalibrage guidé[7](module de référence caméra) : lorsque le verdict global est 🟠 (jamais 🔴), une option[V]permet d'accepter explicitement l'écart non bloquant (typiquement la sentinelle couleur, souvent d'origine géométrique) après confirmation forte. Supprime la boucle de réglage sans issue lorsque seul un critère plafonné-orange subsiste. En déploiement (script 11), la validation se fait sans modifier la référence du dataset (lecture seule). Libellé de[7]ajusté : « Recalibrer vers la référence (validation verte ou orange confirmée) ».
- Sécurisation de la calibration (script 2) : détection fail-closed d'un mauvais nombre d'adaptateurs branchés (refus de la session), confirmation explicite du rôle du bras (Leader/Follower indiscernables électriquement), refus des amplitudes trop faibles (
< 500ticks), conservation de l'ancienne calibration en cas d'échec ou d'abandon, et avertissement anti-chute avant le relâchement du couple. Un statut interne non nul en lecture est signalé sans bloquer tant que la communication reste valide. - Porte qualité anti-saturation à la création de référence
[4](module de référence caméra) : la capture est refusée si une zone pilote obligatoire dépasse ~1 % de pixels saturés, ou si le bol devient une sentinelle morte (Y ≥ 254.5etsigma_Y < 0.5, ou > 30 % de pixels saturés). Empêche d'enregistrer une référence surexposée, inexploitable pour le diagnostic ultérieur.
- Guide Phase 3 aligné sur la refonte de la calibration et du repos : parcours Follower puis Leader, écriture différée en mode
[1], mode maintenance[2], confirmation de rôle, avertissement anti-chute, gestion des statuts internes ; puis repos Follower-uniquement (sécurités, marge 2 % et bornage, modesC/M, table de référence, récapitulatif des touches). - Guide Phase 7 aligné sur le module caméra
8.2:[R]toujours disponible et son effet sur la référence, porte qualité anti-saturation, validation orange[V]dans[7], entrées de dépannage correspondantes ; suppression des formulations « une seule fois » devenues fausses. - Guide Phase 10 : le recalibrage de déploiement peut se valider en 🟢 ou sur un 🟠 confirmé via
[V](sans modifier la référence du dataset).
Compatibilité CPU de l'entraînement et réalignement complet de la documentation sur la nouvelle numérotation des scripts (8 enregistrement → 9 consolidation + visualisation → 10 entraînement → 11 déploiement).
- Entraînement compatible CPU (script 10) : en l'absence de GPU CUDA, le script n'échoue plus — il affiche un avertissement non bloquant et bascule automatiquement sur le CPU (
--policy.device=cpu,--policy.use_amp=false). Sur GPU, le comportement est inchangé (cuda+ AMP). L'entraînement reste possible sur une machine sans GPU, au prix d'une lenteur nettement accrue. - Commentaires internes (script 7) réalignés sur la nouvelle numérotation : références neutres aux scripts d'enregistrement et de déploiement, à la place des anciennes mentions « scripts 8 et 12 ».
- Message d'import du module caméra (scripts 8 et 11) : en cas d'absence du module de configuration caméra, l'erreur affiche désormais le nom canonique
SEM_so101_camera_config.py, et non l'exception du dernier repli de la cascade d'imports.
- Réalignement complet sur la numérotation 8 → 11 des guides des phases 7 à 10, de
README_guides.md,README_scripts.mdet duREADME.mdglobal : suppression des références aux scripts périmés (SEM_so101_10_visualize_dataset.py,SEM_so101_11_train.py,SEM_so101_12_deploy.py,SEM_so101_8_camera_config.py) et harmonisation de la formulation GPU/CPU (« GPU fortement recommandé — CPU possible mais beaucoup plus lent »). Ceci clôt le point « à réaligner — en cours » de la version 1.2.
Durcissement de sécurité et de robustesse de la chaîne enregistrement → entraînement → déploiement, et renumérotation des scripts. Les versions internes passent à : script 9 2.1, script 10 1.1, script 11 1.1, module de configuration caméra 5.1.
- Renumérotation des scripts. La visualisation du dataset est intégrée au script 9 (l’ancienne étape de visualisation séparée disparaît) ; l’entraînement passe de
11à10(SEM_so101_10_train.py) et le déploiement de12à11(SEM_so101_11_deploy.py). Le pipeline opérateur devient : 8 (enregistrement) → 9 (consolidation + visualisation) → 10 (entraînement) → 11 (déploiement). Les mentions de « script 12 » de la version 1.1 correspondent désormais au script 11. - Module de configuration caméra renommé au nom canonique
SEM_so101_camera_config.py, avec cascade de repliSEM_so101_8_camera_config.py→SEM_8_camera_config.pypour les anciens dépôts. Tous les consommateurs (scripts 8, 9, 11 et module de référence) sont alignés sur cet import. - Téléopération avec caméra (script 7) : aperçu du masque existant avant la décision « conserver / refaire », validation stricte des 5 points du masque, correction de l’annonce d’étape, garde sur l’ouverture de la fenêtre d’affichage.
- Enregistrement (script 8) : identification des caméras placée après la mise au repos des bras (la vue de la caméra pince dépend de la pose du bras) ;
ThreadedCameraaligné sur le déploiement (codec MJPG forcé) ; gestion d’un échec de retour repos dans le contrôle pré-bloc, avec restauration de l’état de téléopération.
- Sélection de checkpoint (scripts 10 et 11) : tri par valeur entière au lieu d’un tri alphabétique. Sans dossier
last, le script recommandait50000au lieu de200000, soit un modèle moins entraîné. Le repli privilégie le plus grand checkpoint numérique avant un éventuel dossier non numérique. - Reprise d’entraînement (script 10) :
steps_du_checkpointretombe sur le plus grand checkpoint numérique voisin lorsquelastest un vrai dossier et non un lien symbolique — l’option « Prolonger » ne se bloque plus à tort. - Préparation du dataset (script 9) : vérification du moteur Parquet et de la résolution vidéo (640×360) avant traitement ; distinction propre des états de référence caméra (échec / absente / partielle) selon la présence réelle des sources locales.
- Numérotation interne et messages des scripts 9 à 11 alignés sur la nouvelle numérotation.
- Calibration chargée avant le couple (script 11) : la calibration Follower est chargée et validée avant toute activation du couple. Une calibration absente, incomplète ou corrompue est refusée alors qu’aucun servo n’est sous tension — plus de bras laissé rigide sur un fichier illisible.
charger_calibrationest rendu fail-closed (jamais d’exception qui remonterait). - Écritures servo contrôlées (script 11) :
ecrire_positionvérifie la communication (COMM_SUCCESS) et borne chaque cible à la plage calibrée[min, max]du servo — barrière contre une prédiction aberrante du modèle. La boucle d’inférence déclenche un arrêt sûr (coupure du couple) après 3 itérations d’inférence consécutives comportant une écriture en échec. - Retour repos fiable (script 11) :
mouvement_servoset la phase de levée d’épaule écrivent désormais de façon contrôlée ;aller_position_reposne peut plus annoncer « Position repos atteinte » alors qu’une écriture a échoué. La relance d’un essai (Entrée) est refusée tant que le retour repos n’est pas confirmé, conformément à l’invariant « nouvel essai = départ du repos ». - Traçabilité du modèle (script 11) :
resoudre_meta_datasetest plus strict. Un checkpoint non traçable (train_config.jsonabsent ou illisible,repo_idmanquant,meta/introuvable) est bloquant. Le mode LEGACY reste réservé aux datasets identifiés mais antérieurs au système de références caméra (un seul cas :meta/présent, aucune référence). - OpenCV et caméras (script 11) : sortie propre en tête de
main()si OpenCV est indisponible, avant tout engagement servo ; stabilisation déterministe des caméras après le verrouillage des réglages, pour que la première action du modèle lise des images post-verrouillage. - Prérequis d’entraînement fail-closed (script 10) : un
info.jsonillisible et un dossier~/lerobotabsent produisent une erreur claire au lieu d’un plantage ; vérification de PyAV (requis par--dataset.video_backend=pyav) ; préflight du dataset (épisodes et frames > 0, présence d’au moins un Parquet et des deux dossiers vidéocam_top/cam_follower). - Identification active des caméras (scripts 7 et 8) : les deux caméras identiques sont identifiées une par une (touches G / P / Q) au lieu de prendre
cameras[0], peu fiable ; refus si aucune image n’est lisible. - Configuration caméra fail-closed (module
SEM_so101_camera_config.py) : lecture des réglages distinguant fichier absent / valide / corrompu ; uncamera_settings.jsoncorrompu n’est plus réécrit silencieusement (sauvegarde horodatée avant toute action) ; verrouillage matériel fail-closed.
- CHANGELOG mis à jour (présente entrée).
- Guides de phase et README à réaligner sur la nouvelle numérotation (scripts 10 et 11) — en cours.
- Système de référence visuelle des caméras (
SEM_so101_camera_reference.py) : référence chiffrée par caméra (zones de mesure, score de conformité 🟢/🟠/🔴), en remplacement du réglage caméra « à l'œil ». - Architecture multi-caméra : un profil par caméra (globale et pince), avec ses propres zones, critères et fichiers de référence.
- Contrôle de conformité des deux caméras intégré au script 8 (avant chaque bloc d'enregistrement) et au script 12 (au démarrage du déploiement, contre les références du dataset d'entraînement).
- Recalibrage guidé vers la référence lorsque l'éclairage a dérivé.
- Mode LEGACY au déploiement pour les modèles entraînés avant ce système (références locales, après confirmation explicite).
- Traçabilité : copie des références des deux caméras et du journal dans le
meta/du dataset à la consolidation (script 9).
- Flux d'enregistrement (script 8) et de déploiement (script 12) réordonné : les robots sont identifiés et mis au repos avant la préparation des caméras (la vue de la caméra pince dépend de la pose du bras).
- Module de configuration caméra renommé
SEM_so101_8_camera_config.py(repli sur l'ancienSEM_8_camera_config.py). - Réglage caméra « à l'œil » remplacé par le contrôle mesuré dans les scripts 8 et 12.
- Politique fail-closed : suppression des options « continuer sans contrôle » et « continuer quand même » (verrouillage caméra). Un contrôle indisponible se répare ou s'annule ; à l'enregistrement, l'autorisation exige les deux caméras conformes.
- Masque de la caméra globale rendu obligatoire à l'enregistrement et au déploiement.
- Guides des phases 7, 8 et 10 mis à jour (flux bi-caméra, référence visuelle, traçabilité).
- README mis à jour : global (FR/EN), guides et scripts.
- Pipeline complet pour le projet éducatif SO-ARM 101.
- Guides d’installation et d’utilisation par phases.
- Scripts SEM pour la configuration, la calibration, la téléopération, l’enregistrement de dataset, l’entraînement et le déploiement.
- Support de deux bras SO-ARM 101 : Leader et Follower.
- Support de deux caméras :
cam_topetcam_follower. - Enregistrement de datasets pour l’apprentissage par imitation.
- Consolidation et vérification du dataset.
- Conversion vidéo H.264 si nécessaire.
- Entraînement d’un modèle ACT avec LeRobot.
- Déploiement autonome du modèle entraîné.
- Masque partagé de zone utile pour la caméra globale.
- Verrouillage des réglages caméra : exposition, balance des blancs et gain.
- Sécurités opérateur : retour repos, arrêt d’urgence, contrôle caméra et contrôle série.
- Script 8 : protection contre la corruption du dataset en cas de lecture ou écriture série invalide.
- Script 12 : déploiement autonome avec retour repos, pause, relance explicite et verrouillage caméra.
- Documentation racine du projet.
- Structure du dépôt
Scripts_SEM.
- Licence Creative Commons BY-NC-SA 4.0.