# YAM

[YAM](https://doc.i2rt.com/products/yam), [I2RT Robotics](https://i2rt.com/) tarafından taklit öğrenme ve somut yapay zeka için geliştirilmiş 6-DOF bir koldur. LeRobot'ta `yam_follower`, lineer DM4310 gripper'a sahip tek bir standart YAM v1 kolunu sürerken, `bi_yam_follower` iki kol sürer. Bunları `lerobot-calibrate`, `lerobot-rollout` ve `lerobot-replay` ile kullanın. LeRobot'ta henüz bir YAM lider kol bulunmadığından, bir YAM bir politika tarafından veya bir veri setinin yeniden oynatılmasıyla sürülür.

Kolları birleştirip I2RT'nin kılavuzlarıyla bağlantılarını yapın; bu sayfa LeRobot tarafını kapsar.

| Kılavuz                                                           | Kapsamı                                  |
| --------------------------------------------------------------- | ----------------------------------------------- |
| [YAM Arm Serisi](https://doc.i2rt.com/products/yam)             | Kutu açma, montaj, kablo bağlantıları, motorlar ve kavrama kolları |
| [Yazılım kurulumu](https://doc.i2rt.com/getting-started/sw-setup) | CAN adaptörleri, bit hızı ve sabit arayüz adları |
| [YAM Hücresi](https://doc.i2rt.com/products/yam-cell)              | İki takipçi ve iki lider içeren iki elle istasyon |

  <img
    src="https://doc.i2rt.com/images/yam-standard/YAM-ST-GP-1.webp"
    alt="YAM follower arm with the linear gripper"
    width="48%"
  />
  <img
    src="https://doc.i2rt.com/images/yam-station/DS-ST-1.webp"
    alt="YAM Cell bimanual station"
    width="48%"
  />

_YAM takipçi (sol) ve YAM Hücre iki elle istasyon (sağ). LeRobot takipçileri sürer. Görseller I2RT Robotics tarafından sağlanmıştır._

## Donanım ve güvenlik

Her kolun, 1'den 7'ye kadar kimlik numaralarına sahip yedi motoru vardır: 1'den 3'e kadar olan eklem için DM4340, 4'ten 6'ya kadar olan eklem ve kavrama için DM4310. YAM Pro, Ultra, BIG YAM ve diğer kavramalar henüz desteklenmemektedir.

Şunlara ihtiyacınız var:

- Linux ve her kol için bir USB-CAN adaptörü (SocketCAN, klasik CAN, 1 Mbit/s).
- Her motorun CAN zaman aşımı en fazla 400 ms olacak şekilde (`8000` tik, I2RT'nin değeri) ayarlanır, örneğin [I2RT SDK](https://github.com/i2rt-robotics/i2rt)'sındaki `set_timeout.py --timeout` ile. Zaman aşımı, LeRobot komut göndermeyi durdurursa son güvenlik önlemidir; bu nedenle LeRobot, zaman aşımı olmadan torku etkinleştirmez.
- İlk bağlantıda internet erişimi: yerçekimi telafisi, YAM modelini [`lerobot/robot-urdfs`](https://huggingface.co/buckets/lerobot/robot-urdfs/tree/yam/v1) kovasından indirir ve `HF_LEROBOT_HOME/robot-urdfs/yam/v1` altında önbelleğe alır.

> [!WARNING]
> Boltu sağlam bir yüzeye sabitleyin ve çalışma alanını boş tutun. Bağlantı kesildiğinde tork devre dışı kalır ve kol yerçekimi etkisiyle düşer: önce destekleyin. Çalışma sırasında güç veya CAN adaptörü bağlantısı kesilirse, programı durdurun, kolu destekleyin ve ardından yeniden bağlayın.

## LeRobot 🤗'u Yükle

[Yükleme Kılavuzu](./installation)'nu izleyin, ardından YAM desteğini yükleyin:

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

Bu komut, kol için `motorbridge` ve `python-can`, yerçekimi telafisi için ise `placo` paketlerini yükler.

## Donanımı bağlayın

Her kolun kendi CAN arayüzüne ihtiyacı vardır, çünkü her iki kol da aynı motor kimliklerini kullanır.

```bash
lerobot-setup-can --mode=setup --interfaces=can0 --use_fd=false
```

İki kol için `--interfaces=can0,can1` kullanın. Komut, Linux arayüzlerini `sudo ip link` ile yapılandırır ve motor komutu göndermez. İki kol kullanıldığında, yeniden başlatma sonrası `can0` ve `can1` yer değiştirebilir: her bir arayüzün hangi kolu sürdüğünü kontrol edin veya I2RT'nin [yazılım kurulumu](https://doc.i2rt.com/getting-started/sw-setup) ile `can_follower_l` gibi sabit adlar verin ve bu adları port olarak kullanın.

## Cihaz türleri

| Tür              | Cihaz            |
| ----------------- | ----------------- |
| `yam_follower`    | Tek takipçi   |
| `bi_yam_follower` | İki ellilik takipçi |

İki kolla, her kolun seçeneklerini `--robot.left_arm_config.<option>` ve `--robot.right_arm_config.<option>` ile ayarlayın.

## Kalibrasyon

Kalibrasyon yalnızca kavrayıcının sınırlarını ölçer: tamamen kapalı ve tamamen açık konumlar; eklem fabrika sıfırlarını korur. Aşağıda gösterildiği gibi önce kolu katlayın. Ölçüm sırasında tork kapalıdır: kolu destekleyin, yalnızca kavrayıcıyı elle hareket ettirin ve her istemde Enter tuşuna basın. Zaten bir kalibrasyon varsa, bağlantı kontrolü başlatır: yeniden kullanmak için Enter'a basın veya yeniden ölçmek için `c` yazın; LeRobot, torku kapatmadan önce kolu desteklemenizi ister.

  <img
    src="https://doc.i2rt.com/images/yam-standard/YAM-ST-GP-2.webp"
    alt="YAM arm in its folded position"
    width="48%"
  />
  <img
    src="https://doc.i2rt.com/images/linear-gripper-4310/GP-4310-CTR-1.webp"
    alt="Linear DM4310 gripper"
    width="48%"
  />

_Katlanmış konum, tüm eklem sıfırda (sol) ve doğrusal DM4310 kavrayıcı (sağ). Görseller I2RT Robotics tarafından sağlanmıştır._

```bash
lerobot-calibrate --robot.type=yam_follower --robot.port=can0 --robot.id=yam
```

Sol kavrama ilk ölçülür, ardından sağ kavrama ölçülür ve sonuçlar `<id>_left` ve `<id>_right` dosyalarına yazılır.

```bash
lerobot-calibrate --robot.type=bi_yam_follower --robot.id=bimanual_yam \
  --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1
```

Daha sonraki komutlarda aynı `--robot.id` değerini kullanın, böylece LeRobot kaydedilen dosyayı yükler.

## Gözlemler ve eylemler

Bir kol, hem gözlemler hem de eylemler için `joint_1.pos` ile `joint_6.pos` arasında, ardından `gripper.pos` değerlerini içerir. Eklem açıları derece cinsinden mutlak açılardır ve kavrayıcı 0 (kapalı) ile 100 (açık) arasında değişir. `use_degrees=false` parametresi, I2RT ve MolmoAct2 verilerinin kullandığı gibi radyan ve 0 ile 1 aralığına geçer. `use_velocity_and_torque=true` parametresi `.vel` ve `.torque` gözlemlerini ekler. Eylemler, eklemlerin sınırlarına kırpılmış mutlak eklemler hedefleridir.

İki kol, `left_` ve `right_` önekleriyle aynı adları kullanır. Bir kola yerleştirilen kameralar da öneklenirken, üst düzey `--robot.cameras` adlarını korur.

## Bir politika çalıştırın

Bağlantıyı kurmadan önce kolu, tüm eklem sıfırda olacak şekilde katlanmış konumuna getirin: LeRobot, her eklem bu konumdan 11,5° içinde olup olmadığını kontrol eder ve ardından kontrolü ölçülen konumdan başlatır. Politika bir eylem gönderene kadar hiçbir şey hareket etmez.

```bash
lerobot-rollout \
  --robot.type=yam_follower --robot.port=can0 --robot.id=yam \
  --robot.cameras='{"wrist": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
  --policy.path=<user>/<policy> \
  --task="Pick up the cube"
```

İki kol için `--robot.type=bi_yam_follower --robot.id=bimanual_yam --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1` kullanın. Rollout'u kaydetmek için `--dataset.repo_id=<user>/rollout_<name>` ekleyin; bkz. [Çıkarım çalıştırın ve politikanızı değerlendirin](./il_robots#run-inference-and-evaluate-your-policy). `lerobot-replay`, kaydedilmiş bir bölümü aynı `--robot.*` seçenekleriyle yeniden oynatır.

İlk eylemden önce ve `command_timeout_s` (1 sn) boyunca hiçbir eylem gelmediğinde kol konumunu korur. `idle_mode=float` kullanıldığında eklemeler yerine yerçekimi telafisi yapılır ve hafif sönümleme uygulanır; böylece kolu elle hareket ettirebilirsiniz, bu sırada kavrayıcı açılışını korur; takip, kolu nereye taşıdığınızdan devam eder.

## Güvenlik

- Bir motor arızası veya eksik geri bildirim tüm komutları durdurur. İki kolu olan sistemlerde, herhangi birinde oluşan arıza her iki kolun da durmasına neden olur. Devam etmek için bağlantıyı kesip yeniden bağlayın.
- Ağırlık modeli, kamerasız veya yük taşıyıcısız standart kolu kapsar. Bunlardan herhangi birini ekledikten sonra, kolun float modunda sapma göstermediğinden emin olun ve sapma varsa `gravity_factors` değerini ayarlayın.

## Yapılandırma seçenekleri

| Seçenek                    | Varsayılan                          | Açıklama                                                |
| ------------------------- | -------------------------------- | ---------------------------------------------------------- |
| `port`                    | zorunlu                         | Örneğin `can0` olan SocketCAN arayüzü                    |
| `use_degrees`             | `true`                           | Derece ve 0–100 aralığında bir kavrama; `false` radyan ve 0–1 aralığını verir |
| `use_velocity_and_torque` | `false`                          | `.vel` ve `.torque` gözlemlerini ekleyin                      |
| `idle_mode`               | `hold`                           | Eylem gelmediğinde pozisyonu `hold` (tut) veya `float` (yüzdür)      |
| `command_timeout_s`       | `1.0`                            | Boşta kalma moduna geçmeden önce eylemsiz geçen saniyeler             |
| `initial_position_deg`    | tümü sıfır                        | Gerekli başlangıç konumu; `None` kontrolü atlar          |
| `initial_tolerance_deg`   | `11.5`                           | Başlangıç konumundan izin verilen mesafe                 |
| `gripper_force_limit_n`   | `50.0`                           | Kavrayıcı bir nesne üzerinde kilitlendiğinde parmak kuvveti      |
| `gravity_factors`         | `[1.0, 1.1, 1.1, 1.2, 1.0, 1.0]` | Ağırlık telafisinin ek başına çarpanları          |
| `cameras`                 | `{}`                             | Kolun üzerine takılan kameralar                                |

## Örnek: MolmoAct2

[`lerobot/MolmoAct2-BimanualYAM-LeRobot`](https://huggingface.co/lerobot/MolmoAct2-BimanualYAM-LeRobot), `allenai/MolmoAct2-BimanualYAM`'in LeRobot biçimindeki versiyonudur ve yayınlanan normalizasyon istatistiklerini içerir. Radyan biriminde ve 0–1 aralığında gripper ile, sırasıyla üst, sol ve sağ olmak üzere üç kamerayla iki YAM kolunda eğitilmiştir; bkz. [MolmoAct2](./molmoact2).

```bash
pip install -e ".[yam,molmoact2,dataset]"

lerobot-rollout \
  --robot.type=bi_yam_follower --robot.id=bimanual_yam \
  --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1 \
  --robot.left_arm_config.use_degrees=false --robot.right_arm_config.use_degrees=false \
  --robot.cameras='{
    "top": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/TOP_CAMERA", "width": 640, "height": 480, "fps": 30},
    "left": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/LEFT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"},
    "right": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/RIGHT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"}
  }' \
  --policy.path=lerobot/MolmoAct2-BimanualYAM-LeRobot \
  --inference.type=rtc --inference.rtc.execution_horizon=20 --inference.queue_threshold=20 \
  --device=cuda --interpolation_multiplier=2 \
  --interactive=true --play_sounds=false \
  --task="Pick up the red block and place it in the green bin"
```

`/start` yazarak politikayı çalıştırın, `/subtask <text>` yazarak talimatı değiştirin, `/reset` yazarak başlangıç konumuna dönün ve `/stop` yazarak çıkın. Dönüş sabit bir süre sürer ve YAM'ın hız sınırı hâlâ geçerlidir, bu nedenle başlangıç konumundan uzakta olan bir kol, hedefe ulaşmadan durabilir.

Float modu, politikayı herhangi bir konumdan başlatmanıza olanak tanır: `--robot.left_arm_config.idle_mode=float --robot.right_arm_config.idle_mode=float` ekleyin. İlk `/start` komutundan önce ve bir `/reset` komutu tamamlandıktan 1 sn sonra, kolları istediğiniz yere elle taşıyın ve oradan politikayı çalıştırmak için `/start` yazın. Bunun için `/stop` komutunu kullanmayın: bu komut oturumu sonlandırır ve torku devre dışı bırakır.

## Sorun Giderme

| Sorun                                         | Kontrol                                                                                                        |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| CAN arayüzü eksik veya devre dışı            | Adaptörün güç ve USB kablosunu kontrol edin ve `ip link show` komutunu çalıştırın. `lerobot-setup-can` komutunu tekrar çalıştırın.                  |
| `missing or stale motor feedback`               | 24 V güç beslemesini, CAN kablolamasını ve sonlandırmayı, 1'den 7'ye kadar motor kimliklerini ve `port`'un bu kolun arayüzü olduğunu kontrol edin. |
| Yanlış kol hareket ediyor                             | Her arayüzün hangi kola sürdüğünü kontrol edin veya arayüzlere sabit adlar verin.                                   |
| `unsafe motor CAN timeout`                      | I2RT SDK ile her motorun CAN zaman aşımını en fazla 400 ms olarak ayarlayın.                                           |
| `not within initial_tolerance_deg`              | Bağlantıyı yapmadan önce, tüm eklem sıfırda olacak şekilde kolu katlayın.                                                   |
| Bağlantı kurma işlemi, yeniden kalibrasyon yapmanızı ister          | Kalibrasyon sırasında kullanılan `--robot.id` değerini kullanın.                                                             |
| Kol, yüzen modda sürüklenir                    | Kamera veya koldaki yük için `gravity_factors` değerini ayarlayın.                                              |
| MolmoAct2 kolları yanlış konumlara hareket ettirir | Her iki kolda da `use_degrees=false` ayarlayın: model radyan ve 0–1 aralığında bir kavrama kullanır.                              |

## Referanslar

- [YAM Arm Serisi](https://doc.i2rt.com/products/yam): donanım, motorlar ve kavrayıcılar
- [Yazılım kurulumu](https://doc.i2rt.com/getting-started/sw-setup): CAN bit hızı ve sabit arayüz adları
- [YAM Cell](https://doc.i2rt.com/products/yam-cell): iki elle istasyon
- [I2RT SDK](https://github.com/i2rt-robotics/i2rt): motor araçları, URDF ve MuJoCo modeli
- [YAM ürün sayfası](https://i2rt.com/products/yam-6-dof-arm)
- [MolmoAct2](./molmoact2): LeRobot'ta politika yükleme

