🧪 De nouveaux tutoriels arrivent — du bras robotique au capteur
Aller au contenu

Contrôle web SCS0009 ​

Cette page est la description spécifique à la version à bus série SCS0009 du contrôle web. Pour l'interface générale, le démarrage, les poses prédéfinies et la téléopération caméra, voir Vue d'ensemble du contrôle web.

Mapping des servos ​

Source des données : DEFAULT_HAND_SERVOS de AmazingHandControl/hand_logic.py et docs/zh-hans/CONFIG_FORMAT.md.

DoigtID main droiteID main gauche
Annulaire5, 611, 12
Majeur3, 413, 14
Index1, 215, 16
Pouce7, 817, 18

Deux servos entraînent le doigt ensemble en différentiel ⚠️ ​

Les deux servos de chaque doigt sont montés côte à côte sur le même axe ; ce n'est pas « un servo pour la flexion, un pour l'écartement », les deux entraînent ensemble le même doigt :

  • Les deux servos tournent dans le même sens → le doigt s'écarte latéralement (abduction/adduction)
  • Les deux servos tournent en sens inverse → le doigt s'étend / se fléchit (flexion)
  • Les deux servos avec des composantes de même sens et de sens inverse simultanées → flexion et écartement se superposent
text
écartement (même sens)          flexion (sens inverse)
axe 1 ↻   axe 2 ↻               axe 1 ↻   axe 2 ↺

L'interface affiche deux axes de commande, pas deux servos :

flexion = (servo1 + servo2) / 2
écartement = (servo1 − servo2) / 2

À l'inverse, le programme convertit les axes de commande en angles cibles des deux servos :

servo1 = flexion + écartement
servo2 = flexion − écartement

Ici, servo1 / servo2 sont des angles cibles logiciels (l'ID pair est déjà inversé selon le montage à l'envers), et non la direction physique de l'arbre de sortie du servo. Pour juger si deux servos tournent physiquement dans le même sens ou en sens inverse, il faut regarder l'arbre de sortie, et non comparer directement ces valeurs.

Exemple : pour un écartement seul de +20, les valeurs logicielles sont servo1 = +20, servo2 = −20 ; après inversion de l'ID pair, les deux servos tournent en réalité dans le même sens.

« Le doigt ne s'ouvre pas / ne se referme pas » signifie que la commande d'écartement est à 0, ou que les deux servos ne forment pas un différentiel — par exemple le V d'un ciseau repose sur l'écartement de l'index +17 et celui du majeur −30 (un positif, un négatif).

Plages (déduites de la statistique des 19 poses officielles + position médiane) :

AxePlageDescription
Flexion−50 ~ +90ouvert (négatif) ↔ serré (positif)
Écartement−45 ~ +45serré (négatif) ↔ écarté (positif)

Deux conventions d'ID (s'y tromper grille un servo ou inverse le mouvement) :

  1. Les ID impairs sont le premier servo de chaque doigt, les ID pairs le second. Vrai des deux côtés (à gauche 11/12, 13/14… alternent aussi pair/impair). Le second servo est monté à l'envers ; il faut inverser son signe lors de la conversion.
  2. La main gauche n'est pas en 9–16, mais en 11–18, numérotée « annulaire en premier ». La câbler à la suite en 1-8 est toujours faux.

Direction physique et position médiane : de droite à gauche, impair à droite, pair à gauche. Ordre des positions médianes de la main droite (brut 0–1023) 451,571,451,571,451,571,451,571 ; main gauche 571,451,571,451,571,451,571,451.

Both_Hands-IDs


Formules de conversion ​

Identique à apply_pose() d'AmazingHandControl (vérifié pose par pose) :

1) lorsque mirror_pose vaut vrai, échangez d'abord les valeurs des deux servos de chaque doigt
2) servo_deg = (ID impair ? +1 : -1) × (valeur de pose − angle_offset_deg)
Mainangle_offset_degmirror_pose
Droite0oui ⚠️
Gauche-35.16oui

-35.16° est l'écart physique d'un demi-cran du palonnier de servo de la main gauche par rapport à la droite, mesuré sur la configuration officielle.

À propos de mirror_pose — cette machine diffère de l'officielle

La référence officielle n'a que la main gauche à true. Les paires de servos du module de main droite de cette machine sont aussi montées à l'envers, donc la main droite est également à true.

Mathématiquement, cet échange n'inverse que l'écartement, jamais la flexion : base = (a+b)/2 reste inchangé après échange, side = (a−b)/2 change de signe. Donc quand « l'écartement d'une main est globalement inversé », c'est le premier commutateur à vérifier.

Le tableau de pose comporte toujours 8 valeurs, dans l'ordre [annulaire, majeur, index, pouce], 2 valeurs par doigt — identique octet pour octet au data/hand_config.yaml officiel, pour faciliter la comparaison.

Résultats de conversion mesurés ​

PoseDroiteGauche
open [-35]*8ID5 −35 / ID6 +35ID11 +0.16 / ID12 −0.16
close [75]*8ID5 +75 / ID6 −75ID11 +110.16 / ID12 −110.16
milieu [-17.578]*8ID5 −17.58 / ID6 +17.58ID11 +17.58 / ID12 −17.58

Attention : le close de la main gauche demande ±110.16°, nettement plus que la droite. C'est pourquoi la limite de config.json est fixée à ±120° (pleine échelle SCS0009 environ ±150°). Une limite à ±90 rognerait le poing de la main gauche.


Questions fréquentes SCS0009 ​

Sens du mouvement inversé → vérifiez que le câblage respecte « ID impair en premier » ; pour la main gauche, confirmez aussi angle_offset_deg = -35.16.

Poing gauche insuffisant / servos qui sifflent → la limite est peut-être encore à ±90 ; vérifiez que config.json est bien à ±120.

Doigt immobile / message « N moteurs attendus, M détectés » → lancez tools/scan_servos.py ; les ID de la main gauche sont les plus faciles à mal câbler.

Position médiane incorrecte → la valeur médiane -17.578125 est convertie depuis le brut officiel 451/571 ; pour calibrer selon votre propre assemblage, modifiez middle.positions dans config.json.

Pages associées ​