# OMX

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/omx_mainimage.png"
  alt="OMX"
  width=600
/>

## Заказ и сборка компонентов

Сначала соберите аппаратную часть OMX, следуя официальному руководству по сборке.

Руководство по сборке OMX: https://ai.robotis.com/omx/assembly_guide_omx.html

Роботы OMX поставляются с завода с готовой конфигурацией. Идентификаторы двигателей, параметры связи и смещения суставов уже настроены, поэтому перед использованием LeRobot не требуется дополнительная настройка или калибровка двигателей.

## Установка LeRobot 🤗

Чтобы установить LeRobot, следуйте нашему [Руководству по установке](./installation)

Помимо этих инструкций, вам необходимо установить поддержку моторов Dynamixel:

```bash
pip install -e ".[dynamixel]"
```

## Подключите робота

Чтобы найти порт для каждого адаптера сервопривода шины, выполните этот скрипт:

```bash
lerobot-find-port
```

This command runs and when prompted, disconnect the USB cable from either the leader or follower arm and press Enter. The output will show 'The port of this MotorsBus is [port]'. This identifies the port for the disconnected arm. Repeat for the other arm to identify both ports.

Пример вывода на macOS:

```
Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
Remove the USB cable from your MotorsBus and press Enter when done.

[...Disconnect corresponding leader or follower arm and press Enter...]

The port of this MotorsBus is /dev/tty.usbmodem575E0032081
Reconnect the USB cable.
```

Найденный порт: `/dev/tty.usbmodem575E0032081`, соответствующий ведущей или ведомой руке.

На Linux мы настоятельно рекомендуем использовать правила udev для назначения постоянных и понятных человеку имён устройств ведущему и ведомому манипуляторам OMX. Это позволяет избежать проблем, при которых имена устройств, такие как ttyACM0 и ttyACM1, изменяются при отключении и повторном подключении робота или при перезагрузке системы.

#### 1. Найдите серийные номера ваших устройств

Вы должны были получить номера портов, например ../../ttyACM?, для лидера и последователя с помощью `lerobot-find-port`. Вы можете сопоставить эти результаты с серийными номерами, используя команду `ls -l /dev/serial/by-id/`. Для создания правил udev вам нужен уникальный серийный номер для каждого устройства OMX. Самый простой способ — перечислить устройства по пути:

```bash
ls -l /dev/serial/by-id/
```

Вы увидите вывод, похожий на следующий:

```bash
usb-ROBOTIS_OpenRB-150_228BDD7B503059384C2E3120FF0A2B19-if00 -> ../../ttyACM0
usb-ROBOTIS_OpenRB-150_67E1ED68503059384C2E3120FF092234-if00 -> ../../ttyACM1
```

В каждой строке серийный номер — это длинная строка после `usb-ROBOTIS_OpenRB-150_` и перед `-if00`.

Серийный номер Follower: `228BDD7B503059384C2E3120FF0A2B19`

Серийный номер лидера: `67E1ED68503059384C2E3120FF092234`

#### 2. Создайте правило udev

Создайте новый файл правила udev:

```bash
sudo nano /etc/udev/rules.d/99-omx.rules
```

Вставьте следующие строки, заменив серийные номера на значения, найденные выше:

```bash
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="228BDD7B503059384C2E3120FF0A2B19", SYMLINK+="omx_follower"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="67E1ED68503059384C2E3120FF092234", SYMLINK+="omx_leader"
```

Сохраните файл и перезагрузите правила udev:

```bash
sudo udevadm control --reload-rules
sudo udevadm trigger
```

Теперь отключите и снова подключите оба устройства один раз.

#### 3. Проверьте символьные ссылки

Проверьте, что имена постоянных устройств существуют:

```bash
ls -l /dev/omx_follower /dev/omx_leader
```

Вы должны увидеть, что они указывают на устройства ttyACM\*:

```bash
/dev/omx_follower -> ttyACM*
/dev/omx_leader   -> ttyACM*
```

Эти имена остаются стабильными при перезагрузках и переподключениях.

## Телеуправление

После определения правильных портов можно напрямую телеуправлять ведомым манипулятором с помощью ведущего манипулятора.

### Управление телепортом без камеры

```bash
lerobot-teleoperate \
  --robot.type=omx_follower \
  --robot.port=<your_follower_port> \
  --robot.id=omx_follower_arm \
  --teleop.type=omx_leader \
  --teleop.port=<your_leader_port> \
  --teleop.id=omx_leader_arm
```

В ходе телеуправления движения ведущей руки в реальном времени зеркально воспроизводятся ведомой рукой. OMX уже настроен, телеуправление можно начать сразу, без каких-либо этапов калибровки.

### Управление с камерой

Вы также можете включить ввод с камеры во время телеуправления, предоставив конфигурацию камеры для ведомой руки.

```bash
lerobot-teleoperate \
  --robot.type=omx_follower \
  --robot.port=<your_follower_port> \
  --robot.id=omx_follower_arm \
  --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', width: 640, height: 480, fps: 30}}" \
  --teleop.type=omx_leader \
  --teleop.port=<your_leader_port> \
  --teleop.id=omx_leader_arm \
  --display_data=true
```

Когда камера включена, видеопоток отображается в реальном времени и синхронизирован с состоянием робота. Такая конфигурация полезна для визуального мониторинга и может быть переиспользована позже для записи демонстраций и обучения с подражанием.

### Управление телепортом без камеры

```bash
lerobot-teleoperate \
  --robot.type=omx_follower \
  --robot.port=/dev/omx_follower \
  --robot.id=omx_follower_arm \
  --teleop.type=omx_leader \
  --teleop.port=/dev/omx_leader \
  --teleop.id=omx_leader_arm
```

В ходе телеуправления движения ведущей руки в реальном времени зеркально воспроизводятся ведомой рукой. OMX уже настроен, телеуправление можно начать сразу, без каких-либо этапов калибровки.

### Управление с камерой

Вы также можете включить ввод с камеры во время телеуправления, предоставив конфигурацию камеры для ведомой руки.

```bash
lerobot-teleoperate \
  --robot.type=omx_follower \
  --robot.port=/dev/omx_follower \
  --robot.id=omx_follower_arm \
  --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', width: 640, height: 480, fps: 30}}" \
  --teleop.type=omx_leader \
  --teleop.port=/dev/omx_leader \
  --teleop.id=omx_leader_arm \
  --display_data=true
```

Когда камера включена, видеопоток отображается в реальном времени и синхронизирован с состоянием робота. Такая конфигурация полезна для визуального мониторинга и может быть переиспользована позже для записи демонстраций и обучения с подражанием.

Поздравляем 🎉, ваш робот готов самостоятельно обучаться задаче.

> Если у вас есть вопросы или нужна помощь, напишите нам в [Discord](https://discord.com/invite/robotis).

