# 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%"
  />

Aşağıdaki adımlarda, amiral gemisi robotumuz olan SO-101'in nasıl monte edileceğini açıklıyoruz.

## Parçaları temin edin

Bu [README](https://github.com/TheRobotStudio/SO-ARM100) dosyasını takip edin. Parçaların temin edileceği bağlantıyı içeren malzeme listesini ve parçaların 3D baskı talimatlarını içerir. Ayrıca, ilk kez baskı yapıyorsanız veya bir 3D yazıcınız yoksa size öneriler sunar.

## LeRobot 🤗'u Yükle

LeRobot'u yüklemek için [Yükleme Kılavuzumuza](./installation) göz atın

Bu talimatların yanı sıra Feetech SDK'sını da kurmanız gerekir (LeRobot'u PyPI'den kurduysanız bunun yerine `pip install 'lerobot[feetech]'` komutunu çalıştırın):

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

## Adım Adım Montaj Talimatları

Takipçi kol, 1/345 oranlı 6 adet STS3215 motor kullanır. Lider kol ise, kendi ağırlığını taşıyabilmesi ve çok fazla kuvvet gerektirmeden hareket ettirilebilmesi için üç farklı dişli oranına sahip motor kullanır. Hangi eklem için hangi motorun gerektiği aşağıdaki tabloda gösterilmektedir.

| Lider-Kol Ekseni     | Motor | Dişli Oranı |
| ------------------- | :---: | :--------: |
| Taban / Omuz Pan |   1   |  1 / 191   |
| Omuz Kaldırma       |   2   |  1 / 345   |
| Dirsek Bükme          |   3   |  1 / 191   |
| Bilek Esneme          |   4   |  1 / 147   |
| Bilek Döndürme          |   5   |  1 / 147   |
| Gripper             |   6   |  1 / 147   |

## Motorları yapılandırın

### 1. Her kolun ilişkili olduğu USB portlarını bulun

Her bus servo adaptörü için portu bulmak için MotorBus'ü USB ve güç üzerinden bilgisayarınıza bağlayın. Aşağıdaki betiği çalıştırın ve istendiğinde MotorBus'ü ayırın:

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

Örnek çıktı:

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

Bulunan port: `/dev/tty.usbmodem575E0032081`, lider veya takipçi kolunuza karşılık gelir.

Linux'ta, USB portlarına erişim vermek için şunu çalıştırmanız gerekebilir:

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

Örnek çıktı:

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

Bulunan port: `/dev/ttyACM1`, lider veya takipçi kolunuza karşılık gelir.

### 2. Motor kimliklerini ve baud oranlarını ayarlayın

Her motor, bus üzerinde benzersiz bir id ile tanımlanır. Sıfır kilometre motorlar genellikle `1` varsayılan id ile gelir. Motorlar ile denetleyici arasındaki iletişimin düzgün çalışması için önce her motora benzersiz, farklı bir id atamamız gerekir. Ayrıca, bus üzerinden veri iletim hızı baudrate ile belirlenir. Birbirleriyle iletişim kurabilmeleri için denetleyici ve tüm motorların aynı baudrate ile yapılandırılması gerekir.

Bu amaçla, önce bu ayarları yapmak için kontrolcü üzerinden her bir motora ayrı ayrı bağlanmamız gerekiyor. Bu parametreleri motorların dahili belleğinin (EEPROM) kalıcı bölümüne yazacağımız için, bunu yalnızca bir kez yapmamız yeterli olacaktır.

Başka bir robottan motorları yeniden kullanıyorsanız, kimlikler ve baudrate muhtemelen eşleşmeyeceği için bu adımı da gerçekleştirmeniz gerekecektir.

Aşağıdaki video, motor kimliklerini ayarlama adımlarının sırasını göstermektedir.

##### Motor kurulumu videosu

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

#### Takipçi

Bilgisayarınızdan ve güç kaynağından gelen USB kablosunu takip kolunun kontrol kartına bağlayın. Ardından, önceki adımda aldığınız portu kullanarak aşağıdaki komutu çalıştırın veya API örneğini çalıştırın. Takip kolunuza `id` parametresiyle bir ad da vermeniz gerekecektir.

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

Aşağıdaki talimatı görmelisiniz

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

Talimatlar doğrultusunda, kavrayıcının motorunu takın. Panoya bağlı tek motorun bu olduğundan ve motorun henüz başka bir motora daisy-chain (sıralı) olarak bağlanmadığından emin olun. `[Enter]` tuşuna bastığınızda, betik o motorun id'sini ve baudrate değerini otomatik olarak ayarlayacaktır.

Sorun Giderme

Bu noktada bir hata alırsanız, kablolarınızı kontrol edin ve doğru şekilde takıldıklarından emin olun:

  Bilgisayarınız ile kontrol kartı arasındaki güç kaynağı USB kablosu Kontrol kartından motora giden 3 pinli kablo

Waveshare kontrol kartı kullanıyorsanız, iki jumper'ın `B` kanalında (USB) olduğundan emin olun.

Ardından aşağıdaki mesajı görmelisiniz:

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

Bunu bir sonraki talimat izler:

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

3 pinli kabloyu kontrol kartından çıkarabilirsiniz, ancak diğer ucundaki gripper motoruna bağlı bırakabilirsiniz, çünkü zaten doğru yerdedir. Şimdi, başka bir 3 pinli kabloyu bilek yuvarlama motoruna takın ve kontrol kartına bağlayın. Önceki motorda olduğu gibi, kartın yalnızca bu motora bağlı olduğundan ve motorun kendisinin başka hiçbir motora bağlı olmadığından emin olun.

Talimatlar doğrultusunda işlemi her motor için tekrarlayın.

> [!TIP]
> Enter tuşuna basmadan önce her adımda kablajınızı kontrol edin. Örneğin, anakartı manipüle ederken güç kablosu bağlantısı kopabilir.

İşiniz bittiğinde betik basitçe sona erer ve bu noktada motorlar kullanıma hazır hale gelir. Artık her motorun 3 pinli kablosunu bir sonraki motora, ilk motorun (id=1 olan 'omuz pan') kablosunu ise kontrol kartına takabilirsiniz; bu kart artık kolun tabanına bağlanabilir.

#### Lider

Lider kol için aynı adımları uygulayın.

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

### Temiz Parçalar

3D yazdırılmış parçalardan tüm destek malzemesini kaldırın. Bunu yapmanın en kolay yolu, destek malzemesinin altına küçük bir tornavida sokmaktır.

Montajı devam ettirmeden önce, motorun içine yerleştirildikten sonra bir adet 3 pinli kablo takılması önerilir.

### Birleşik 1

- Her iki motor kornasını da takın. Üst kornayı bir M3x6mm vida ile sabitleyin. Alt korna için vida gerekmez.
- İlk motoru tabana yerleştirin.
- Motoru 4 adet M2x6mm vida ile sabitleyin (en küçük vidalar). İki tanesini üstten, iki tanesini alttan takın.
- İlk motor tutucusunu kaydırın ve her iki taraftan birer adet olmak üzere iki M2x6mm vida ile sıkıştırın.
- Omuz kısmını takın.
- Omuz kısmını üstte 4 adet M3x6mm ve altta 4 adet M3x6mm vida ile sıkın
- Omuz motor tutucusunu ekleyin.

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

### Birleşik 2

- Her iki motor kornasını da takın. Üst kornayı bir M3x6mm vida ile sabitleyin. Alt korna için vida gerekmez.
- İkinci motoru üstten içeri kaydırın.
- İkinci motoru 4 adet M2x6mm vida ile sabitleyin.
- Üst kolu her iki tarafta 4 adet M3x6mm vida ile sabitleyin.

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

### Birleşik 3

- Her iki motor kornasını da takın. Üst kornayı bir M3x6mm vida ile sabitleyin. Alt korna için vida gerekmez.
- Motor 3'ü takın ve 4 adet M2x6mm vida ile sıkın.
- Ön kolu her iki tarafta 4 adet M3x6mm vida kullanarak motor 3'e bağlayın.

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

### Birleşik 4

- Her iki motor kornasını da takın. Üst kornayı bir M3x6mm vida ile sabitleyin. Alt korna için vida gerekmez.
- Kayar motor tutucu 4.
- Motor 4'te kaydırma.
- Motor 4'ü 4 adet M2x6mm vida ile sıkıca sabitleyin.

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

### Birleşik 5

- Motor 5'i bilek tutucusuna yerleştirin ve 2 adet M2x6mm ön vida ile sabitleyin.
- Sadece bilek motoruna bir motor kornası takın ve M3x6mm korna vidasıyla sabitleyin.
- Bileği, her iki tarafta 4 adet M3x6mm vida kullanarak motor 4'e sabitleyin.

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

### Kavrama / Kulp

- Gripper'i 5 numaralı motora, bilekteki motor boynuna 4 adet M3x6mm vida kullanarak bağlayın.
- Gripper motorunu yerleştirin ve her iki tarafta 2 adet M2x6mm vida ile sabitleyin.
- Her iki motor kornasını da gripper motoruna takın. Üst kornayı M3x6mm vida ile sabitleyin; alt korna için vida gerekmez.
- Gripper pençesini takın ve her iki tarafta 4 adet M3x6mm vida ile sabitleyin.

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

- Lider tutucuyu bileğe monte edin ve 4 adet M3x6mm vida ile sabitleyin.
- Kolu, 1 adet M2x6mm vida kullanarak lider tutucuya sabitleyin.
- Gripper motorunu yerleştir, her iki tarafta 2 adet M2x6mm vida ile sabitle, bir M3x6mm korn vidası kullanarak bir motor kornu tak.
- Takipçi tetiğini 4 adet M3x6mm vida ile sabitleyin.

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

## Kalibre

Ardından, lider ve takipçi kollarının aynı fiziksel konumda olduklarında aynı konum değerlerine sahip olmasını sağlamak için robotunuzu kalibre etmeniz gerekecektir. Kalibrasyon süreci, bir robot üzerinde eğitilen bir sinir ağının başka bir robot üzerinde de çalışabilmesini sağladığı için çok önemlidir.

#### Takipçi

Takipçi kolunu kalibre etmek için aşağıdaki komutu veya API örneğini çalıştırın:

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

Aşağıdaki video, kalibrasyonun nasıl yapılacağını göstermektedir. Öncelikle robotun, tüm eklemlerin hareket aralıklarının ortasında olduğu konuma taşınması gerekir. Ardından Enter tuşuna bastıktan sonra her bir eklemin tam hareket aralığı boyunca hareket ettirilmesi gerekir.

##### Kalibrasyon videosu

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

#### Lider

Lider kolu kalibre etmek için aynı adımları izleyin, aşağıdaki komutu veya API örneğini çalıştırın:

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

Tebrikler 🎉, robotunuz kendi başına bir görev öğrenmeye hazır. Eğitimine bu öğreticiyi izleyerek başlayın: [Gerçek dünya robotlarıyla başlangıç](./il_robots)

> [!TIP]
> Herhangi bir sorunuz varsa veya yardıma ihtiyacınız varsa, lütfen [Discord](https://discord.com/invite/s3KuuzsPFb) üzerinden bize ulaşın.

