# SO-101

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/SO101_Follower.webp"
    alt="SO-101"
    width="60%"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/SO101_Leader.webp"
    alt="SO-101"
    width="60%"
  />

Pada langkah-langkah di bawah, kami menjelaskan cara merakit robot unggulan kami, SO-101.

## Sumberkan komponen

Ikuti [README](https://github.com/TheRobotStudio/SO-ARM100) ini. Dokumen ini berisi daftar bahan, dengan tautan untuk memesan komponen, serta instruksi untuk mencetak komponen secara 3D. Dokumen ini juga memberikan saran jika Anda mencetak untuk pertama kalinya atau jika Anda tidak memiliki printer 3D.

## Install LeRobot 🤗

Untuk menginstal LeRobot, ikuti [Panduan Instalasi](./installation) kami

Selain instruksi ini, Anda perlu menginstal Feetech SDK (jika Anda menginstal LeRobot dari PyPI, jalankan `pip install 'lerobot[feetech]'` sebagai gantinya):

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

## Instruksi Perakitan Langkah demi Langkah

Lengan pengikut menggunakan 6x motor STS3215 dengan rasio gigi 1/345. Namun, lengan pemimpin menggunakan tiga motor dengan rasio gigi berbeda untuk memastikan bahwa lengan tersebut dapat menopang beratnya sendiri dan dapat digerakkan tanpa memerlukan banyak gaya. Motor yang dibutuhkan untuk setiap sendi ditunjukkan pada tabel di bawah.

| Sumbu Leader-Arm     | Motor | Rasio Gigi |
| ------------------- | :---: | :--------: |
| Dasar / Bahu Pan |   1   |  1 / 191   |
| Angkat Bahu       |   2   |  1 / 345   |
| Elbow Flex          |   3   |  1 / 191   |
| Wrist Flex          |   4   |  1 / 147   |
| Wrist Roll          |   5   |  1 / 147   |
| Gripper             |   6   |  1 / 147   |

## Konfigurasikan motor

### 1. Temukan port USB yang terkait dengan masing-masing lengan

Untuk menemukan port untuk setiap bus servo adapter, hubungkan MotorBus ke komputer Anda melalui USB dan daya. Jalankan skrip berikut dan putuskan MotorBus saat diminta:

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

Contoh keluaran:

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

Port yang ditemukan adalah: `/dev/tty.usbmodem575E0032081` yang sesuai dengan lengan leader atau follower Anda.

Pada Linux, Anda mungkin perlu memberikan akses ke port USB dengan menjalankan:

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

Contoh keluaran:

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

Port yang ditemukan adalah: `/dev/ttyACM1` yang sesuai dengan lengan leader atau follower Anda.

### 2. Atur id dan baudrate motor

Setiap motor diidentifikasi oleh id unik di bus. Saat baru, motor biasanya memiliki id default `1`. Agar komunikasi antara motor dan controller berjalan dengan baik, kita perlu mengatur id unik yang berbeda untuk setiap motor. Selain itu, kecepatan transmisi data di bus ditentukan oleh baudrate. Agar controller dan semua motor dapat berkomunikasi, keduanya harus dikonfigurasi dengan baudrate yang sama.

Untuk tujuan tersebut, kita pertama perlu terhubung ke setiap motor secara individual dengan pengontrol untuk mengatur parameter ini. Karena kita akan menulis parameter ini ke bagian non-volatile dari memori internal motor (EEPROM), kita hanya perlu melakukan ini sekali.

Jika Anda menggunakan ulang motor dari robot lain, kemungkinan besar Anda juga perlu melakukan langkah ini karena id dan baudrate kemungkinan tidak akan cocok.

Video di bawah ini menunjukkan urutan langkah untuk mengatur id motor.

##### Video pengaturan motor

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/setup_motors_so101_2.mp4"
      type="video/mp4"
    />
  

#### Pengikut

Hubungkan kabel usb dari komputer dan sumber daya ke papan kontrol lengan pengikut. Kemudian, jalankan perintah berikut atau jalankan contoh API dengan port yang Anda dapatkan dari langkah sebelumnya. Anda juga perlu memberikan nama untuk lengan pengikut Anda dengan parameter `id`.

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

```python
from lerobot.robots.so_follower import SO101Follower, SO101FollowerConfig

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

Anda harus melihat instruksi berikut

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

Sesuai instruksi, colokkan motor gripper. Pastikan itu satu-satunya motor yang terhubung ke papan, dan bahwa motor tersebut belum di-daisy-chain ke motor lain. Saat Anda menekan `[Enter]`, skrip akan secara otomatis mengatur id dan baudrate untuk motor tersebut.

Pemecahan Masalah

Jika Anda mendapatkan error pada titik tersebut, periksa kabel Anda dan pastikan mereka terpasang dengan benar:

  Kabel daya USB antara komputer Anda dan papan pengontrol Kabel 3-pin dari papan pengontrol ke motor

Jika Anda menggunakan papan kontrol Waveshare, pastikan kedua jumper disetel pada kanal `B` (USB).

Anda seharusnya melihat pesan berikut:

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

Diikuti oleh instruksi berikutnya:

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

Anda dapat mencabut kabel 3-pin dari papan kontrol, tetapi biarkan kabel tersebut tetap terhubung ke motor gripper di ujung lainnya, karena posisinya sudah tepat. Sekarang, colokkan kabel 3-pin lainnya ke motor pergelangan tangan (wrist roll) dan hubungkan ke papan kontrol. Sama seperti motor sebelumnya, pastikan itu adalah satu-satunya motor yang terhubung ke papan dan motor itu sendiri tidak terhubung ke motor lain.

Ulangi operasi untuk setiap motor sesuai instruksi.

> [!TIP]
> Periksa kabel Anda di setiap langkah sebelum menekan Enter. Misalnya, kabel catu daya bisa terlepas saat Anda memanipulasi papan.

Setelah selesai, skrip akan langsung berakhir, yang berarti motor sudah siap digunakan. Anda sekarang dapat menyambungkan kabel 3-pin dari setiap motor ke motor berikutnya, dan kabel dari motor pertama (‘shoulder pan’ dengan id=1) ke papan kontrol, yang kini dapat dipasang pada dasar lengan.

#### Pemimpin

Lakukan langkah yang sama untuk lengan pemimpin.

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

```python
from lerobot.teleoperators.so_leader import SO101Leader, SO101LeaderConfig

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

### Bagian Bersih

Lepaskan semua material penyangga dari bagian yang dicetak 3D. Cara termudah untuk melakukan ini adalah menggunakan obeng kecil untuk mengait bagian bawah material penyangga.

Disarankan untuk memasang satu kabel 3-pin di motor setelah menempatkan kabel-kabel tersebut sebelum melanjutkan perakitan.

### Ganda 1

- Pasang kedua klakson motor. Kencangkan klakson atas dengan sekrup M3x6mm. Klakson bawah tidak memerlukan sekrup.
- Letakkan motor pertama ke dalam dasar.
- Kencangkan motor dengan 4 sekrup M2x6mm (sekrup terkecil). Dua dari atas dan dua dari bawah.
- Geser penyangga motor pertama dan kencangkan menggunakan dua sekrup M2x6mm (satu di setiap sisi).
- Lampirkan bagian bahu.
- Kencangkan bagian bahu dengan 4 sekrup M3x6mm di bagian atas dan 4 sekrup M3x6mm di bagian bawah
- Tambahkan pemegang motor bahu.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Joint1_v2.mp4"
      type="video/mp4"
    />
  

### Gabungan 2

- Pasang kedua klakson motor. Kencangkan klakson atas dengan sekrup M3x6mm. Klakson bawah tidak memerlukan sekrup.
- Geser motor kedua dari atas ke dalam.
- Kencangkan motor kedua dengan 4 sekrup M2x6mm.
- Pasang lengan atas dengan 4 sekrup M3x6mm di setiap sisi.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Joint2_v2.mp4"
      type="video/mp4"
    />
  

### Ganda 3

- Pasang kedua klakson motor. Kencangkan klakson atas dengan sekrup M3x6mm. Klakson bawah tidak memerlukan sekrup.
- Pasang motor 3 dan kencangkan menggunakan 4 sekrup M2x6mm.
- Hubungkan lengan bawah ke motor 3 menggunakan 4 sekrup M3x6mm di setiap sisi.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Joint3_v2.mp4"
      type="video/mp4"
    />
  

### Ganda 4

- Pasang kedua klakson motor. Kencangkan klakson atas dengan sekrup M3x6mm. Klakson bawah tidak memerlukan sekrup.
- Geser penyangga motor 4.
- Geser ke motor 4.
- Kencangkan motor 4 dengan 4 sekrup M2x6mm.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Joint4_v2.mp4"
      type="video/mp4"
    />
  

### Gabungan 5

- Masukkan motor 5 ke dalam penahan pergelangan tangan dan amankan dengan 2 sekrup depan M2x6mm.
- Pasang hanya satu motor horn pada motor pergelangan tangan dan kencangkan dengan sekrup horn M3x6mm.
- Amankan pergelangan tangan ke motor 4 menggunakan 4 sekrup M3x6mm di kedua sisi.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Joint5_v2.mp4"
      type="video/mp4"
    />
  

### Gripper / Pegangan

- Pasang gripper pada motor 5, lalu pasang ke motor horn di pergelangan tangan menggunakan 4 sekrup M3x6mm.
- Masukkan motor gripper dan amankan dengan 2 sekrup M2x6mm di setiap sisi.
- Pasang kedua motor horns pada gripper motor. Kencangkan horn atas dengan sekrup M3x6mm; tidak diperlukan sekrup untuk horn bawah.
- Pasang cakar gripper dan amankan dengan 4 sekrup M3x6mm di kedua sisi.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Gripper_v2.mp4"
      type="video/mp4"
    />
  

- Pasang pemegang pemimpin ke pergelangan tangan dan amankan dengan 4 sekrup M3x6mm.
- Lampirkan gagang ke pemegang pemimpin menggunakan 1 sekrup M2x6mm.
- Masukkan motor gripper, amankan dengan 2 sekrup M2x6mm di setiap sisi, dan pasang motor horn menggunakan sekrup horn M3x6mm.
- Pasang pemicu pengikut dengan 4 sekrup M3x6mm.

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/Leader_v2.mp4"
      type="video/mp4"
    />
  

## Kalibrasi

Selanjutnya, Anda perlu melakukan kalibrasi pada robot Anda untuk memastikan bahwa lengan pemimpin dan pengikut memiliki nilai posisi yang sama ketika berada pada posisi fisik yang sama. Proses kalibrasi sangat penting karena memungkinkan jaringan saraf yang dilatih pada satu robot untuk berfungsi pada robot lain.

#### Pengikut

Jalankan perintah atau contoh API berikut untuk mengkalibrasi lengan pengikut:

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

```python
from lerobot.robots.so_follower import SO101FollowerConfig, SO101Follower

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

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

Video di bawah ini menunjukkan cara melakukan kalibrasi. Pertama, Anda perlu memindahkan robot ke posisi di mana semua sendi berada di tengah rentang geraknya. Kemudian, setelah menekan enter, Anda harus menggerakkan setiap sendi melalui seluruh rentang geraknya.

##### Video kalibrasi

  
    <source
      src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibrate_so101_2.mp4"
      type="video/mp4"
    />
  

#### Pemimpin

Lakukan langkah yang sama untuk mengkalibrasi lengan pemimpin, jalankan perintah atau contoh API berikut:

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

```python
from lerobot.teleoperators.so_leader import SO101LeaderConfig, SO101Leader

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

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

Selamat 🎉, robot Anda sudah siap untuk belajar tugas secara mandiri. Mulai melatihnya dengan mengikuti tutorial ini: [Mulai dengan robot dunia nyata](./il_robots)

> [!TIP]
> Jika Anda memiliki pertanyaan atau membutuhkan bantuan, silakan hubungi kami di [Discord](https://discord.com/invite/s3KuuzsPFb).

