# OMX

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

## Đặt hàng và lắp ráp các bộ phận

Đầu tiên, lắp ráp phần cứng OMX theo hướng dẫn lắp ráp chính thức.

Hướng dẫn lắp ráp OMX: https://ai.robotis.com/omx/assembly_guide_omx.html

Robot OMX được xuất xưởng với cấu hình sẵn. ID động cơ, thông số liên lạc và độ lệch khớp đã được thiết lập, do đó không cần thiết lập hoặc hiệu chuẩn động cơ bổ sung trước khi sử dụng LeRobot.

## Cài đặt LeRobot 🤗

Để cài đặt LeRobot, hãy làm theo [Hướng dẫn cài đặt](./installation)

Ngoài các hướng dẫn này, bạn cần cài đặt hỗ trợ động cơ Dynamixel:

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

## Kết nối robot

Để tìm cổng cho mỗi bộ điều khiển servo bus, hãy chạy script này:

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

Lệnh này sẽ được thực thi và khi được yêu cầu, hãy ngắt cáp USB khỏi cánh tay leader hoặc follower rồi nhấn Enter. Đầu ra sẽ hiển thị 'The port of this MotorsBus is [port]'. Điều này xác định cổng cho cánh tay đã bị ngắt kết nối. Lặp lại với cánh tay còn lại để xác định cả hai cổng.

Ví dụ về kết quả đầu ra trên 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.
```

Cổng được tìm thấy là: `/dev/tty.usbmodem575E0032081` tương ứng với cánh tay leader hoặc follower của bạn.

Trên Linux, chúng tôi khuyến nghị mạnh mẽ việc sử dụng quy tắc udev để gán tên thiết bị bền vững và dễ đọc cho cánh OMX leader và follower. Điều này giúp tránh các vấn đề xảy ra khi tên thiết bị như ttyACM0 và ttyACM1 thay đổi khi robot bị rút ra, cắm lại, hoặc khi hệ thống khởi động lại.

#### 1. Tìm số sê-ri thiết bị của bạn

Bạn nên đã lấy được các số cổng như ../../ttyACM? cho thiết bị leader và follower bằng `lerobot-find-port`. Bạn có thể đối chiếu các kết quả đó với số serial bằng lệnh `ls -l /dev/serial/by-id/`. Để tạo các quy tắc udev, bạn cần số serial duy nhất cho mỗi thiết bị OMX. Cách dễ nhất là liệt kê các thiết bị dưới:

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

Bạn sẽ thấy kết quả tương tự như:

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

Trong mỗi dòng, số sê-ri là chuỗi dài nằm sau `usb-ROBOTIS_OpenRB-150_` và trước `-if00`.

Chuỗi người theo dõi: `228BDD7B503059384C2E3120FF0A2B19`

Chuỗi leader: `67E1ED68503059384C2E3120FF092234`

#### 2. Tạo quy tắc udev

Tạo một tệp quy tắc udev mới:

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

Dán các dòng sau, thay thế các số serial bằng các giá trị bạn đã tìm thấy ở trên:

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

Lưu tệp và nạp lại các quy tắc udev:

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

Bây giờ hãy rút và cắm lại cả hai thiết bị một lần.

#### 3. Xác minh các liên kết biểu tượng

Kiểm tra xem tên thiết bị bền vững có tồn tại hay không:

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

Bạn sẽ thấy chúng trỏ đến các thiết bị ttyACM\*:

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

Các tên này vẫn ổn định qua các lần khởi động lại và kết nối lại.

## Điều khiển từ xa

Sau khi xác định các cổng chính xác, bạn có thể trực tiếp điều khiển tay follower bằng tay leader.

### Điều khiển từ xa mà không cần camera

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

Trong quá trình điều khiển từ xa, các chuyển động của cánh tay dẫn được cánh tay theo sao chép lại theo thời gian thực. OMX đã được cấu hình sẵn, việc điều khiển từ xa có thể bắt đầu ngay lập tức mà không cần bất kỳ bước hiệu chuẩn nào.

### Điều khiển từ xa bằng camera

Bạn cũng có thể bật đầu vào camera trong quá trình điều khiển từ xa bằng cách cung cấp cấu hình camera cho cánh tay theo dõi.

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

Khi camera được bật, luồng video từ camera sẽ được hiển thị theo thời gian thực và đồng bộ với trạng thái của robot. Cấu hình này hữu ích cho việc giám sát trực quan và có thể được tái sử dụng sau đó cho việc ghi lại bản demo và học bắt chước.

### Điều khiển từ xa mà không cần camera

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

Trong quá trình điều khiển từ xa, các chuyển động của cánh tay dẫn được cánh tay theo sao chép lại theo thời gian thực. OMX đã được cấu hình sẵn, việc điều khiển từ xa có thể bắt đầu ngay lập tức mà không cần bất kỳ bước hiệu chuẩn nào.

### Điều khiển từ xa bằng camera

Bạn cũng có thể bật đầu vào camera trong quá trình điều khiển từ xa bằng cách cung cấp cấu hình camera cho cánh tay theo dõi.

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

Khi camera được bật, luồng video từ camera sẽ được hiển thị theo thời gian thực và đồng bộ với trạng thái của robot. Cấu hình này hữu ích cho việc giám sát trực quan và có thể được tái sử dụng sau đó cho việc ghi lại bản demo và học bắt chước.

Chúc mừng 🎉, robot của bạn đã sẵn sàng để tự học một tác vụ.

> Nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ, vui lòng liên hệ trên [Discord](https://discord.com/invite/robotis).

