LeRobot documentation
Damiao Motors e CAN Bus
Damiao Motors e CAN Bus
Este guia aborda a configuração e o uso dos motores Damiao com o LeRobot via comunicação por barramento CAN.
Atualmente, apenas o Linux é suportado, pois o adaptador CAN do OpenArms possui drivers apenas para Linux.
Configuração do CAN no Linux
Antes de usar os motores Damiao, você precisa configurar a interface CAN no seu sistema Linux.
Instalar CAN Utilities
sudo apt-get install can-utilsConfigure a interface CAN (manual)
Para CAN FD padrão (recomendado para OpenArms):
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on
sudo ip link set can0 upPara CAN padrão (sem FD):
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 upConfigure a interface CAN (usando LeRobot)
LeRobot fornece um script de utilitário para configurar e testar interfaces CAN:
# Setup multiple interfaces (e.g., OpenArms Followers with 2 CAN buses)
lerobot-setup-can --mode=setup --interfaces=can0,can1Depuração da comunicação CAN
Use as ferramentas de depuração integradas para testar a comunicação do motor:
# Test motors on all interfaces
lerobot-setup-can --mode=test --interfaces=can0,can1
# Run speed/latency test
lerobot-setup-can --mode=speed --interfaces=can0O modo de teste irá procurar por motores (IDs 0x01-0x08) e relatar quais deles respondem. Exemplo de saída:
can0: UP (CAN FD)
Motor 0x01 (joint_1): ✓ FOUND
→ Response 0x11 [FD]: 00112233...
Motor 0x02 (joint_2): ✓ FOUND
Motor 0x03 (joint_3): ✗ No response
...
Summary: 2/8 motors foundUso
Configuração Básica
from lerobot.motors import Motor
from lerobot.motors.damiao import DamiaoMotorsBus
# Define your motors with send/receive CAN IDs
motors = {
"joint_1": Motor(id=0x01, motor_type_str="dm8009", recv_id=0x11),
"joint_2": Motor(id=0x02, motor_type_str="dm4340", recv_id=0x12),
"joint_3": Motor(id=0x03, motor_type_str="dm4310", recv_id=0x13),
}
# Create the bus
bus = DamiaoMotorsBus(
port="can0", # Linux socketcan interface
motors=motors,
)
# Connect
bus.connect()Lendo Estados do Motor
# Read single motor position (degrees)
position = bus.read("Present_Position", "joint_1")
# Read from multiple motors
positions = bus.sync_read("Present_Position") # All motors
positions = bus.sync_read("Present_Position", ["joint_1", "joint_2"])
# Read all states at once (position, velocity, torque)
states = bus.sync_read_all_states()
# Returns: {'joint_1': {'position': 45.2, 'velocity': 1.3, 'torque': 0.5}, ...}Escrevendo Comandos de Motor
# Enable torque
bus.enable_torque()
# Set goal position (degrees)
bus.write("Goal_Position", "joint_1", 45.0)
# Set positions for multiple motors
bus.sync_write("Goal_Position", {
"joint_1": 45.0,
"joint_2": -30.0,
"joint_3": 90.0,
})
# Disable torque
bus.disable_torque()Opções de Configuração
| Parâmetro | Padrão | Descrição |
|---|---|---|
port | - | Interface CAN (can0) ou porta serial (/dev/cu.usbmodem*) |
use_can_fd | True | Ative o CAN FD para taxas de dados mais altas |
bitrate | 1000000 | Taxa de bits nominal (1 Mbps) |
data_bitrate | 5000000 | Taxa de bits dos dados CAN FD (5 Mbps) |
Configuração do Motor
Cada motor requer:
id: ID do CAN para envio de comandosmotor_type: Um dos tipos de motor suportados (por exemplo,"dm8009","dm4340")recv_id: ID CAN para receber respostas
Os IDs padrão do OpenArms seguem o padrão: ID de envio 0x0N, ID de recepção 0x1N, onde N é o número da junta.
Solução de problemas
Sem resposta dos motores
- Verificar energia
- Verify CAN wiring: Check CAN-H, CAN-L, and GND connections
- Verificar IDs dos motores: Use as Ferramentas de Depuração Damiao para verificar/configurar IDs
- Testar a interface CAN: execute
candump can0para verificar se as mensagens estão sendo recebidas - Executar diagnósticos:
lerobot-setup-can --mode=test --interfaces=can0
Parâmetro de Tempo Limite do Motor
Se os motores foram configurados com timeout=0, eles não responderão aos comandos. Use as Ferramentas de Depuração do Damiao para definir um valor de timeout diferente de zero.
Verificar o status do CAN FD
ip -d link show can0 | grep fd