# İnsan-Döngüde Veri Toplama

İnsan-Döngüde (HIL) veri toplama, bir insan operatörün izleme yaptığı ve gerektiğinde müdahale ettiği gerçek bir robot üzerinde eğitim almış bir politikayı dağıtarak onu iyileştirmenizi sağlar. Müdahale verileri (kurtarma hareketleri ve düzeltmeler), otonom bölümlerle birlikte kaydedilir ve politikaya hataları nasıl ele alacağını öğreten daha zengin bir eğitim veri seti oluşturulur.

---

## Neden İnsan-Döngüde (Human-In-the-Loop)?

Standart davranış klonlama, politikaları yalnızca başarılı gösterimler üzerinde eğitir. Dağıtım sırasında küçük hatalar birikebilir ve robotu eğitim sırasında hiç görülmemiş durumlara sürükleyebilir (dağılım kayması). HIL veri toplama, bunu şu şekilde ele alır:

- Eğitilen politikayı gerçek robot üzerinde çalıştırma
- Robotun başarısız olmaya yaklaştığı anda bir insanın devreye girmesi
- İnsanın kurtarma ve düzeltme sürecinin eğitim verisi olarak kaydedilmesi
- Birleşik veri kümesinde politikanın ince ayarı

Bu, yalnızca görevi nasıl gerçekleştireceğini değil, işler ters gittiğinde nasıl toparlanacağını da bilen bir politika üretir.

---

## Nasıl Çalışır

Bir HIL oturumu sırasında, insan operatör her bölümde şu döngüyü izler:

1. **İzle** politikayı otonom olarak çalışırken
2. **Duraklat** başarısızlık kaçınılmaz olduğunda, robot konumunu korur
3. **Kontrolü ele alın** ve robotu iyi bir duruma geri döndürmek için (kurtarma) teleoperasyon yapın, ardından davranışı düzeltin
4. **Kontrolü politika (policy)ya geri ver**, politika otonom çalışmayı sürdürür
5. Olay sırasında adım 2–4'ü gerektiği kadar tekrarlayın
6. Görev tamamlandığında **epizodu sonlandırın**, kaydedin ve sonraki rollout'a geçin

Varsayılan olarak yalnızca insan kontrolündeki segmentler (kurtarma ve düzeltme) kaydedilir ve her düzeltme kendi başına bir epizot oluşturur. `--strategy.record_autonomous=true` ile otonom segmentler de kaydedilir: politika ve insan birden fazla kez kontrolü devralabilir ve otonom yürütme, kurtarma ile düzeltme tek bir kesintisiz yörüngede yakalanır. Her iki modda da robot, her devir teslimden sonra mevcut durumundan devam eder (müdahale gerçekleştiği için sıfırlama gerekmez). Toplama işleminden sonra, birleşik veri seti (orijinal gösterimler + HIL verisi) politikanın ince ayarı için kullanılır.

Bu süreç yinelemeli olarak tekrarlanabilir: dağıt, topla, ince ayar yap, tekrarla. Her tur, mevcut politikanın başarısızlık modlarını hedefler.

```
┌─────────────────────────────────────────────────────────────────────────┐
│  Policy v0 (trained on demos)                                           │
│       ↓                                                                 │
│  HIL Collection (target current failure modes) → Fine-tune → Policy v1  │
│       ↓                                                                 │
│  HIL Collection (target new failure modes) → Fine-tune → Policy v2      │
│       ↓                                                                 │
│  ... (repeat until satisfactory performance)                            │
└─────────────────────────────────────────────────────────────────────────┘
```

---

## Donanım Gereksinimleri

### Teleoperatör Gereksinimleri

`lerobot-rollout --strategy.type=dagger` modu, aşağıdakileri yapabilecek **aktif motorlara sahip teleoperatörler** gerektirir:

- Torku programatik olarak etkinleştirme/devre dışı bırakma
- Hedef konumlara geç (durdurma sırasında robot durumunu yansıtmak için)

Duraklattığınızda, lider kol robotla eşleşmek üzere hareket eder; böylece kontrol, politika ile insan arasında sıçramalar olmadan el değiştirir. Sıçramalar, kaydedilen düzeltmelere yansıyacak ve politikanın sarsak yörüngeler öğrenmesine neden olacaktır.

**Uyumlu teleoperatörler:**

- `bi_openarm_mini` - İki Ellli OpenArm Mini
- `so100_leader` / `so101_leader` - SO100 / SO101 lider kol
- `bi_so_leader` - İki kollu SO100 / SO101 lider kollar

> [!IMPORTANT]
> Sağlanan komutlar varsayılan olarak `bi_openarm_follower` + `bi_openarm_mini` kullanır. SO100 / SO101 kurulumları aynı şekilde çalışır, örneğin `--robot.type=so101_follower` ile `--teleop.type=so101_leader`.

---

## Betik

HIL veri toplama için `lerobot-rollout` aracını `--strategy.type=dagger` ile kullanın. Çıkarım arka ucunu `--inference.type=sync|rtc|remote` ile seçin:

| Mod                     | Bayrak                      | Modeller                                                                                                 |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------ |
| Standart (varsayılan)       | _(bayrak gerekmez)_        | ACT, Diffusion Policy                                                                                  |
| Gerçek Zamanlı Parçalama (RTC) | `--inference.type=rtc`    | Pi0, Pi0.5, SmolVLA                                                                                    |
| Uzak                   | `--inference.type=remote` | `lerobot-policy-server` tarafından sunulan checkpoint; bkz. [uzaktan dağıtım gereksinimleri](./remote_inference) |

---

## Adım Adım Kılavuz

### Adım 1: Temel Bir Politika Ön Eğitimi

Öncelikle, gösterim veri setiniz üzerinde bir politika eğitin. Bu örnek, 2. adımda standart çıkarım ile çalışan ACT'yi eğitir:

```bash
lerobot-train \
    --dataset.repo_id=${HF_USER}/demo-dataset \
    --policy.type=act \
    --policy.repo_id=${HF_USER}/act_pretrain \
    --output_dir=outputs/pretrain \
    --batch_size=32 \
    --steps=50000
```

### Adım 2: HIL Verisi Toplayın

**Standart çıkarım (ACT, Diffusion Policy):**

```bash
lerobot-rollout --strategy.type=dagger \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can1 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can0 \
    --robot.right_arm_config.side=right \
    --robot.cameras='{left_wrist: {type: opencv, index_or_path: "/dev/video0", width: 1280, height: 720, fps: 30}, right_wrist: {type: opencv, index_or_path: "/dev/video4", width: 1280, height: 720, fps: 30}, base: {type: opencv, index_or_path: "/dev/video2", width: 640, height: 480, fps: 30}}' \
    --teleop.type=bi_openarm_mini \
    --teleop.left_arm_config.port=/dev/ttyACM0 \
    --teleop.right_arm_config.port=/dev/ttyACM1 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --dataset.repo_id=${HF_USER}/rollout_hil_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=2
```

`--interpolation_multiplier=N` ile robot, politika eylemi başına `N` ara değerli komut alır (kontrol `fps × N` Hz'de çalışır) ancak politika çıkarımı ve veri seti kaydı `--fps` değerinde kalır; böylece kaydedilen veri seti, beyan edilen FPS değeriyle eşleşir.

**Büyük modeller için RTC (Pi0, Pi0.5, SmolVLA):**

Yüksek çıkarım gecikmesine sahip modeller için akıcı bir çalışma sağlamak üzere RTC'yi etkinleştirin. Bunun için, 1. adımdaki ACT politikası yerine Pi0, Pi0.5 veya SmolVLA gibi bir VLA taban politikası gereklidir:

```bash
lerobot-rollout --strategy.type=dagger \
    --inference.type=rtc \
    --inference.rtc.execution_horizon=20 \
    --inference.rtc.max_guidance_weight=5.0 \
    --inference.rtc.prefix_attention_schedule=LINEAR \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can1 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can0 \
    --robot.right_arm_config.side=right \
    --robot.cameras='{left_wrist: {type: opencv, index_or_path: "/dev/video0", width: 1280, height: 720, fps: 30}, right_wrist: {type: opencv, index_or_path: "/dev/video4", width: 1280, height: 720, fps: 30}, base: {type: opencv, index_or_path: "/dev/video2", width: 640, height: 480, fps: 30}}' \
    --teleop.type=bi_openarm_mini \
    --teleop.left_arm_config.port=/dev/ttyACM0 \
    --teleop.right_arm_config.port=/dev/ttyACM1 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --dataset.repo_id=${HF_USER}/rollout_hil_rtc_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=3
```

**Kontroller:**

| Anahtar     | Eylem                                                                  |
| ------- | ----------------------------------------------------------------------- |
| `Space` | Politikayı duraklat / politikayı yeniden başlat                                    |
| `Tab`   | Düzeltmeyi başlat/durdur (yalnızca duraklatılmışken); düzeltmeler kaydedilir |
| `Enter` | Veri setini Hub'a gönder (yalnızca düzeltme modu)                     |
| `ESC`   | Oturumu durdur                                                        |

Klavye yerine USB ayak pedalı kullanılabilir; bunun için `--strategy.input_device=pedal` bayrağını kullanın. DAgger bayraklarının tamamı için [Policy Deployment](./inference) bölümüne bakın.

**HIL Protokolü:**

1. Politikanın otonom olarak çalıştığını izleyin (teleop boşta/serbest)
2. Yaklaşan bir arızayı gördüğünüzde **duraklatmak** için `Space` tuşuna basın
   - Politika durakları
   - Teleoperatör, robot konumunu eşleştirmek üzere hareket eder (tork etkin)
   - Duraklatma sırasında kaydedilen kare yok
3. Kontrolü **ele almak** için `Tab` tuşuna basın
   - Teleoperatör torku devre dışı, serbestçe hareket edebilir
   - **Kurtarma**: Robotu iyi bir duruma geri teleoperate edin
   - **Düzeltme**: Davranışı düzeltin
   - Tüm hareketler kaydedilir
4. `Tab` tuşuna tekrar basarak düzeltmeyi sonlandırın, ardından **kontrolü politika'ya geri vermek** için `Space` tuşuna basın
   - Policy, mevcut durumdan otonom çalışmayı sürdürür
   - Herhangi bir zamanda tekrar müdahale edebilirsiniz (2–4. adımları tekrarlayın)
5. Varsayılan modda her düzeltme kendi başına bir bölüm olarak kaydedilir. `--strategy.record_autonomous=true` ile her şey kaydedilir ve bölümlere otomatik olarak ayrılır
6. Oturumu durdurmak için `ESC` tuşuna basın

**Pedal Ayarları (Linux):**

USB ayak pedalı (PCsensor FootSwitch) kullanılıyorsa, erişimi sağlayın:

```bash
sudo setfacl -m u:$USER:rw /dev/input/by-id/usb-PCsensor_FootSwitch-event-kbd
```

### Adım 3: Veri Setlerini Birleştir

`lerobot-rollout`, veri seti adının başına bir zaman damgası ekler; bu nedenle 2. adımdaki HIL veri seti `your-username/rollout_hil_dataset_YYYYMMDD_HHMMSS` olarak kaydedilir. Aşağıda bu tam adı kullanın.

HIL veri seti, insan kontrolündeki kareleri işaretleyen ek bir `intervention` sütununa sahiptir ve veri setleri yalnızca aynı özelliklere sahip olduklarında birleştirilebilir. Önce sütunu kaldırın, ardından HIL verilerini gösterimlerinizle birleştirin:

```bash
lerobot-edit-dataset \
    --repo_id ${HF_USER}/rollout_hil_dataset_YYYYMMDD_HHMMSS \
    --new_repo_id ${HF_USER}/hil_dataset_no_intervention \
    --operation.type remove_feature \
    --operation.feature_names "['intervention']"

lerobot-edit-dataset \
    --new_repo_id ${HF_USER}/demo_plus_hil \
    --operation.type merge \
    --operation.repo_ids "['${HF_USER}/demo-dataset', '${HF_USER}/hil_dataset_no_intervention']"
```

Her iki veri seti de aynı robotu, kameraları ve fps değerini kullanmalıdır. Birleştirme seçenekleri hakkında daha fazla bilgi için [Veri Seti Araçlarını Kullanma](./using_dataset_tools#merge-datasets) bölümüne bakın.

### Adım 4: Policy'yi ince ayar yap

1. adımdaki politikayı **birleştirilmiş** veri setinde ince ayarlayın:

```bash
lerobot-train \
    --dataset.repo_id=${HF_USER}/demo_plus_hil \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --policy.repo_id=${HF_USER}/act_hil_finetune \
    --output_dir=outputs/hil_finetune \
    --steps=20000
```

Ardından ince ayarı yapılmış politikayı dağıtın ve kalan başarısızlık modlarını hedeflemek için 2. adımdan itibaren işlemi tekrarlayın.

---

## Etkili HIL Toplama İçin İpuçları

### Ne Zade Müdahale Edilmeli

Şu durumlarda müdahale edin:

- Tersine çevrilemez bir hata yapmaya hazırlanan robot
- Robotun tereddüt etmesi veya belirsiz davranış sergilemesi
- Beklenen yörüngeden sapan robot

### Kurtarma: İyi Bir Duruma Teleoperasyon

Kurtarma sırasında, robotu şu duruma geri teleopere edin:

- Robot, tanıdık, dağılım içi bir yapılandırmada
- Mevcut alt görev hâlâ tamamlanabilir
- Kurtarma yörüngesinin kendisi bilgilendirici eğitim verisidir

### Düzeltmelerin Kalitesi

Düzeltme sırasında:

- **güvenilir ve temiz** yörüngeler sağlayın
- Mevcut alt görevi tamamen tamamlayın
- Aşırı düzeltme yapmayın veya gereksiz hareketler eklemeyin

---

## İlgili Çalışmalar

Bu HIL veri toplama yaklaşımı, etkileşimli taklit öğrenmesindeki fikirlere dayanır:

- **DAgger** (Ross et al., 2011) temel fikri ortaya koydu: yalnızca uzman gösterimleriyle eğitim yapmak yerine, _öğrenicinin_ ziyaret ettiği durumlarda düzeltmeler için uzmana danışılır. Bu, standart davranışsal klonlamadaki bileşik hata döngüsünü, on-policy verileri iteratif olarak toplayarak kırar.

- **HG-DAgger** (Kelly et al., 2019) bunu robotik için pratik hale getirdi: insan uzman, robotu izler ve yalnızca gerektiğinde müdahale eder, her durumu etiketlemez. Otonom ve insan kontrolü arasındaki geçiş, buradaki betiklerde kullanılan duraklat → devral → politaya dön döngüsünün ta kendisidir.

- **RaC** (Hu et al., 2025), müdahaleleri açıkça **recovery** (iyi bir duruma teleoperasyonla geri dönme) ve **correction** (oradan doğru davranışı gösterme) olarak ayırarak bu döngüyü uzun vadeli görevlere ölçekler. Bu ayrıştırma, `lerobot-rollout` içindeki DAgger stratejisinin izlediği protokoldür.

- **π0.6/RECAP** (Physical Intelligence, 2025), VLA modellerinde aynı iteratif topla ve ince ayar yap döngüsünü ölçekli olarak uygulayarak, büyük önceden eğitilmiş politikaların bile kendi başarısızlık modlarına yönelik hedefli insan düzeltmelerinden önemli ölçüde faydalandığını göstermektedir. π0.6, RECAP kullanılarak eğitilmektedir.

```bibtex
@article{ross2011dagger,
  title={A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning},
  author={Ross, Stéphane and Gordon, Geoffrey and Bagnell, Drew},
  journal={Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics},
  year={2011}
}

@article{kelly2019hgdagger,
  title={HG-DAgger: Interactive Imitation Learning with Human Experts},
  author={Kelly, Michael and Sidrane, Chelsea and Driggs-Campbell, Katherine and Kochenderfer, Mykel J},
  journal={arXiv preprint arXiv:1810.02890},
  year={2019}
}

@article{hu2025rac,
  title={RaC: Robot Learning for Long-Horizon Tasks by Scaling Recovery and Correction},
  author={Hu, Zheyuan and Wu, Robyn and Enock, Naveen and Li, Jasmine and Kadakia, Riya and Erickson, Zackory and Kumar, Aviral},
  journal={arXiv preprint arXiv:2509.07953},
  year={2025}
}

@article{pi2025recap,
  title={π0.6: a VLA That Learns From Experience},
  author={Physical Intelligence},
  year={2025}
}
```

