Control web SCS0009
Esta página es la explicación específica del control web para la versión con bus serie SCS0009. Para la interfaz común, el modo de inicio, las poses predefinidas y la teleoperación por cámara, consulta Descripción general del control web.
Mapeo de servos
Fuente de datos: DEFAULT_HAND_SERVOS en AmazingHandControl/hand_logic.py y docs/zh-hans/CONFIG_FORMAT.md.
| Dedo | ID mano derecha | ID mano izquierda |
|---|---|---|
| Anular | 5, 6 | 11, 12 |
| Medio | 3, 4 | 13, 14 |
| Índice | 1, 2 | 15, 16 |
| Pulgar | 7, 8 | 17, 18 |
Los dos servos accionan conjuntamente un dedo mediante diferencial ⚠️
Los dos servos de cada dedo van montados uno al lado del otro con ejes colineales; no es «un servo para la flexión y otro para el splay», sino dos servos que accionan conjuntamente el mismo dedo:
- Los dos servos giran en el mismo sentido → el dedo se desplaza lateralmente (abducción)
- Los dos servos giran en sentidos opuestos → el dedo se extiende / flexiona (flexión)
- Los dos servos pueden tener a la vez componentes en el mismo sentido y en sentidos opuestos → flexión y splay se superponen
侧摆(同向) 屈伸(反向)
轴1 ↻ 轴2 ↻ 轴1 ↻ 轴2 ↺La interfaz muestra dos ejes de control, no dos servos:
屈伸 = (servo1 + servo2) / 2
侧摆 = (servo1 − servo2) / 2A la inversa, el programa convierte los ejes de control en los ángulos objetivo de los dos servos:
servo1 = 屈伸 + 侧摆
servo2 = 屈伸 − 侧摆Aquí
servo1/servo2son ángulos objetivo de software (el ID par ya está negado por el montaje invertido), no la dirección física del eje de salida del servo. Para determinar si los dos servos giran en el mismo sentido o en sentidos opuestos en el mecanismo real, hay que mirar el eje de salida; no se pueden comparar directamente estos dos valores.Ejemplo: si solo se aplica un splay de
+20, los valores de software sonservo1 = +20yservo2 = −20; tras negar el ID par, los dos servos giran realmente en el mismo sentido.
«El dedo no se abre / no se cierra» significa que el valor de control de splay es 0, o que los dos servos no forman un diferencial — por ejemplo, la V de la tijera se consigue con un splay del índice de +17 y uno del medio de −30 (uno positivo y uno negativo).
Rango (derivado de las 19 poses oficiales más la posición central):
| Eje | Rango | Descripción |
|---|---|---|
| Flexión | −50 ~ +90 | abierto (negativo) ↔ cerrado (positivo) |
| Splay | −45 ~ +45 | juntos (negativo) ↔ separados (positivo) |
Dos convenciones de ID (equivocarse quema servos o invierte el movimiento):
- Los ID impares son el primer servo de cada dedo y los pares el segundo. Se cumple en ambas manos (la izquierda 11/12, 13/14… también alternan). El segundo servo va montado al revés, así que hay que negarlo al convertir.
- El ID de la mano izquierda no es 9–16, sino 11–18, y se numera «primero el anular». Cablearla como 1-8 en secuencia siempre está mal.
Dirección física y posición central: contando de derecha a izquierda, los impares a la derecha y los pares a la izquierda. Orden de la posición central de la mano derecha (raw 0–1023): 451,571,451,571,451,571,451,571; mano izquierda: 571,451,571,451,571,451,571,451.

Fórmula de conversión
Idéntica a apply_pose() de AmazingHandControl (verificada pose a pose):
1) cuando mirror_pose es verdadero, primero se intercambian los valores de los dos servos de cada dedo
2) servo_deg = (ID impar ? +1 : -1) × (valor de pose − angle_offset_deg)| Mano | angle_offset_deg | mirror_pose |
|---|---|---|
| Derecha | 0 | Sí ⚠️ |
| Izquierda | -35.16 | Sí |
-35.16° es la diferencia física de medio diente entre las bocinas del servo de la mano izquierda y las de la derecha, obtenida de la configuración oficial.
Sobre
mirror_pose— esta unidad difiere de la oficialEn la referencia oficial solo la mano izquierda es
true. Los pares de servos del módulo de la mano derecha de esta unidad también van montados al revés, así que la mano derecha también se configura comotrue.Matemáticamente, este intercambio solo invierte el splay, no la flexión:
base = (a+b)/2no cambia al intercambiar, mientras queside = (a−b)/2cambia de signo. Por eso, cuando «el splay de una mano sale invertido», lo primero que hay que revisar es este interruptor.
El array de pose siempre tiene 8 valores, en el orden [anular, medio, índice, pulgar], dos por dedo — idéntico byte a byte al data/hand_config.yaml oficial, lo que facilita la comparación.
Resultados de conversión medidos
| Pose | Derecha | Izquierda |
|---|---|---|
open [-35]*8 | ID5 −35 / ID6 +35 | ID11 +0.16 / ID12 −0.16 |
close [75]*8 | ID5 +75 / ID6 −75 | ID11 +110.16 / ID12 −110.16 |
central [-17.578]*8 | ID5 −17.58 / ID6 +17.58 | ID11 +17.58 / ID12 −17.58 |
Fíjate en que el
closede la mano izquierda necesita ±110.16°, bastante más que el de la derecha. Por eso el límite deconfig.jsonse fija en ±120° (el rango completo del SCS0009 es de unos ±150°). Un límite de ±90 recortaría el puño de la mano izquierda.
Preguntas frecuentes sobre SCS0009
La dirección del movimiento está invertida → comprueba si el cableado sigue el orden «primero el ID impar»; en la mano izquierda confirma también angle_offset_deg = -35.16.
El puño de la mano izquierda no cierra lo suficiente / los servos zumban → probablemente el límite siga en ±90; comprueba que config.json esté en ±120.
Un dedo no se mueve / aparece «se esperaban N motores y se detectaron M» → ejecuta tools/scan_servos.py; los ID de la mano izquierda son los más fáciles de cablear mal.
La posición central está desviada → el valor central -17.578125 se obtiene de los raw oficiales 451/571; para calibrar según tu propio montaje, edita middle.positions de config.json.

