# SO-100

Trong các bước bên dưới, chúng tôi giải thích cách lắp ráp robot SO-100.

## Tìm nguồn cung cấp linh kiện

Hãy làm theo [README](https://github.com/TheRobotStudio/SO-ARM100/blob/main/SO100.md) này. Tài liệu này chứa danh sách vật liệu, kèm liên kết để tìm mua linh kiện, cũng như hướng dẫn in 3D các bộ phận. Và hãy cho biết nếu đây là lần đầu bạn in 3D hoặc nếu bạn chưa sở hữu máy in 3D.

## 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 Feetech SDK (nếu bạn đã cài đặt LeRobot từ PyPI, hãy chạy `pip install 'lerobot[feetech]'` thay thế):

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

## Cấu hình các động cơ

**Lưu ý:** Khác với SO-101, các đầu nối động cơ không dễ tiếp cận sau khi cánh tay được lắp ráp, do đó bước cấu hình phải được thực hiện trước đó.

### 1. Tìm các cổng USB liên quan đến mỗi cánh tay

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

Ví dụ về kết quả đầu ra:

```
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, bạn có thể cần cấp quyền truy cập vào các cổng USB bằng cách chạy:

```bash
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
```

Ví dụ về kết quả đầu ra:

```
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
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/ttyACM1
Reconnect the USB cable.
```

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

### 2. Đặt các id và baudrate của động cơ

Mỗi động cơ được xác định bằng một id duy nhất trên bus. Khi mới mua, động cơ thường có id mặc định là `1`. Để việc truyền thông giữa các động cơ và bộ điều khiển hoạt động chính xác, trước tiên chúng ta cần đặt một id duy nhất, khác nhau cho từng động cơ. Ngoài ra, tốc độ truyền dữ liệu trên bus được xác định bởi baudrate. Để giao tiếp với nhau, bộ điều khiển và tất cả các động cơ cần được cấu hình với cùng một baudrate.

Để làm được điều đó, trước tiên chúng ta cần kết nối với từng động cơ riêng lẻ thông qua bộ điều khiển để thiết lập các thông số này. Vì chúng ta sẽ ghi các tham số này vào phần bộ nhớ nội bộ không bay hơi (EEPROM) của các động cơ, nên chúng ta chỉ cần thực hiện thao tác này một lần.

Nếu bạn đang tái sử dụng động cơ từ một robot khác, bạn có thể cũng cần thực hiện bước này vì các id và baudrate có thể không khớp.

#### Người theo dõi

Kết nối cáp usb từ máy tính và bộ nguồn vào bo mạch điều khiển của cánh tay theo dõi. Sau đó, chạy lệnh sau hoặc chạy ví dụ API với cổng bạn đã nhận được từ bước trước. Bạn cũng cần đặt tên cho cánh tay theo dõi của mình bằng tham số `id`.

Để có tham khảo trực quan về cách thiết lập các id động cơ, vui lòng xem [video này](https://huggingface.co/docs/lerobot/en/so101#setup-motors-video), trong đó chúng tôi thực hiện quy trình cho cánh tay SO101.

```bash
lerobot-setup-motors \
    --robot.type=so100_follower \
    --robot.port=/dev/tty.usbmodem585A0076841  # <- paste here the port found at previous step
```

```python
from lerobot.robots.so_follower import SO100Follower, SO100FollowerConfig

config = SO100FollowerConfig(
    port="/dev/tty.usbmodem585A0076841",
    id="my_awesome_follower_arm",
)
follower = SO100Follower(config)
follower.setup_motors()
```

Bạn nên thấy hướng dẫn sau

```
Connect the controller board to the 'gripper' motor only and press enter.
```

Theo hướng dẫn, cắm motor của kẹp. Đảm bảo đây là motor duy nhất được kết nối với bo mạch, và bản thân motor chưa được nối dây daisy-chain với bất kỳ motor nào khác. Khi bạn nhấn `[Enter]`, script sẽ tự động đặt id và baudrate cho motor đó.

Xử lý sự cố

Nếu bạn gặp lỗi ở bước đó, hãy kiểm tra các cáp và đảm bảo chúng được cắm đúng cách:

  Cáp nguồn USB giữa máy tính của bạn và bo mạch điều khiển Cáp 3 chân từ bo mạch điều khiển đến động cơ

Nếu bạn đang sử dụng bo mạch điều khiển Waveshare, hãy đảm bảo rằng hai cầu nối được đặt ở kênh `B` (USB).

Sau đó, bạn sẽ thấy thông báo sau:

```
'gripper' motor id set to 6
```

Tiếp theo là hướng dẫn tiếp theo:

```
Connect the controller board to the 'wrist_roll' motor only and press enter.
```

Bạn có thể tháo cáp 3 chân khỏi bảng điều khiển, nhưng có thể để nó vẫn cắm vào động cơ kẹp ở đầu kia, vì nó đã ở đúng vị trí. Bây giờ, cắm một cáp 3 chân khác vào động cơ xoay cổ tay và kết nối nó với bảng điều khiển. Giống như động cơ trước, hãy đảm bảo rằng đây là động cơ duy nhất được kết nối với bảng và bản thân động cơ không được kết nối với bất kỳ động cơ nào khác.

Lặp lại thao tác cho mỗi động cơ theo hướng dẫn.

> [!TIP]
> Kiểm tra dây cáp ở mỗi bước trước khi nhấn Enter. Ví dụ, cáp nguồn có thể bị lỏng khi bạn thao tác trên bo mạch.

Khi hoàn tất, script sẽ tự động kết thúc, lúc này các động cơ đã sẵn sàng để sử dụng. Bạn có thể cắm cáp 3 chân từ mỗi động cơ sang động cơ tiếp theo, và cắm cáp từ động cơ đầu tiên (phần 'shoulder pan' có id=1) vào bo mạch điều khiển, sau đó gắn bo mạch này vào phần đế của cánh tay robot.

#### Trưởng nhóm

Thực hiện các bước tương tự cho cánh tay chính.

```bash
lerobot-setup-motors \
    --teleop.type=so100_leader \
    --teleop.port=/dev/tty.usbmodem575E0031751  # <- paste here the port found at previous step
```

```python
from lerobot.teleoperators.so_leader import SO100Leader, SO100LeaderConfig

config = SO100LeaderConfig(
    port="/dev/tty.usbmodem585A0076841",
    id="my_awesome_leader_arm",
)
leader = SO100Leader(config)
leader.setup_motors()
```

## Hướng dẫn lắp ráp từng bước

## Gỡ bỏ các bánh răng của 6 động cơ dẫn

Video loại bỏ bánh răng

  
    <source
      src="https://github.com/user-attachments/assets/0c95b88c-5b85-413d-ba19-aee2f864f2a7"
      type="video/mp4"
    />
  

Xem video để biết cách tháo bánh răng. Bạn cần tháo bánh răng cho các động cơ của cánh tay dẫn. Kết quả là bạn sẽ chỉ sử dụng mã hóa vị trí của động cơ và giảm ma sát để dễ dàng vận hành cánh tay dẫn hơn.

### Các phần sạch

Loại bỏ tất cả vật liệu hỗ trợ khỏi các chi tiết in 3D. Cách dễ nhất để làm điều này là sử dụng một chiếc tua vít nhỏ để luồn vào bên dưới vật liệu hỗ trợ.

### Hướng dẫn bổ sung

Video lắp ráp cánh tay

  
    <source
      src="https://github.com/user-attachments/assets/488a39de-0189-4461-9de3-05b015f90cca"
      type="video/mp4"
    />
  

**Lưu ý:** Video này cung cấp hướng dẫn trực quan để lắp ráp cánh tay, nhưng không chỉ rõ thời điểm hay cách thức thực hiện việc đi dây. Việc luồn cáp trước khi lắp ráp sẽ dễ dàng hơn nhiều so với làm sau. Cánh tay đầu tiên có thể mất hơn 1 giờ để lắp ráp, nhưng khi đã quen tay, bạn có thể lắp ráp cánh tay thứ hai trong chưa đầy 1 giờ.

---

### Động cơ đầu tiên

**Bước 2: Chèn dây**

- Cắm hai dây vào động cơ đầu tiên.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_1.webp"
  style="height:300px;"
/>

**Bước 3: Cài đặt trong Base**

- Đặt động cơ đầu tiên vào đế.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_2.webp"
  style="height:300px;"
/>

**Bước 4: Cố định động cơ**

- Vặn chặt động cơ bằng 4 ốc vít. Hai từ phía dưới và hai từ phía trên.

**Bước 5: Gắn giá đỡ động cơ**

- Trượt qua giá đỡ động cơ đầu tiên và cố định nó bằng hai ốc vít (một ở mỗi bên).

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_4.webp"
  style="height:300px;"
/>

**Bước 6: Gắn còi động cơ**

- Lắp cả hai sừng động cơ, cố định sừng trên bằng một ốc vít. Cố gắng không làm xê dịch vị trí động cơ khi gắn sừng động cơ, đặc biệt là đối với các cánh tay dẫn, nơi chúng ta đã tháo các bánh răng.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_5.webp"
  style="height:300px;"
/>

  
    Video thêm còi xe
  
  

**Bước 7: Gắn phần vai**

- Đưa một dây đến phía sau robot và dây còn lại sang bên trái hoặc về phía bạn (xem ảnh).
- Gắn phần vai.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_6.webp"
  style="height:300px;"
/>

**Bước 8: Bảo vệ vai**

- Siết chặt phần vai bằng 4 ốc vít ở phía trên và 4 ở phía dưới _(tiếp cận các lỗ phía dưới bằng cách xoay phần vai)._

---

### Bộ lắp ráp động cơ thứ hai

**Bước 9: Cài đặt Motor 2**

- Trượt động cơ thứ hai từ trên xuống và nối dây từ động cơ 1 sang động cơ 2.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_8.webp"
  style="height:300px;"
/>

**Bước 10: Gắn giá đỡ vai**

- Thêm giá đỡ động cơ vai.
- Đảm bảo dây từ động cơ 1 đến động cơ 2 đi phía sau giá đỡ trong khi dây kia được đi lên trên (xem ảnh).
- Phần này có thể khá chặt khi lắp ráp, bạn có thể sử dụng một bàn làm việc như trong hình hoặc một thiết lập tương tự để đẩy phần này quanh động cơ.

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_9.webp"
    style="height:250px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_10.webp"
    style="height:250px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_12.webp"
    style="height:250px;"
  />

**Bước 11: Cố định động cơ 2**

- Gắn chặt động cơ thứ hai bằng 4 ốc vít.

**Bước 12: Gắn còi động cơ**

- Gắn cả hai còi động cơ vào động cơ 2, một lần nữa sử dụng vít còi.

**Bước 13: Gắn đế**

- Lắp đặt bộ phụ kiện cơ bản bằng 2 vít.

**Bước 14: Gắn cánh tay trên**

- Gắn cánh tay trên bằng 4 ốc vít ở mỗi bên.

---

### Bộ lắp ráp động cơ thứ ba

**Bước 15: Cài đặt Motor 3**

- Đi dây động cơ từ động cơ 2 qua giá đỡ cáp đến động cơ 3, sau đó cố định động cơ 3 bằng 4 vít.

**Bước 16: Gắn còi động cơ**

- Gắn cả hai còi động cơ vào động cơ 3 và cố định lại một cái bằng vít còi.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_14.webp"
  style="height:300px;"
/>

**Bước 17: Gắn cẳng tay**

- Kết nối cẳng tay với động cơ 3 bằng 4 vít ở mỗi bên.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_15.webp"
  style="height:300px;"
/>

---

### Bộ lắp ráp động cơ thứ tư

**Bước 18: Cài đặt Motor 4**

- Trượt motor 4 vào, gắn cáp từ motor 3 và cố định cáp trong giá đỡ bằng một con ốc vít.

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_16.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_19.webp"
    style="height:300px;"
  />

**Bước 19: Gắn giá đỡ động cơ 4**

- Lắp giá đỡ động cơ thứ tư (lắp chặt). Đảm bảo một dây được đi lên trên và dây từ động cơ 3 được đi xuống dưới (xem ảnh).

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_17.webp"
  style="height:300px;"
/>

**Bước 20: Cố định động cơ 4 & gắn còi**

- Siết chặt động cơ 4 bằng 4 ốc vít và gắn các sừng động cơ của nó, sử dụng một ốc vít sừng cho một sừng.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_18.webp"
  style="height:300px;"
/>

---

### Lắp ráp cổ tay

**Bước 21: Cài đặt Motor 5**

- Chèn động cơ 5 vào giá đỡ cổ tay và cố định bằng 2 vít phía trước.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_20.webp"
  style="height:300px;"
/>

**Bước 22: Gắn cổ tay**

- Nối dây từ động cơ 4 sang động cơ 5. Và hãy cắm sẵn dây còn lại cho kẹp.
- Cố định cổ tay vào động cơ 4 bằng 4 vít ở cả hai bên.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_22.webp"
  style="height:300px;"
/>

**Bước 23: Gắn sừng cổ tay**

- Chỉ lắp một còi động cơ vào động cơ cổ tay và cố định bằng vít còi.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_23.webp"
  style="height:300px;"
/>

---

### Cấu hình Follower

**Bước 24: Gắn kẹp**

- Gắn gắp vào động cơ 5.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_24.webp"
  style="height:300px;"
/>

**Bước 25: Cài đặt động cơ kẹp**

- Chèn động cơ kẹp, kết nối dây động cơ từ động cơ 5 đến động cơ 6, và cố định bằng 3 vít ở mỗi bên.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_25.webp"
  style="height:300px;"
/>

**Bước 26: Gắn sừng kẹp và móng**

- Gắn các sừng động cơ và một lần nữa sử dụng vít sừng.
- Lắp càng kẹp và cố định bằng 4 ốc vít ở cả hai bên.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_26.webp"
  style="height:300px;"
/>

**Bước 27: Gắn bộ điều khiển**

- Gắn bộ điều khiển động cơ vào phía sau robot.

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_27.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_28.webp"
    style="height:300px;"
  />

_Hoàn tất lắp ráp – tiếp tục lắp ráp cánh tay Leader._

---

### Cấu hình Leader

Đối với cấu hình leader, thực hiện **Bước 1–23**. Hãy đảm bảo rằng bạn đã tháo các bánh răng động cơ khỏi các động cơ.

**Bước 24: Gắn giá đỡ đầu**

- Gắn bộ phận giữ đầu vào cổ tay và cố định bằng một con ốc vít.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_29.webp"
  style="height:300px;"
/>

**Bước 25: Gắn tay cầm**

- Gắn tay cầm vào động cơ 5 bằng 4 con ốc vít.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_30.webp"
  style="height:300px;"
/>

**Bước 26: Cài đặt động cơ kẹp**

- Chèn động cơ kẹp, cố định bằng 3 ốc vít ở mỗi bên, gắn sừng động cơ bằng ốc vít sừng, và kết nối dây động cơ.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_31.webp"
  style="height:300px;"
/>

**Bước 27: Gắn Trigger**

- Gắn bộ kích hoạt người theo dõi bằng 4 con ốc vít.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_32.webp"
  style="height:300px;"
/>

**Bước 28: Gắn bộ điều khiển**

- Gắn bộ điều khiển động cơ vào phía sau robot.

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_27.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_28.webp"
    style="height:300px;"
  />

## Hiệu chuẩn

Tiếp theo, bạn cần hiệu chuẩn robot để đảm bảo rằng cánh tay dẫn và cánh tay theo có cùng giá trị vị trí khi chúng ở cùng một vị trí vật lý. Quá trình hiệu chuẩn rất quan trọng vì nó cho phép một mạng nơ-ron được huấn luyện trên một robot có thể hoạt động trên một robot khác.

#### Người theo dõi

Chạy lệnh hoặc ví dụ API sau để hiệu chuẩn cánh tay follower:

```bash
# Use the port of your follower arm, and give the arm a unique name with --robot.id
lerobot-calibrate \
    --robot.type=so100_follower \
    --robot.port=/dev/tty.usbmodem58760431551 \
    --robot.id=my_awesome_follower_arm
```

```python
from lerobot.robots.so_follower import SO100FollowerConfig, SO100Follower

config = SO100FollowerConfig(
    port="/dev/tty.usbmodem585A0076891",
    id="my_awesome_follower_arm",
)

follower = SO100Follower(config)
follower.connect(calibrate=False)
follower.calibrate()
follower.disconnect()
```

Chúng tôi đã thống nhất phương pháp hiệu chuẩn cho hầu hết các robot. Do đó, các bước hiệu chuẩn cho cánh tay SO100 này giống hệt với các bước cho Koch và SO101. Trước tiên, chúng ta phải di chuyển robot đến vị trí mà mỗi khớp nằm ở giữa phạm vi chuyển động của nó, sau đó nhấn `Enter`. Tiếp theo, chúng ta di chuyển tất cả các khớp qua toàn bộ phạm vi chuyển động của chúng. Một video về cùng quy trình này cho SO101 để tham khảo có thể tìm thấy [tại đây](https://huggingface.co/docs/lerobot/en/so101#calibration-video)

#### Trưởng nhóm

Thực hiện các bước tương tự để hiệu chuẩn cánh tay chính, chạy lệnh hoặc ví dụ API sau:

```bash
# Use the port of your leader arm, and give the arm a unique name with --teleop.id
lerobot-calibrate \
    --teleop.type=so100_leader \
    --teleop.port=/dev/tty.usbmodem58760431551 \
    --teleop.id=my_awesome_leader_arm
```

```python
from lerobot.teleoperators.so_leader import SO100LeaderConfig, SO100Leader

config = SO100LeaderConfig(
    port="/dev/tty.usbmodem58760431551",
    id="my_awesome_leader_arm",
)

leader = SO100Leader(config)
leader.connect(calibrate=False)
leader.calibrate()
leader.disconnect()
```

Chúc mừng 🎉, robot của bạn đã sẵn sàng để tự học một tác vụ. Bắt đầu huấn luyện nó bằng cách làm theo hướng dẫn này: [Bắt đầu với robot thực tế](./il_robots)

> [!TIP]
> 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/s3KuuzsPFb).

