Tutorial do braço robótico SO-ARM101 de 7 eixos
SO-ARM101 7-DOF · Preparação antes da utilização
Este documento destina-se a quem converteu o SO-ARM101 de 6 servos para 7 servos e quer percorrer o fluxo completo no LeRobot (calibração → gravação → treino → implantação). Código correspondente: este repositório (
lerobot-7dof), um fork do lerobot oficial que apenas altera as configurações dos motores do SO.
0. Confirme primeiro o seu braço robótico
7 servos (todos STS3215), correspondência entre o ID do servo e a articulação:
| ID do servo | Nome da articulação | Descrição |
|---|---|---|
| 1 | shoulder_pan | Rotação horizontal do ombro |
| 2 | shoulder_lift | Elevação do ombro |
| 3 | elbow_flex | Flexão do cotovelo |
| 4 | wrist_flex | Inclinação do pulso (flexão para cima/baixo) |
| 5 | wrist_yaw | Desvio do pulso (rotação esquerda/direita de cerca de 90°) · o servo novo desta modificação (inserido entre os antigos n.º 4 e n.º 5) |
| 6 | wrist_roll | Rotação do pulso · o antigo motor de rotação n.º 5, ID 5→6, peça impressa não alterada, nome inalterado |
| 7 | gripper | Garra · era ID=6 e passou a 7 depois da alteração |
Ordem dos dados das articulações (ordem das dimensões das articulações em action / observation.state nos Parquet gravados): shoulder_pan → shoulder_lift → elbow_flex → wrist_flex → wrist_yaw → wrist_roll → gripper.
⚠️ Atenção: os dados, os ficheiros de calibração e os modelos já treinados da versão de 6 servos são incompatíveis com este repositório; é obrigatório refazer tudo de acordo com as instruções abaixo.
1. Se clonou o repositório de código oficial, que ficheiros é necessário substituir/alterar
Opção A: usar diretamente o código deste repositório (recomendado)
Opção B: substituir manualmente após o git clone do lerobot oficial
Copie deste repositório por cima dos 3 ficheiros do clone oficial:
| Ficheiro deste repositório (origem) | Substituir em (destino) |
|---|---|
src/lerobot/robots/so_follower/so_follower.py | Ficheiro com o mesmo nome no clone oficial |
src/lerobot/teleoperators/so_leader/so_leader.py | Ficheiro com o mesmo nome no clone oficial |
src/lerobot/robots/so_follower/robot_kinematic_processor.py | Ficheiro com o mesmo nome no clone oficial (apenas correção de comentários, não afeta a funcionalidade, pode não substituir) |
cp src/lerobot/robots/so_follower/so_follower.py <clone_oficial>/src/lerobot/robots/so_follower/so_follower.py
cp src/lerobot/teleoperators/so_leader/so_leader.py <clone_oficial>/src/lerobot/teleoperators/so_leader/so_leader.pyRequisito: o seu clone oficial tem de ter uma estrutura idêntica à linha de base deste repositório (versão do lerobot de 2026-08). Se a diferença de versões for grande, não substitua o ficheiro inteiro; faça apenas as duas alterações manuais indicadas abaixo.
Alterações manuais quando as versões não coincidem (apenas dois pontos)
① Dicionário de motores (um em so_follower.py e outro em so_leader.py, com o mesmo conteúdo) — altere o original
"wrist_flex": Motor(4, "sts3215", norm_mode_body),
"wrist_roll": Motor(5, "sts3215", norm_mode_body),
"gripper": Motor(6, "sts3215", MotorNormMode.RANGE_0_100),para
"wrist_flex": Motor(4, "sts3215", norm_mode_body),
"wrist_yaw": Motor(5, "sts3215", norm_mode_body), # servo novo, rotação esquerda/direita
"wrist_roll": Motor(6, "sts3215", norm_mode_body), # antigo motor de rotação n.º 5, ID 5→6
"gripper": Motor(7, "sts3215", MotorNormMode.RANGE_0_100),② Lógica de calibração (o calibrate() de cada um dos dois ficheiros) — remova o caso especial da «articulação de volta completa»: substitua
full_turn_motor = "wrist_roll"
unknown_range_motors = [motor for motor in self.bus.motors if motor != full_turn_motor]
range_mins, range_maxes = self.bus.record_ranges_of_motion(unknown_range_motors)
range_mins[full_turn_motor] = 0
range_maxes[full_turn_motor] = 4095por uma única linha, passando a registar o intervalo real de todas as articulações:
range_mins, range_maxes = self.bus.record_ranges_of_motion()Porquê: a versão original tratava o
wrist_roll(rotação em torno do eixo do antebraço) como uma articulação capaz de dar uma volta completa (0~4095), com o intervalo completo fixado no código. Após a modificação 7-DOF, as articulações do pulso n.º 5/6 (yaw / roll) têm ambas limites mecânicos e não dão a volta completa; fixar a volta completa faz com que o código envie comandos de articulação para ângulos que a mecânica não alcança, com risco de danos. Agora, na calibração, regista-se manualmente o min/max real de cada motor.
Nota sobre o braço duplo
bi_so_follower / bi_so_leader (src/lerobot/robots/bi_so_follower/, src/lerobot/teleoperators/bi_so_leader/) apenas embrulham o braço único numa camada com os prefixos left_/right_,sem definições de motores. Desde que os ficheiros do braço único acima estejam alterados, os comandos de braço duplo (--robot.type=bi_so_follower) passam automaticamente a 7-DOF.
1. Ambiente LeRobot
2. Etapa 2: Substituir ficheiros (adaptação a 7DOF)
3. Portas série
4. Calibração
5. Teleoperação
6. Teleop. c/ câmara
7. Recolha de dados
- Rever e reproduzir o conjunto de dados
- Notas sobre a recolha de conjuntos de dados
- Registar uma conta Hugging Face (opcional)
- Carregar dados para o HuggingFace (opcional)
- Recolha de conjuntos de dados por ensino-Aperto de mão 200
- Recolha de conjuntos de dados por ensino
8. Treino de modelos
- Ambiente de treino em GPU na nuvem
- Comando de treino-ACT (recomendado para começar)
- Comando de treino-Diffusion
- Comando de treino-pi0.5
- Comando de treino-pi0 (melhor desempenho)
- Comando de treino-pi0fast
- Comando de treino-smolvla (recomendado para avançados)
- Enviar o modelo para o HuggingFace (opcional)
- Algoritmos de aprendizagem por imitação suportados pelo LeRobot
- Treino local em Ubuntu
- Obter o ficheiro de pesos do modelo
- Sugestões de parâmetros de treino
- Visualizar as curvas de treino em tempo real com o wandb

