# HopeJR

## 前提条件

- [ハードウェアのセットアップ](https://github.com/TheRobotStudio/HOPEJr)

## LeRobotのインストール

LeRobotをインストールするには、[インストール手順](https://github.com/huggingface/lerobot#installation)に従ってください。

HopeJRの依存関係を含むLeRobotをインストールします:

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

## デバイス設定

キャリブレーションと操作を開始する前に、HopeJRの各コンポーネントのUSBポートを特定する必要があります。アーム、ハンド、グローブ、エクソスケルトンのUSBポートを特定するには、このスクリプトを実行してください。

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

これにより、利用可能な USB ポートとその関連デバイスが表示されます。データ記録、エピソードの再生、またはテレオペレーションスクリプトの実行時に、`--robot.port` および `--teleop.port` パラメータでポートパス（例: `/dev/tty.usbmodem58760433331`、`/dev/tty.usbmodem11301`）を指定する必要があるため、ポートパスをメモしておいてください。

## ステップ1: 較正

テレオペレーションを実行する前に、HopeJRの四肢をキャリブレーションする必要があります。キャリブレーションファイルは`~/.cache/huggingface/lerobot/calibration`に保存されます。

### 1.1 ロボットハンドのキャリブレーション

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

キャリブレーションスクリプトを実行すると、キャリブレーションGUIが表示されます。指の関節は次のように命名されています。

**サムネイル**:

- **CMC**: 親指と手を接続する基部関節
- **MCP**: 中手骨指節関節
- **PIP**: 第1指関節
- **DIP** : 指先関節

**人差し指、中指、薬指、小指**：

- **放射状屈筋**: 指の基部を親指方向へ移動させる
- **尺側屈筋**: 指の基部を小指側へ移動させる
- **PIP/DIP**: 指の遠位指節骨と近位指節骨を屈曲します

これらそれぞれは、GUI を介して個別にキャリブレーションする必要があります。対称的な動きを得るためには、尺側屈筋群と橈側屈筋群の範囲は同じサイズ（ただしオフセットは異なる）である必要があります。

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_1.png" alt="手キャリブレーションGUIでの境界の設定" title="手キャリブレーションGUIでの境界の設定" width="100%"
  >

上記に示すように、キャリブレーションインターフェースを使用して、各関節の範囲境界を設定します。

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_2.png" alt="キャリブレーション値の保存" title="キャリブレーション値の保存" width="100%"
  >

すべての関節に適切な境界を設定したら、"Save"をクリックして、キャリブレーション値をモーターに保存します。

### 1.2 テレオペレーター用手袋のキャリブレーション

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

親指から始め、各指を可動域の最大限まで動かします。

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

各指について続けます:

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

キャリブレーションが完了すると、システムはキャリブレーションを`/Users/your_username/.cache/huggingface/lerobot/calibration/teleoperators/homunculus_glove/red.json`に保存します。

### 1.3 ロボットアームのキャリブレーション

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

これにより、各モーターの範囲制限を設定できるキャリブレーションGUIが開きます。アームの動作は次のように構成されています。

- **Shoulder**: ピッチ、ヨー、ロール
- **肘**: 屈曲
- **Wrist**: ピッチ、ヨー、ロール

  <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/calibration_gui_2.png" alt="アームキャリブレーションGUIでの境界設定" title="アームキャリブレーションGUIでの境界設定" width="100%"
  >

キャリブレーションインターフェースを使用して、各関節の範囲の境界を設定します。各関節を可動域全体にわたって動かしながら、最小値と最大値を適切に調整してください。すべての関節に適切な境界を設定したら、キャリブレーションを保存します。

### 1.4 テレオペレーター用エクソスケルトンのキャリブレーション

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

外骨格はロボットアームの操作を可能にします。キャリブレーション中、すべての関節を可動域いっぱいに動かすよう促されます。

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

## ステップ2: テレオペレーション

Feetechミドルウェアにおけるグローバル変数の競合により、アームと手のテレオペレーションは別々のシェルセッションで実行する必要があります：

### ハンド

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

## ステップ3: 記録、再生、学習

Hope-JRによる記録、再生、学習はまだ実験段階です。

### 記録

このステップでは、[こちら](https://huggingface.co/datasets/nepyope/hand_record_test_with_video_data)の例のように、データセットを記録します。

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

### リプレイ

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

### 学習

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

### 評価

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

