# Damiao Motors и CAN Bus

В этом руководстве описаны настройка и использование моторов Damiao с LeRobot через коммуникацию по шине CAN.

В настоящее время поддерживается только Linux, так как адаптер CAN OpenArms имеет драйверы только для Linux.

## Настройка CAN в Linux

Перед использованием двигателей Damiao необходимо настроить CAN-интерфейс в вашей системе Linux.

### Установка CAN Utilities

```bash
sudo apt-get install can-utils
```

### Настройка интерфейса CAN (вручную)

Для стандартного CAN FD (рекомендуется для OpenArms):

```bash
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
```

Для стандартного CAN (без FD):

```bash
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
```

### Настройка интерфейса CAN (с использованием LeRobot)

LeRobot предоставляет утилиту для настройки и тестирования CAN-интерфейсов:

```bash
# Setup multiple interfaces (e.g., OpenArms Followers with 2 CAN buses)
lerobot-setup-can --mode=setup --interfaces=can0,can1
```

## Отладка CAN-связи

Используйте встроенные инструменты отладки для проверки связи с мотором:

```bash
# Test motors on all interfaces
lerobot-setup-can --mode=test --interfaces=can0,can1

# Run speed/latency test
lerobot-setup-can --mode=speed --interfaces=can0
```

В режиме тестирования выполняется поиск моторов (ID 0x01-0x08) и отчёт о том, какие из них отвечают. Пример вывода:

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

## Использование

### Базовая настройка

```python
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()
```

### Чтение состояний моторов

```python
# 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}, ...}
```

### Запись команд для двигателей

```python
# 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()
```

## Варианты конфигурации

| Параметр      | По умолчанию   | Описание                                                 |
| -------------- | --------- | ----------------------------------------------------------- |
| `port`         | -         | Интерфейс CAN (`can0`) или последовательный порт (`/dev/cu.usbmodem*`) |
| `use_can_fd`   | `True`    | Включите CAN FD для более высоких скоростей передачи данных                         |
| `bitrate`      | `1000000` | Номинальная скорость передачи данных (1 Мбит/с)                                    |
| `data_bitrate` | `5000000` | Скорость передачи данных CAN FD (5 Мбит/с)                                |

## Конфигурация двигателя

Каждый мотор требует:

- `id`: CAN ID для отправки команд
- `motor_type`: один из поддерживаемых типов двигателей (например, `"dm8009"`, `"dm4340"`)
- `recv_id`: CAN ID для приёма ответов

По умолчанию идентификаторы OpenArms следуют схеме: ID отправки `0x0N`, ID приёма `0x1N`, где N — номер сустава.

## Устранение неполадок

### Нет ответа от Motors

1. **Проверка питания**
2. **Verify CAN wiring**: Check CAN-H, CAN-L, and GND connections
3. **Проверка идентификаторов двигателей**: используйте Damiao Debugging Tools для проверки/настройки идентификаторов
4. **Тест интерфейса CAN**: выполните `candump can0`, чтобы проверить, принимаются ли сообщения
5. **Запуск диагностики**: `lerobot-setup-can --mode=test --interfaces=can0`

### Параметр тайм-аута Motor

Если моторы были настроены с параметром timeout=0, они не будут реагировать на команды. Используйте Damiao Debugging Tools, чтобы установить ненулевое значение тайм-аута.

### Проверка статуса CAN FD

```bash
ip -d link show can0 | grep fd
```

