Introdução ao Controle de Posição MIT no reBot Arm B601-RS
6+1 DOF · RobStride · CAN @ 1 Mbps · Controle de Posição MIT · Proteção de Temperatura · Retorno Seguro para Zero · API Python de Código Aberto

MotorBridge é um SDK CAN em Python para motores RobStride / Damiao. O rebot_control o encapsula com uma API de controle de posição MIT para o reBot Arm B601-RS: configuração em YAML, limites de velocidade por junta, proteção de temperatura MOS em três níveis e retorno suave para zero via Esc / Ctrl+C / stop().
Este tutorial guia você por: configuração do ambiente → configuração do CAN → execução de exemplos → uso do pacote como biblioteca.
- Este projeto fornece apenas APIs de controle — sem limites de junta por software ou limites de espaço de trabalho. Os ângulos de destino que você definir são enviados diretamente para os motores.
- Mantenha o braço dentro de aproximadamente 70% do seu espaço de trabalho. Permanecer além do espaço de trabalho por longos períodos pode acionar a proteção contra travamento na junta 2 e o braço pode cair.
- No primeiro uso, teste com ângulos pequenos e baixas velocidades, e mantenha o espaço de trabalho livre de pessoas e obstáculos.
Recursos
-
Controle de posição MIT
Comandos de posição MIT padrão a 200 Hz; limites de velocidade por junta com suavização no laço de controle. -
6+1 motores
J1–J6 são juntas do braço; J7 (ID CAN 7) é o gripper de extremidade, controlado viaset_joint_angles/set_joint_angle. -
Proteção de temperatura em três níveis
Monitoramento em tempo real da temperatura do MOS: alarme e continua → superaquecimento com retorno lento para zero e depois desabilita → desabilitação de emergência (sem retorno para zero). -
Saída segura e retorno para zero
Esc / Ctrl+C /arm.stop()acionam retorno suave para zero com smoothstep; um segundo Ctrl+C durante o retorno para zero aborta imediatamente e desabilita os motores. -
Configuração baseada em YAML
Canal CAN, limites de temperatura, parâmetros de retorno para zero ekp/kddos motores ficam emconfig/rebotarm_rs.yaml— ajuste sem alterar código. -
Pronto para uso como biblioteca
Camadas bem definidas (config / API / exemplos); importe comfrom rebot import ReBotRSMITController.
Especificações
O hardware para este tutorial é fornecido pela Seeed Studio.
| Parâmetro | Especificação |
|---|---|
| Modelo do braço | Kit Montado reBot Arm B601-RS com Gripper |
| DOF | 6+1 (incluindo gripper) |
| Raio de trabalho | 754,7 mm (com gripper) / 587,5 mm (sem gripper) |
| Carga útil | Nominal 2,5 kg / Máx. 5 kg |
| Faixa das juntas | J1: ±150° / J2: 220° ~ 0° / J3: 220° ~ 0° / J4: ±90° / J5: ±90° / J6: ±180° / Gripper: 345° ~ 0° |
| Repetibilidade | 0,1 mm |
| Peso | 6,7 kg |
| Servomotores | RobStride 06 × 3 / RobStride 00 × 4 (incluindo gripper) |
| Comunicação | Barramento CAN @ 1 Mbps |
| Tensão de alimentação | CC 48V |
| Fonte de alimentação | CC 48V 15A |
| Temperatura de operação | -20°C ~ 50°C |
| Controle | PC |
Mapeamento dos motores neste projeto
| Junta | ID CAN | Modelo | Observações |
|---|---|---|---|
| J1 | 1 | RS06 | Base |
| J2 | 2 | RS06 | |
| J3 | 3 | RS06 | |
| J4 | 4 | RS00 | |
| J5 | 5 | RS00 | |
| J6 | 6 | RS00 | Punho |
| J7 | 7 | RS00 | Gripper de extremidade |
Capacidades de software (este repositório)
| Capacidade | Status |
|---|---|
| Controle de posição MIT | ✅ |
| Limites de velocidade por junta | ✅ |
| Controle do gripper (ID CAN 7) | ✅ |
| Monitoramento de temperatura MOS e proteção em três níveis | ✅ |
| Retorno seguro para zero / desabilitação de emergência | ✅ |
| Configuração em YAML | ✅ |
| API de biblioteca Python | ✅ |
| Cinemática direta / inversa (Pinocchio) | ❌ (veja reBotArm_control_py) |
| Simulação MeshCat | ❌ (veja o repositório acima) |
Parâmetros dos motores das juntas
| Parâmetro | RobStride 00 | RobStride 06 |
|---|---|---|
| Tensão nominal | 48V | 48V |
| Corrente nominal | 4,7 Apk ± 10% | 14,3 Apk ± 10% |
| Corrente de pico | 15,5 Apk ± 10% | 57 Apk ± 10% |
| Torque nominal | 5 N.m | 11 N.m |
| Torque de pico | 14 N.m | 36 N.m |
| Velocidade nominal | 100 rpm ± 10% | 100 rpm ± 10% |
| Velocidade máxima em vazio | 315 rpm ± 10% | 480 rpm ± 10% |
| Relação de redução | 10 : 1 | 9 : 1 |
| Interface de controle | CAN @ 1 Mbps | CAN @ 1 Mbps |
| Modos de controle | MIT / Velocidade / Posição / Torque | MIT / Velocidade / Posição / Torque |
Lista de Materiais (BOM)
| Item | Qtde | Incluído |
|---|---|---|
| reBot Arm B601-RS | 1 | ✅ |
| Adaptador CAN (CANABLE / PCAN-USB, etc.) | 1 | ✅ |
| Fonte de alimentação (CC 48V 15A) | 1 | ✅ |
| Cabo USB-C | 1 | ✅ |
| Gripper | 1 | ✅ |
Requisitos
| Item | Requisito |
|---|---|
| Python | 3.10+ |
| SO | Ubuntu 22.04+ (recomendado) |
| Interface CAN | can0 padrão |
| Alimentação | CC 48V 15A |
| Dependências | motorbridge, pyyaml; opcional pynput (tecla Esc) |
Instalação
Etapa 1. Clonar o repositório
git clone https://github.com/LAN-GER/rebot_control.git
cd rebot_control
Etapa 2. Instalar dependências
pip install motorbridge pynput pyyaml
pynput habilita a escuta da tecla Esc. Sem ele, apenas a Esc é desativada; Ctrl+C e arm.stop() ainda funcionam.
Etapa 3. Configurar a interface CAN
# List interfaces (PCAN-USB, etc.)
sudo modprobe peak_usb # if using a PEAK adapter
ip -br link
# Set can0 to 1 Mbps (RobStride default)
sudo ip link set can0 down 2>/dev/null
sudo ip link set can0 up type can bitrate 1000000
Após desconectar e reconectar um adaptador CAN USB, geralmente é necessário executar novamente os comandos ip link.
Etapa 4. (Opcional) Editar o arquivo de configuração
Edite config/rebotarm_rs.yaml:
| Chave | Descrição | Padrão |
|---|---|---|
can.channel | Nome da interface CAN | can0 |
can.host_id | ID do host | 0xFD |
control.control_hz | Taxa de comandos MIT (não é a velocidade de movimento) | 200 Hz |
control.telemetry_hz | Taxa de leitura de temperatura | 2 Hz |
temperatures.alarm_c | Limite de alarme de temperatura | 80°C |
temperatures.return_zero_c | Limite de retorno para zero por superaquecimento | 125°C |
temperatures.disconnect_c | Limite de desabilitação de emergência | 140°C |
return_zero.max_speed_deg_s | Velocidade de pico normal de retorno para zero | 30°/s |
return_zero.thermal_max_speed_deg_s | Velocidade de pico térmica de retorno para zero | 30°/s |
return_zero.min_time_s | Duração mínima do retorno para zero | 3,0 s |
return_zero.settle_time_s | Tempo de permanência em zero após o retorno | 0,30 s |
motors | ID / modelo do motor / kp / kd MIT | Veja o YAML |
Chaves ausentes usam padrões do código; chaves desconhecidas geram erro para capturar erros de digitação.
Estrutura do código
rebot_control/
├── config/
│ └── rebotarm_rs.yaml # CAN / motors / temperature / return-to-zero
├── rebot/
│ ├── __init__.py # Public API
│ ├── config.py # Config loading and validation
│ └── controller.py # ReBotRSMITController
└── examples/
├── _bootstrap.py # Path setup + wait-for-target helpers
├── quick_start.py # Tutorial 1: quick start
├── custom_config.py # Tutorial 2: custom config
├── monitor_status.py # Tutorial 3: monitor status
├── single_joint_adjust.py # Tutorial 4: single joint + gripper
├── read_joint_angles.py # Tutorial 5: read actual positions
├── stop_options.py # Tutorial 6: stop options
├── recommended_structure.py # Tutorial 7: recommended structure
└── mit_position_control.py # Full editable demo
Camadas:
- Arquivo de configuração: fonte única de parâmetros ajustáveis.
- Camada de configuração:
load_config()→ControllerConfig. - Camada de API: lógica de controle sem valores de demonstração fixos no código.
- Camada de exemplos: ângulos de destino, velocidades e fluxo de execução.
Como funciona
Controle MIT e suavização de velocidade
control_hz(padrão 200 Hz) define apenas a taxa de envio de comandos.- A velocidade real de movimento vem de
set_max_speeds([...])(graus/s). set_joint_angles()atualiza apenas os alvos; o laço de controle eleva as posições de comando até os alvos dentro do limite de velocidade.
Se você chamar stop() imediatamente após definir os alvos, pode ver quase nenhum movimento. Os exemplos usam wait_for_command_targets() (veja examples/_bootstrap.py) para esperar até que os ângulos de comando se aproximem dos alvos antes de retornar para zero.
Sequência de conexão e habilitação
Dentro de connect(), a ordem é: registrar motores → mudar para modo MIT → habilitar → ler posições mecânicas atuais (para inicializar os alvos e evitar um salto repentino após habilitar). O mechPos (0x7019) da RobStride é confiavelmente legível após a habilitação.
Para leitura passiva de posição (Tutorial 5), chame disable_motors() após connect() para que você possa mover o braço manualmente e continuar lendo os ângulos.
Proteção de temperatura em três níveis
| Limite (padrão) | Comportamento |
|---|---|
| ≥ 80°C | Alarme de temperatura (uma vez por motor por borda de sobretemperatura), continua em operação |
| ≥ 125°C | Para o movimento, retorno lento para zero na velocidade térmica de pico e depois desabilita |
| ≥ 140°C | Desabilitação imediata de emergência, sem retorno para zero |
Retorno seguro para zero
O retorno para zero usa uma trajetória smoothstep. Duração:
duration = max(min_time_s, per-joint time estimated from peak speed)
A velocidade de pico é max_speed_deg_s (normal) ou thermal_max_speed_deg_s (térmico). Ambas têm padrão de 30°/s; min_time_s tem padrão de 3,0 s.
| Método de saída | Comportamento |
|---|---|
Esc / primeiro Ctrl+C / arm.stop() | Retorno lento para zero → desabilitar → fechar CAN |
| Segundo Ctrl+C durante o retorno para zero | Aborta o retorno para zero e desabilita imediatamente |
| Erro de comunicação | Desabilitação de emergência, sem retorno para zero |
Unidades
| Contexto | Unidades |
|---|---|
| API externa (ângulos, velocidades) | graus, deg/s |
| Internos do MotorBridge MIT | radianos, rad/s |
Tutoriais
Execute todos os exemplos a partir da raiz do projeto. Cada script documenta o Movimento esperado no topo e imprime uma linha [Expected / 预期] na inicialização.
| Tutorial | Arquivo | Comando |
|---|---|---|
| 1. Início rápido | examples/quick_start.py | python3 examples/quick_start.py |
| 2. Configuração personalizada | examples/custom_config.py | python3 examples/custom_config.py |
| 3. Monitorar status | examples/monitor_status.py | python3 examples/monitor_status.py |
| 4. Única junta + garra | examples/single_joint_adjust.py | python3 examples/single_joint_adjust.py |
| 5. Ler posições | examples/read_joint_angles.py | python3 examples/read_joint_angles.py |
| 6. Opções de parada | examples/stop_options.py | python3 examples/stop_options.py default |
| 7. Estrutura do programa | examples/recommended_structure.py | python3 examples/recommended_structure.py |
| Demonstração completa | examples/mit_position_control.py | python3 examples/mit_position_control.py |
1. Início rápido (quick_start.py)
Movimento esperado: J1 se move para +20° a ~15°/s; outras juntas e a garra permanecem em 0°; depois retorno lento para zero e desabilitar.
python3 examples/quick_start.py
Fluxo: start() → set_max_speeds() → set_joint_angles() → aguardar o movimento → stop().
2. Arquivo de configuração personalizada (custom_config.py)
python3 examples/custom_config.py
python3 examples/custom_config.py config/rebotarm_rs.yaml
Movimento esperado: J1 → +15° (~15°/s), outras em 0°, depois retorno para zero.
3. Monitorar enquanto executa (monitor_status.py)
python3 examples/monitor_status.py
Movimento esperado: J1 → +30°; o terminal imprime continuamente alvo / enviado / temperatura do MOS. Pressione Esc ou Ctrl+C para sair e retornar para zero.
Observações:
- Alvo vs enviado: os ângulos enviados ficam atrás dos alvos (suavização limitada por velocidade).
- Temperatura: leia
arm.last_temperatures; não há necessidade de consultar o CAN por conta própria.
4. Ajuste de junta única e garra (single_joint_adjust.py)
python3 examples/single_joint_adjust.py
Alvos padrão:
| J1 | J2 | J3 | J4 | J5 | J6 | J7 Garra |
|---|---|---|---|---|---|---|
| +25° | +15° | +15° | -15° | 0° | 0° | 180° |
joint_id: 1–6 são juntas do braço; 7 é a garra (ID CAN 7).
5. Ler posições reais (read_joint_angles.py)
python3 examples/read_joint_angles.py
Movimento esperado:
connect(): alterna para o modo MIT e habilita (estabelece comunicação), lê os ângulos atuais como sementes de alvo.disable_motors(): desabilita imediatamente para que você possa mover o braço manualmente.- O terminal imprime os ângulos reais das juntas a ~30 Hz; os valores devem mudar quando você move o braço.
- Pressione Ctrl+C para sair;
stop(return_to_zero=False)fecha o CAN sem retorno para zero.
Este exemplo não chama start(), portanto nenhuma thread de controle MIT é executada e nenhum alvo de movimento é enviado.
Fluxo de código:
arm.connect() # MIT → enable → read current angles
arm.disable_motors() # disable — arm can be moved by hand
while True:
actual = arm.read_joint_angles() # ~30 Hz
print(actual)
# After Ctrl+C
arm.stop(return_to_zero=False, wait=True)
read_joint_angles() acessa o CAN de forma síncrona (lê mechPos de todos os 7 motores em sequência), portanto a taxa alcançável depende do tempo de ida e volta no barramento. O exemplo mira 30 Hz; se cada leitura levar mais tempo, a taxa real será menor. Enquanto o controle MIT estiver em execução, use get_command_angles() para monitorar o movimento comandado em vez de chamar read_joint_angles() em alta frequência.
6. Opções de parada segura (stop_options.py)
Cada modo primeiro move J1 para ~+20°, depois para de acordo com o modo:
python3 examples/stop_options.py default # slow return-to-zero (recommended)
python3 examples/stop_options.py no_return # disable without return-to-zero
python3 examples/stop_options.py async # stop(wait=False) + wait_until_stopped()
python3 examples/stop_options.py emergency # emergency disable, no return-to-zero
no_return / emergency deixam o braço em uma pose diferente de zero e desabilitam os motores. Certifique-se de que a área esteja segura; apoie o braço com a mão se necessário.
7. Estrutura de programa recomendada (recommended_structure.py)
Demonstra try / except / finally para que stop() seja executado mesmo em caso de erros.
python3 examples/recommended_structure.py
Demonstração completa de parâmetros (mit_position_control.py)
Edite TARGET_ANGLES (comprimento 7) e JOINT_SPEEDS_DEG_S no topo do arquivo e então execute:
python3 examples/mit_position_control.py
Padrão: J1 → +50° (20°/s), outras juntas e garra em 0°; o terminal mostra alvo / enviado / temperatura; Esc / Ctrl+C sai com retorno para zero.
O braço pode se mover rapidamente no modo MIT. Mantenha pessoas e equipamentos afastados e permaneça dentro de aproximadamente 70% da área de trabalho.
Uso como biblioteca
Exemplo mínimo
from rebot import ReBotRSMITController
arm = ReBotRSMITController() # loads config/rebotarm_rs.yaml
arm.start(enable_esc=True)
arm.set_max_speeds([15.0] * 7)
arm.set_joint_angles([20.0, 0, 0, 0, 0, 0, 0]) # J1–J6 + gripper J7
# Wait for motion to finish before stop; see examples/quick_start.py
arm.stop() # slow return-to-zero → disable → close CAN
Configuração personalizada e garra
from rebot import (
ReBotRSMITController,
load_config,
GRIPPER_JOINT_ID,
)
arm = ReBotRSMITController(load_config("config/rebotarm_rs.yaml"))
arm.start()
arm.set_max_speeds([20.0] * 7)
arm.set_joint_angles([25, 15, 15, -15, 0, 0, 0])
arm.set_joint_angle(GRIPPER_JOINT_ID, 180.0) # gripper = J7
Leitura passiva de posição
from rebot import ReBotRSMITController
arm = ReBotRSMITController()
arm.connect() # MIT → enable → read current angles
arm.disable_motors() # disable — move arm by hand
actual = arm.read_joint_angles()
print(actual)
arm.stop(return_to_zero=False, wait=True) # close CAN, no return-to-zero
Ciclo de vida do controlador
Controle de movimento MIT:
create → start() → set_max_speeds() → set_joint_angles() / set_joint_angle() → … → stop()
Leitura passiva de posição (sem movimento comandado):
create → connect() → disable_motors() → read_joint_angles() → … → stop(return_to_zero=False)
API principal
| Método / atributo | Descrição |
|---|---|
connect() | Conecta o CAN, modo MIT, habilita, lê os ângulos atuais; chamado automaticamente por start() |
disable_motors() | Desabilita todos os motores sem fechar o CAN (para leitura passiva) |
start(enable_esc=True, install_signal_handlers=True) | Inicia as threads de controle e de temperatura |
set_joint_angles(angles_deg) | Define 7 ângulos alvo (graus) |
set_joint_angle(joint_id, angle_deg) | Define uma junta / garra (1–7) |
set_max_speeds(speeds_deg_s) | Define 7 velocidades máximas (deg/s) |
get_target_angles() / get_command_angles() | Ângulos alvo / de comando suavizados |
read_joint_angles() | Leitura síncrona das posições mecânicas reais (graus); usa CAN |
last_temperatures | Temperatura do MOS por motor |
is_stopped | Indica se o desligamento seguro foi concluído |
stop(return_to_zero=True, wait=True) | Para (retorno para zero por padrão) |
request_stop(..., emergency=True) | Parada avançada / desabilitação de emergência |
Constantes exportadas: GRIPPER_MOTOR_ID = 7, GRIPPER_JOINT_ID = 7.
Perguntas frequentes (FAQ)
-
Permission denied/ não é possível abrir can0
Certifique-se de que a interface CAN estejaupe que seu usuário possa acessar dispositivos de rede. Usesudoparaip linkse necessário ou verifique as regras do udev. -
Nenhuma resposta do motor / falha ao habilitar
- Confirme que o bitrate é 1 Mbps;
- Confirme se
channel,host_ide os IDs dos motores emconfig/rebotarm_rs.yamlcorrespondem ao hardware; - Execute novamente
ip linkapós reconectar o USB CAN.
-
Ângulos definidos, mas o braço mal se move
set_joint_angles()apenas atualiza os alvos. Definaset_max_speeds()razoáveis e aguarde até que os ângulos de comando se aproximem dos alvos antes destop(). Vejaexamples/quick_start.py. -
A garra não se move
A garra é J7 / CAN ID 7. Passe 7 valores paraset_joint_angles(o último é a garra) ou useset_joint_angle(7, angle). -
Tempo limite ao ler posição / não é possível ler ângulos
mechPospode ser lido de forma confiável no modo MIT após habilitar. O Tutorial 5 usaconnect()e depoisdisable_motors()para que você possa mover o braço manualmente e continuar lendo. Seensure_modeou leituras de parâmetros atingirem tempo limite, verifique a fiação CAN, a terminação e a alimentação dos motores. -
Spam de alarme de temperatura
Os alarmes são disparados por borda com histerese: um alarme por motor por evento de sobretemperatura; um novo alarme só ocorre depois que a temperatura cai abaixo dealarm_c - 2°C. -
Proteção contra travamento da junta 2 / braço cai
Frequentemente causado por permanecer além de ~70% da extensão da área de trabalho. Desligue e ligue novamente para limpar a proteção e reduza os ângulos de destino e o tempo de permanência. -
Comportamento após erros de comunicação
Em caso de falha de comunicação no loop de controle, o programa desabilita de emergência sem retorno ao zero para evitar movimento sob comunicação ruim. -
Pinocchio / MeshCat / compensação de gravidade
Este repositório é focado no controle de posição MIT. Para cinemática, simulação e compensação de gravidade, consulte o reBotArm_control_py e o guia de Pinocchio & MeshCat no Wiki da Seeed.
Contato
- Repositório: https://github.com/LAN-GER/rebot_control
- Issues: GitHub Issues
- Fórum: Seeed Studio Forum
Referências
- MotorBridge SDK
- reBotArm_control_py (cinemática / simulação / compensação de gravidade)
- Documentação do motor RobStride
- README em chinês neste repositório:
README_zh.md - README em inglês neste repositório:
README.md