LeRobot documentation

Damiao Motors e CAN Bus

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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-utils

Configure 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 up

Para 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 up

Configure 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,can1

Depuraçã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=can0

O 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 found

Uso

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âmetroPadrãoDescrição
port-Interface CAN (can0) ou porta serial (/dev/cu.usbmodem*)
use_can_fdTrueAtive o CAN FD para taxas de dados mais altas
bitrate1000000Taxa de bits nominal (1 Mbps)
data_bitrate5000000Taxa de bits dos dados CAN FD (5 Mbps)

Configuração do Motor

Cada motor requer:

  • id: ID do CAN para envio de comandos
  • motor_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

  1. Verificar energia
  2. Verify CAN wiring: Check CAN-H, CAN-L, and GND connections
  3. Verificar IDs dos motores: Use as Ferramentas de Depuração Damiao para verificar/configurar IDs
  4. Testar a interface CAN: execute candump can0 para verificar se as mensagens estão sendo recebidas
  5. 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
Update on GitHub