Controle web SCS0009
Esta página é a descrição específica do controle web na versão de barramento serial SCS0009. Para a interface geral, formas de iniciar, poses predefinidas e teleoperação por câmera, veja Visão geral do controle web.
Mapeamento de servos
Fonte: DEFAULT_HAND_SERVOS em AmazingHandControl/hand_logic.py e docs/zh-hans/CONFIG_FORMAT.md.
| Dedo | ID mão direita | ID mão esquerda |
|---|---|---|
| Anelar | 5, 6 | 11, 12 |
| Médio | 3, 4 | 13, 14 |
| Indicador | 1, 2 | 15, 16 |
| Polegar | 7, 8 | 17, 18 |
Os dois servos acionam o dedo juntos, em diferencial ⚠️
Os dois servos de cada dedo ficam lado a lado, com eixos colineares; não é "um servo para flexão e outro para abdução", e sim dois servos acionando juntos o mesmo dedo:
- Os dois servos giram no mesmo sentido → o dedo se move lateralmente (abdução/adução)
- Os dois servos giram em sentidos opostos → o dedo estende / flexiona (flexão/extensão)
- Os dois servos têm componentes iguais e opostos ao mesmo tempo → flexão e abdução se somam
abdução (mesmo sentido) flexão (sentidos opostos)
eixo1 ↻ eixo2 ↻ eixo1 ↻ eixo2 ↺A interface mostra dois eixos de controle, não dois servos:
flexão = (servo1 + servo2) / 2
abdução = (servo1 − servo2) / 2Inversamente, o programa converte os eixos de controle nos ângulos-alvo dos dois servos:
servo1 = flexão + abdução
servo2 = flexão − abduçãoAqui
servo1/servo2são ângulos-alvo de software (o ID par já foi negado por causa da montagem invertida), não a direção física do eixo de saída do servo. Para saber se os dois servos giram no mesmo sentido ou em sentidos opostos no mecanismo real, observe o eixo de saída; não compare diretamente esses dois valores.Exemplo: dando apenas abdução
+20, os valores de software sãoservo1 = +20eservo2 = −20; após negar o ID par, os dois servos giram de fato no mesmo sentido.
"O dedo não abre / não fecha" significa que o valor de controle de abdução é zero ou que os dois servos não formam um diferencial — um V estilo tesoura vem da abdução do indicador +17 e da abdução do médio −30 (um positivo, um negativo).
Faixa (derivada das 19 poses oficiais mais a posição do meio):
| Eixo | Faixa | Significado |
|---|---|---|
| Flexão | −50 ~ +90 | aberto (negativo) ↔ fechado (positivo) |
| Abdução | −45 ~ +45 | juntos (negativo) ↔ afastados (positivo) |
Duas regras de ID (errar nelas queima servos ou inverte o movimento):
- IDs ímpares são o primeiro servo de um dedo, IDs pares o segundo. Vale nas duas mãos (na esquerda, 11/12, 13/14… também alternam). O segundo servo é montado ao contrário, então negue-o na conversão.
- A mão esquerda não usa 9–16, e sim 11–18, numerada começando pelo anelar. Ligá-la como 1–8 em sequência está sempre errado.
Direção física e meio: contando da direita para a esquerda, a direita é ímpar e a esquerda é par. Ordem do meio da mão direita (raw 0–1023): 451,571,451,571,451,571,451,571; mão esquerda: 571,451,571,451,571,451,571,451.

Fórmulas de conversão
Idêntico ao apply_pose() do AmazingHandControl (verificado pose por pose):
1) quando mirror_pose é verdadeiro, primeiro troque os dois valores de servo de cada dedo
2) servo_deg = (ID ímpar ? +1 : -1) × (valor da pose − angle_offset_deg)| Mão | angle_offset_deg | mirror_pose |
|---|---|---|
| Direita | 0 | sim ⚠️ |
| Esquerda | -35.16 | sim |
-35.16° é o deslocamento físico de meio entalhe dos horns dos servos da mão esquerda em relação à direita, obtido da configuração oficial.
Sobre o
mirror_pose— esta montagem difere da oficialNo exemplar de referência oficial, só a mão esquerda é
true. Nesta montagem, os pares de servos do módulo da mão direita também são montados invertidos, então a mão direita também étrue.A troca inverte matematicamente apenas a abdução, nunca a flexão:
base = (a+b)/2não muda com a troca, enquantoside = (a−b)/2troca de sinal. Então, se a abdução de uma mão sair espelhada, este é o primeiro interruptor a verificar.
O array de pose é sempre 8 valores na ordem [anelar, médio, indicador, polegar], dois por dedo — idêntico byte a byte ao data/hand_config.yaml oficial, então você pode compará-los diretamente.
Exemplos resolvidos
| Pose | Direita | Esquerda |
|---|---|---|
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 |
meio [-17.578]*8 | ID5 −17.58 / ID6 +17.58 | ID11 +17.58 / ID12 −17.58 |
Note que o
closeda mão esquerda precisa de ±110.16°, bem além do da direita. É por isso que oconfig.jsondefine o limite em ±120° (a faixa completa do SCS0009 é de cerca de ±150°). Um limite de ±90 cortaria o punho fechado da mão esquerda.
Perguntas frequentes do SCS0009
O movimento está invertido → verifique se a fiação segue "ID ímpar primeiro"; na mão esquerda, confirme também angle_offset_deg = -35.16.
O punho da mão esquerda fica pequeno demais / os servos zumbem → o limite provavelmente ainda está em ±90; verifique se o config.json tem ±120.
Um dedo não se move / erro "expected N motors, found M" → rode tools/scan_servos.py; os IDs da mão esquerda são os mais fáceis de ligar errado.
A posição do meio está errada → o valor do meio -17.578125 é convertido do bruto oficial 451/571. Para calibrar com a sua própria montagem, edite middle.positions no config.json.

