Skip to content

Essai T1 du 5 novembre : couples mesurés, contact et serrage en géométrie, alerte d'arrêt prolongé - #28

Merged
OS-AXIS merged 4 commits into
mainfrom
contact-geometrique-t1
Nov 5, 2026
Merged

OS-AXIS merged 4 commits into
mainfrom
contact-geometrique-t1

Conversation

@OS-AXIS

@OS-AXIS OS-AXIS commented Nov 5, 2026

Copy link
Copy Markdown
Owner

Essai GPU T1 du 5 novembre 2026 (12 h 50) : 5 prises, 0 triée

Constat : toutes les prises « prise non confirmée » (« serrage insuffisant, -2.9 à -3.4 N à la main au plus serré, 5 au moins »). Le juge du banc compte 10 « contacts manqués », alors que les mains serraient vraiment le carton, à 6 à 9,5 N.

1. Contact : l'OS l'avait vu, le juge le perdait

  • Les lignes réelles du CSV de l'essai (test/donnees/t1_prise_20261105_1250.csv, réduit aux colonnes utiles), rejouées dans la logique de décision (signal_contact), donnent un contact en géométrie sur les 10 mains, avant le passage au serrage.
  • Le juge recevait les contacts estimés à la fin de la prise. Or ils étaient effacés au même pas que l'échec, avant son bilan. Désormais, il garde chaque contact estimé dès qu'il apparaît (JugeContacts.pas(estimes=…)).

2. Force par les couples : le banc ne lisait pas les couples

  • Le pont, le backend et le banc lisaient get_applied_joint_efforts, c'est-à-dire les efforts passés à set_joint_efforts. Ils sont nuls quand les articulations sont commandées en position. L'OS ne recevait donc que le bruit d'estimation ajouté par le banc.
  • Chiffres pendant le serrage : force réelle 7,3 N en moyenne, force estimée −2,8 N, corrélation −0,03. Couple lu du roulis : +0,09 ± 0,35 N·m.
  • Lecture des couples : le banc lit maintenant l'effort mesuré par la physique (get_measured_joint_efforts, la force de l'articulation projetée sur son axe), plus les erreurs d'estimation de BruitCouples. La source est choisie à l'initialisation par bruit_couples.source_couples, et le journal la dit au démarrage :
    • couples lus : effort MESURÉ par la physique (get_measured_joint_efforts) ;
    • ou, si l'effort mesuré manque (méthode absente, erreur, mauvaise taille, valeurs non finies), repli sur les efforts imposés, avec la raison et l'annonce du verdict « NON FIABLES ».
  • Même source pour IsaacSimBridge.read_feedback (lu par JointSafetyGuard), read_all_raw (pompe du mode sandbox), le backend Isaac et la prise du banc T1.
  • Verdict de fiabilité : la calibration des couples juge s'ils suivent la pesanteur du modèle (CalibrationCouples.fiabilite, pente comprise entre 0,5 et 1,5). S'ils ne la suivent pas (verdict « NON FIABLES », écrit au journal), la force estimée ne décide plus ni du contact, ni du serrage, ni de la confirmation au levage. Elle reste au diagnostic, et les plafonds de couple restent jugés sur le couple. Sur un robot aux couples justes, rien ne change. Si la pente est proche de −1, le journal suggère un signe inversé (diagnostic seulement).

3. Serrage et confirmation en géométrie (couples non fiables)

  • Les mains avancent jusqu'à la même limite et au même pas qu'avant.
  • La prise est acceptée si chaque main reste retenue : au moins 1 cm en arrière de sa consigne, à 1,5 cm au plus de la face touchée, immobile à 3 mm près pendant 0,3 s.
  • Levage : contrôles existants, et mains toujours retenues.
  • Sur le CSV : les 10 mains sont retenues (1,8 à 2,0 cm de retard, immobiles à 1 mm près). Toutes avaient été refusées sur la force.
  • Mains refermées sur le vide : toujours refusé (« rien entre les mains »).

4. Arrêt de sécurité prolongé pour la même cause

  • Le carton poussé de 5 cm hors de la table arrêtait le robot par à-coups. Le gardien a raison d'arrêter, on n'y touche pas. Mais chaque reprise remettait à zéro le compte de l'alerte des 60 s : l'app attendait en silence.
  • Désormais, après 20 s d'arrêt pour la même cause (même point à 15 cm près, reprises brèves comprises), l'app envoie une seule alerte, qui donne la cause : la raison du gardien, de combien le point dépasse le bord de quelle table, et le carton suivi le plus proche (FacadeServices.cause_arret). Exemple :

    robot arrêté par la sécurité depuis 20 s, toujours pour la même cause : obstacle inexpliqué à 0.50 m — ARRÊT, point en (3.53, 1.93) ; il dépasse de 7 cm le bord de la table du poste « prise » ; carton bleu à 0.18 m (vu en dernier en (3.60, 2.10)) : sans doute ce carton, à remettre en place sur la table

  • Banc : l'opérateur simulé remettait le carton en place au bout de 20 s, ce qui donnait des arrêts de 15 à 19 s : l'alerte ne pouvait pas partir. Désormais, le premier carton dérangé de l'essai, et lui seul, attend 40 s. Les autres attendent toujours 20 s.

⚠️ Les vérifications de couple faites jusqu'ici dans Isaac Sim n'ont rien prouvé

Tout ce qui vérifiait les couples contre les limites de l'URDF dans Isaac Sim lisait get_applied_joint_efforts, donc des efforts imposés nuls en commande de position (le cas de tous les essais) :

  • la campagne de validation (S1.2, « couple réellement appliqué jamais au-dessus de l'effort de l'URDF ») ;
  • le JointSafetyGuard, via IsaacSimBridge.read_feedback ;
  • les plafonds de couple de la prise.

Ces vérifications lisaient zéro, plus le bruit d'estimation. Elles n'ont rien prouvé dans Isaac Sim, et sont à refaire avec l'effort mesuré. docs/campagne_validation_isaac.md le dit maintenant.

À vérifier au prochain essai GPU

  • Au démarrage : la ligne couples lus : effort MESURÉ. Je n'ai pas pu lire la documentation ni le code de l'API d'Isaac Sim 6.1 depuis cette session (accès réseau refusé). Le code s'appuie sur la page Articulation Joint Sensors de la documentation NVIDIA (get_measured_joint_efforts), et vérifie à l'initialisation que la méthode existe et rend une valeur finie par articulation. Sinon, il retombe sur les efforts imposés et le dit.
  • Le verdict de la calibration des couples : « fiables » (pente proche de 1). Si la pente est proche de −1, le signe est inversé.
  • L'ALERTE « même cause » à 20 s, pendant l'attente de 40 s de l'opérateur.

Ce qui ne change pas

JointSafetyGuard, GardienProximite, VLAService, le critère « rien entre les mains », les contrôles de levée et d'inclinaison. Le gardien arrête toujours devant un obstacle inexpliqué. Le serrage n'est pas plus fort qu'avant (même limite, même pas).

Tests

  • Nouveaux :
    • test_rejeu_prise_t1.py : lignes réelles du CSV rejouées ;
    • test_prise_couples_non_fiables.py : effort mesuré → couples fiables, la force décide ; efforts imposés, nuls ou bruit → NON FIABLES, la géométrie décide ; signe inversé ; vide refusé ;
    • test_source_couples_isaac.py : choix de la source, pont, backend, banc ;
    • test_arret_meme_cause.py.
  • Les nouveaux tests échouent sur main (méthodes absentes, ou « serrage insuffisant »).
  • Tests modifiés, même intention, pas plus permissifs :
    • test_calibration_couples.py §2 : le journal de calibration a une ligne de plus (le verdict). Le test compte 14 lignes au lieu de 13, et exige en plus que ce verdict dise « fiables ».
    • test_banc_t1_verite.py §8 : le test vérifiait le texte du banc bridge.bruit_couples(robot.get_applied_joint_efforts()). Il vérifie maintenant bridge.couples(), et l'absence de get_applied_joint_efforts dans le banc. Il vérifie aussi l'opérateur à 40 s pour un seul carton.
  • Suite complète : 134 passed. gitleaks : aucune fuite.

Generated by Claude Code

Essai GPU T1 du 5 novembre 2026 : juge (vérité simulation) à 10 « contacts
manqués » sur 10 mains, alors que l'OS les avait estimés : chaque prise
était passée au serrage après le « recalage au toucher », ce qui exige les
deux contacts confirmés. L'app réinitialise la prise dans le pas même de son
échec (reinitialiser() remet contacts_estimes à zéro) ; le juge, lu après
l'app dans la boucle du banc, ne voyait plus rien.

- JugeContacts.pas(t, fermeture, estimes) garde chaque contact estimé dès
  qu'il paraît ; fin() le préfère à ce qu'elle reçoit. Sans `estimes`,
  comportement inchangé.
- Banc T1 : la boucle passe manip.contacts_estimes à chaque pas.
- test_banc_t1_verite.py §4 : estimations effacées avant la fin de la prise :
  « vrai contact » sur les deux mains (avant : « CONTACT MANQUÉ »).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kd65oQX59GQ8FeKBTHrWbn
…rage

Essai GPU T1 du 5 novembre 2026 : 5 prises, 0 triée, toutes « serrage
insuffisant (-2.9 à -3.4 N à la main au plus serré, 5 au moins) », alors que
le juge mesurait 6 à 9.5 N par main.

Pourquoi la force ne suivait pas : les couples lus n'étaient que le bruit
du banc. Sur les 1108 lignes du CSV, chaque articulation lit une constante
de quelques dixièmes de N·m plus 0.3 N·m d'écart type (les erreurs
d'estimation ajoutées par le banc), corrélation avec la force réelle sous
0.08 ; attendus (pesanteur + Jᵀ·F du juge, posture reconstruite) : -4.2 à
-5.0 N·m au tangage d'épaule, ±1.3 au roulis, -2.2 au coude ; lus : -0.5 à
+0.8. À la calibration, les « biais » valaient l'opposé de la pesanteur du
modèle (+3.75 pour -3.5 au tangage) et le « résidu » sa variation entre
postures (0.81). Le banc lit get_applied_joint_efforts() : les efforts
imposés, nuls pour des articulations commandées en position, pas le couple
des moteurs.

- CalibrationCouples.fiabilite : pente des couples moyens contre la
  pesanteur, posture par posture, aux articulations où elle varie d'au
  moins 1 N·m ; fiables entre 0.5 et 1.5. Au journal, à la fin de la
  calibration ; ManipulationService.couples_fiables (None : pas jugé,
  comportement inchangé).
- Couples non fiables : la force à la main ne décide plus de rien, elle
  reste au diagnostic. Contact : géométrie et retard du roulis (ni couple
  ni force ; signal_contact, partagé avec le rejeu). Filet d'appui avant de
  fermer : la géométrie seule. Serrage : la face commandée va jusqu'à sa
  borne, et chaque main doit y rester retenue par l'objet (retard d'au
  moins 1 cm, ~5 N aux gains raidis du banc T1 ; à moins de 1.5 cm de la
  face touchée ; main immobile à 3 mm près pendant le maintien ;
  main_retenue). Confirmation au levage : le contrôle de levée, et les mains
  toujours retenues. Plafonds de couple : inchangés.
- Inchangés : « rien entre les mains », levée, inclinaison, seuils de la
  géométrie, JointSafetyGuard, GardienProximite, VLAService.
- test_rejeu_prise_t1.py : les lignes réelles (test/donnees, CSV réduit)
  rejouées dans signal_contact et main_retenue : contact en géométrie sur
  les 10 mains avant le serrage ; force estimée et couple du roulis sans
  lien avec la force réelle ; serrage jugé en géométrie : 10 mains retenues
  (1.8 à 2.0 cm, main immobile à 1 mm près), toutes refusées sur la force.
- test_prise_couples_non_fiables.py (horloge simulée) : couples du banc
  Isaac sur le robot simulé : verdict NON FIABLES, prise tenue en géométrie
  (sur main : « serrage insuffisant (-4.0 N) ») ; rien entre les mains :
  refusé ; couples justes : fiables, rien ne change.
- test_calibration_couples.py §2 : le journal compte la ligne du verdict
  (14 lignes au lieu de 13), qui doit dire « fiables ».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kd65oQX59GQ8FeKBTHrWbn
Essai GPU T1 du 5 novembre 2026 : un carton poussé de 5 cm hors de la
table arrête le robot 15 à 19 s, quatre fois (« obstacle inexpliqué à
0.50 m — ARRÊT »). Le gardien a raison d'arrêter, on n'y touche pas.
Mais l'arrêt allait par à-coups et chaque reprise remettait à zéro le
compte de l'alerte des 60 s : l'app attendait en silence.

- TriColis : après ConfigTri.alerte_meme_cause_s (20 s) d'arrêt pour la
  même cause (même point à rayon_ignore_m près, reprises de moins de
  reprise_breve_s comprises), une alerte, une seule, avec la cause.
  L'alerte des 60 s reste. Un robot qui ne dit pas la cause
  (cause_arret facultatif) : rien ne change.
- FacadeServices.cause_arret : raison et point du gardien, de combien le
  point dépasse le bord de quelle table chargée de la carte (au plus la
  profondeur d'un carton), carton suivi le plus proche. Rien que ce que
  l'OS perçoit.
- CHANGELOG : les trois remèdes de cet essai.

Test : test_arret_meme_cause.py (échoue sur main : pas de cause, pas
d'alerte).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kd65oQX59GQ8FeKBTHrWbn
Essai GPU T1 du 5 novembre 2026 : le pont, le backend et le banc lisaient
get_applied_joint_efforts, les efforts passés à set_joint_efforts, nuls
quand les articulations sont commandées en position. La prise ne
recevait que le bruit d'estimation du banc, et les couples vérifiés
contre les limites de l'URDF (garde-fou, campagne S1.2, plafonds de la
prise) valaient zéro : ces vérifications n'ont rien prouvé dans Isaac.

- bruit_couples.source_couples : get_measured_joint_efforts (force de
  l'articulation projetée sur son axe) s'il rend une valeur finie par
  articulation, l'articulation initialisée ; sinon les efforts imposés,
  avec la raison, et l'annonce d'un verdict NON FIABLES.
- IsaacSimBridge.couples() : cette source plus BruitCouples ; read_feedback
  (JointSafetyGuard) et read_all_raw (pompe) la lisent. Source dite au
  setup. Backend Isaac : même source.
- Banc T1 : la prise lit bridge.couples() ; le journal dit la source au
  démarrage. Opérateur simulé : le premier carton dérangé de l'essai
  attend 40 s (les autres 20 s), pour voir l'alerte « même cause ».
- Calibration des couples : pente près de -1, le journal suggère un
  signe inversé (diagnostic seulement).
- Docs : campagne de validation (S1.2 à refaire), démo T1, CHANGELOG.

JointSafetyGuard, GardienProximite, VLAService et les contrôles de prise
ne changent pas. Tests : test_source_couples_isaac.py (nouveau),
test_prise_couples_non_fiables.py §5 à §8 (effort mesuré : fiables, la
force décide ; imposés, nuls ou bruit : NON FIABLES, la géométrie
décide), test_banc_t1_verite.py §8 (même intention, plus strict).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kd65oQX59GQ8FeKBTHrWbn
@OS-AXIS
OS-AXIS merged commit d97d9fd into main Nov 5, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants