# HopeJR

## Ön koşullar

- [Donanım Kurulumu](https://github.com/TheRobotStudio/HOPEJr)

## LeRobot'u Yükle

LeRobot'u yüklemek için [kurulum talimatlarını](https://github.com/huggingface/lerobot#installation) izleyin.

HopeJR bağımlılıklarıyla LeRobot'u yükleyin:

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

## Cihaz Yapılandırması

Kalibrasyon ve çalıştırma işlemlerine başlamadan önce, her bir HopeJR bileşeni için USB portlarını belirlemeniz gerekir. Kol, el, eldiven ve ekzoskelet için USB portlarını bulmak üzere bu betiği çalıştırın:

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

Bu komut, kullanılabilir USB portlarını ve bunlara bağlı cihazları görüntüler. Veri kaydı, bölümlerin yeniden oynatılması veya teleoperasyon betiklerinin çalıştırılması sırasında `--robot.port` ve `--teleop.port` parametrelerinde belirtmeniz gerekeceğinden, port yollarını (ör. `/dev/tty.usbmodem58760433331`, `/dev/tty.usbmodem11301`) not edin.

## Adım 1: Kalibrasyon

Teleoperasyon gerçekleştirmeden önce HopeJR'un uzuvları kalibre edilmelidir. Kalibrasyon dosyaları `~/.cache/huggingface/lerobot/calibration` konumuna kaydedilir.

### 1.1 Robot Eli Kalibrasyonu

```bash
lerobot-calibrate \
    --robot.type=hope_jr_hand \
    --robot.port=/dev/tty.usbmodem58760432281 \
    --robot.id=blue \
    --robot.side=right
```

Kalibrasyon betiği çalıştırıldığında, bir kalibrasyon GUI'si açılır. Parmak eklemleri aşağıdaki gibi adlandırılır:

**Daum**:

- **CMC**: başparmağı el ile birleştiren temel eklem
- **MCP**: el bileği eklemi
- **PIP**: ilk parmak eklemi
- **DIP** : parmak ucu eklemi

**İşaret, orta, yüzük ve serçe parmakları**:

- **Radial fleksör**: Parmak tabanını başparmağa doğru hareket ettirir
- **Ulnar fleksör**: Parmak tabanını serçe parmağa doğru hareket ettirir
- **PIP/DIP**: Parmak distal ve proksimal falanksını bükme

Bunların her biri, GUI üzerinden ayrı ayrı kalibre edilmelidir. Simetrik hareket elde edebilmek için ulnar ve radial fleksörlerin aynı büyüklükte (fakat farklı ofsetlerle) aralıklara sahip olması gerektiğini unutmayın.

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_1.png" alt="El kalibrasyon arayüzünde sınırların ayarlanması" title="El kalibrasyon arayüzünde sınırların ayarlanması" width="100%"
  >

Yukarıda gösterildiği gibi, her eklem için aralık sınırlarını ayarlamak üzere kalibrasyon arayüzünü kullanın.

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_2.png" alt="Kalibrasyon değerlerini kaydetme" title="Kalibrasyon değerlerini kaydetme" width="100%"
  >

Tüm eklemeler için uygun sınırları ayarladıktan sonra, kalibrasyon değerlerini motorlara kaydetmek için "Save" düğmesine tıklayın.

### 1.2 Teleoperatör Eldivenini Kalibre Et

```bash
lerobot-calibrate \
    --teleop.type=homunculus_glove \
    --teleop.port=/dev/tty.usbmodem11201 \
    --teleop.id=red \
    --teleop.side=right
```

Her parmağı başparmağınla başlayarak tam hareket aralığında hareket ettir.

```
Move thumb through its entire range of motion.
Recording positions. Press ENTER to stop...

-------------------------------------------
NAME      |    MIN |    POS |    MAX
thumb_cmc |   1790 |   1831 |   1853
thumb_mcp |   1497 |   1514 |   1528
thumb_pip |   1466 |   1496 |   1515
thumb_dip |   1463 |   1484 |   1514
```

Her parmakla devam edin:

```
Move middle through its entire range of motion.
Recording positions. Press ENTER to stop...

-------------------------------------------
NAME                 |    MIN |    POS |    MAX
middle_mcp_abduction |   1598 |   1718 |   1820
middle_mcp_flexion   |   1512 |   1658 |   2136
middle_dip           |   1484 |   1500 |   1547
```

Kalibrasyon tamamlandığında, sistem kalibrasyonu `/Users/your_username/.cache/huggingface/lerobot/calibration/teleoperators/homunculus_glove/red.json` konumuna kaydeder.

### 1.3 Robot Kolunu Kalibre Et

```bash
lerobot-calibrate \
    --robot.type=hope_jr_arm \
    --robot.port=/dev/tty.usbserial-1110 \
    --robot.id=white
```

Bu, her motor için aralık sınırlarını ayarlayabileceğiniz bir kalibrasyon arayüzünü açar. Kol hareketleri şu şekilde düzenlenmiştir:

- **Omuz**: pitch, yaw ve roll
- **Diz**: bük
- **Bilek**: pitch, yaw ve roll

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_2.png" alt="Kol kalibrasyon GUI'sinde sınırları ayarlama" title="Kol kalibrasyon GUI'sinde sınırları ayarlama" width="100%"
  >

Kalibrasyon arayüzünü kullanarak her eklem için aralık sınırlarını ayarlayın. Her eklemi tam hareket aralığı boyunca hareket ettirin ve minimum ile maksimum değerleri buna göre ayarlayın. Tüm eklemler için uygun sınırları belirledikten sonra kalibrasyonu kaydedin.

### 1.4 Teleoperatör Ekzoskeleti Kalibre Et

```bash
lerobot-calibrate \
    --teleop.type=homunculus_arm \
    --teleop.port=/dev/tty.usbmodem11201 \
    --teleop.id=black
```

Ekziskelet, robot kolunun kontrol edilmesini sağlar. Kalibrasyon sırasında, tüm eklem hareket açıklıklarının tamamı boyunca hareket etmeniz istenecektir:

```
Move all joints through their entire range of motion.
Recording positions. Press ENTER to stop...

-------------------------------------------
-------------------------------------------
NAME            |    MIN |    POS |    MAX
shoulder_pitch  |    586 |    736 |    895
shoulder_yaw    |   1257 |   1374 |   1390
shoulder_roll   |    449 |   1034 |   2564
elbow_flex      |   3023 |   3117 |   3134
wrist_roll      |   3073 |   3096 |   3147
wrist_yaw       |   2143 |   2171 |   2185
wrist_pitch     |   1975 |   1993 |   2074
Calibration saved to /Users/your_username/.cache/huggingface/lerobot/calibration/teleoperators/homunculus_arm/black.json
```

## Adım 2: Teleoperasyon

Feetech ara yazılımındaki global değişken çakışmaları nedeniyle, kol ve el için teleoperasyon ayrı kabuk oturumlarında çalıştırılmalıdır:

### El

```bash
lerobot-teleoperate \
    --robot.type=hope_jr_hand \
    --robot.port=/dev/tty.usbmodem58760432281 \
    --robot.id=blue \
    --robot.side=right \
    --teleop.type=homunculus_glove \
    --teleop.port=/dev/tty.usbmodem11201 \
    --teleop.id=red \
    --teleop.side=right \
    --display_data=true \
    --fps=30
```

### Arm

```bash
lerobot-teleoperate \
    --robot.type=hope_jr_arm \
    --robot.port=/dev/tty.usbserial-1110 \
    --robot.id=white \
    --teleop.type=homunculus_arm \
    --teleop.port=/dev/tty.usbmodem11201 \
    --teleop.id=black \
    --display_data=true \
    --fps=30
```

## Adım 3: Kaydet, Tekrar Oynat, Eğit

Kaydet, Tekrar Oynat ve Hope-JR ile Eğit hâlâ deneyseldir.

### Kayıt

Bu adım, [burada](https://huggingface.co/datasets/nepyope/hand_record_test_with_video_data) görülebilecek bir örnek olarak veri setini kaydeder.

```bash
lerobot-record \
    --robot.type=hope_jr_hand \
    --robot.port=/dev/tty.usbmodem58760432281 \
    --robot.id=right \
    --robot.side=right \
    --robot.cameras='{"main": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=homunculus_glove \
    --teleop.port=/dev/tty.usbmodem1201 \
    --teleop.id=right \
    --teleop.side=right \
    --dataset.repo_id=<USER>/hand_record_test_with_video_data \
    --dataset.single_task="Hand recording test with video data" \
    --dataset.num_episodes=1 \
    --dataset.episode_time_s=5 \
    --dataset.push_to_hub=true \
    --dataset.private=true \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2 \
    --display_data=true
# Optional: --dataset.rgb_encoder.vcodec=auto
```

### Yeniden Oynat

```bash
lerobot-replay \
    --robot.type=hope_jr_hand \
    --robot.port=/dev/tty.usbmodem58760432281 \
    --robot.id=right \
    --robot.side=right \
    --dataset.repo_id=<USER>/hand_record_test_with_camera \
    --dataset.episode=0
```

### Eğit

```bash
lerobot-train \
  --dataset.repo_id=<USER>/hand_record_test_with_video_data \
  --policy.type=act \
  --output_dir=outputs/train/hopejr_hand \
  --job_name=hopejr \
  --policy.device=mps \
  --trackio.enable=true \
  --policy.repo_id=<USER>/hand_test_policy
```

### Değerlendir

```bash
lerobot-record \
  --robot.type=hope_jr_hand \
  --robot.port=/dev/tty.usbmodem58760432281 \
  --robot.id=right \
  --robot.side=right \
  --robot.cameras='{"main": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
  --display_data=false \
  --dataset.repo_id=<USER>/eval_hopejr \
  --dataset.single_task="Evaluate hopejr hand policy" \
  --dataset.num_episodes=10 \
  --dataset.streaming_encoding=true \
  --dataset.encoder_threads=2 \
  --policy.path=outputs/train/hopejr_hand/checkpoints/last/pretrained_model
# Optional: --dataset.rgb_encoder.vcodec=auto
```

