# reBot B601

reBot B601は、Seeed Studioによる、模倣学習とエンボディドAI向けのオープンソースロボットアームです。セットアップでは、6自由度のフォロワーアームとグリップ、そしてテレオペレーション用のreBot Arm 102リーダーを組み合わせます。

FollowerはDamiao（DM）またはRobStride（RS）モーターで利用できます。どちらの構成も同じLeRobotロボットタイプとジョイント名を使用します。`--robot.motor_family`でハードウェアを選択してください。

| ビルド                                                              | `motor_family` | モーター                                   | デフォルトの接続   |
| ------------------------------------------------------------------ | -------------- | ---------------------------------------- | -------------------- |
| [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) | `dm`           | Damiao（`4340P`ベース、`4310`リスト）     | Damiaoシリアルブリッジ |
| [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/) | `rs`           | RobStride(`rs-06`ベース、`rs-00`手首) | ネイティブCAN           |

このガイドでは、単一アームおよび両腕セットアップにおけるハードウェアのセットアップ、キャリブレーション、テレオペレーション、および記録について説明します。

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm"
    width="48%"
  />

_左がB601のフォロワー、右がreBot Arm 102のリーダーです。DMとRSのフォロワーは同じ関節レイアウトと外観を共有していますが、モーターが異なります。画像はSeeed Studioの提供によるものです。_

## ハードウェアと安全性

[B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/)または[B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/)のフォロワーについて、Seeed Studioのガイドに従ってモーターを組み立て、配線し、設定してください。

  フォロワーを安定した面に固定し、作業スペースを空けておきます。トルクが無効化されている場合や、プログラムが切断された場合は、重力によってアームが動いてしまう可能性があるため、常にアームを支えてください。動作中に電源またはデータケーブルが切断された場合は、プログラムを停止し、リーダーとフォロワーをゼロ位置に戻してから、再接続して再起動してください。

## LeRobot🤗のインストール

[インストールガイド](./installation)に従って、reBot サポートをインストールします:

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

これにより、フォロワーには`motorbridge`、reBot Arm 102 リーダーには`motorbridge-smart-servo`がインストールされます。

## ハードウェアを接続する

DMはデフォルトでシリアルブリッジを使用し、オプションでネイティブCANを使用できます。RSはネイティブCANが必要です。

| `can_adapter` | 使用                                     | ポートの例   |
| ------------- | --------------------------------------- | -------------- |
| `damiao`      | Damiaoシリアルブリッジ; DMのみ           | `/dev/ttyACM0` |
| `socketcan`   | MotorBridgeネイティブCAN;RSに必要 | `can0`         |

モーターファミリーがデフォルトのアダプターを選択します。代わりにネイティブCANでDMを実行するには、`--robot.can_adapter=socketcan`を追加し、そのCANチャネルを`--robot.port`として使用します。

### シリアルブリッジ

`lerobot-find-port` を使用して、DMシリアルブリッジおよびリーダーのポートを特定します。デバイス名が区別しにくい場合は、一度に1つのシリアルデバイスのみを接続してください。

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

  Linux では、`brltty` がシリアルデバイスをキャプチャしている場合は、`sudo apt remove brltty` で削除してください。また、`sudo chmod 666 /dev/ttyACM* /dev/ttyUSB*` を実行して一時的なアクセス権限を付与する必要がある場合があります。

### ネイティブCAN

`socketcan` という設定名はプラットフォーム間で維持されます。Linux では SocketCAN が使用されます。macOS には互換性のある PCAN アダプターと MacCAN PCBUSB ランタイムが必要です。Windows のネイティブ CAN サポートは実験的であり、PEAK PCAN アダプターと PCAN-Basic が必要です。インストールの詳細については、[MotorBridge プラットフォームのセットアップ](https://github.com/motorbridge/motorbridge/tree/v0.5.1)を参照してください。

Linuxでは、RSフォロワーを接続する前に、各ネイティブCANインターフェースを1 Mbpsに設定してください。

```bash
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
ip -details link show can0
```

`can0`を、CANバックエンドが提供するチャンネルに置き換えてください。両腕ネイティブCAN構成では、両方のアームが同じモーターIDを使用するため、`can0`と`can1`のような個別のチャンネルが必要です。

## デバイスタイプ

| 型                     | デバイス                        |
| ------------------------ | ----------------------------- |
| `rebot_b601_follower`    | 単一フォロワー               |
| `bi_rebot_b601_follower` | 両手フォロワー             |
| `rebot_102_leader`       | Single reBot Arm 102 リーダー   |
| `bi_rebot_102_leader`    | Bimanual reBot Arm 102 リーダー |

`motor_family`のデフォルト値は`dm`です。両手構成では、各アームが独自の`left_arm_config.*`または`right_arm_config.*`設定を持ち、モーターファミリーを独立して選択できます。

## キャリブレーション

Calibration は、現在の物理的な姿勢をモーターのゼロ位置として設定し、LeRobot のキャリブレーションファイルを保存します。各アームを、グリップが完全に閉じた状態で、以下の図に示すゼロ位置に配置し、プロンプトが表示されたら ENTER キーを押してください。

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm at its zero position"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm at its zero position"
    width="48%"
  />

_フォロワーのゼロ位置（左）とリーダーのゼロ位置（右）。図はDMフォロワーを示しています。RSフォロワーは同じ関節配置を使用します。_

後続のコマンドで同じ`--robot.id`と`--teleop.id`を再利用することで、LeRobotが保存されたキャリブレーションを読み込むようにします。キャリブレーションが既に存在する場合、コマンドは既存のものを再利用するか、`c`を入力して再キャリブレーションを実行するかの選択を促します。

### フォロワー

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower
```

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower
```

キャリブレーションは、左のフォロワー、続いて右のフォロワーの順で実行されます。

```bash
lerobot-calibrate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1
```

2つのRSフォロワーを使用する場合、両方のファミリーを`rs`に設定し、2つのポートにはそれぞれ別のネイティブCANチャネルを使用します。アームごとのキャリブレーションファイルには、`_left`および`_right`のサフィックスが使用されます。

### リーダー

```bash
lerobot-calibrate \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-calibrate \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## テレオペレーション

小さな動きから始め、ワークスペース全体を使用する前に、すべての関節の方向を確認してください。

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## データセットを記録する

録画前にテレオペレーションをテストしてください。カメラを追加するには、まず以下で特定します:

```bash
lerobot-find-cameras opencv
```

### 単一アーム

この例では、1つのOpenCVカメラを使用して、5つのDMエピソードをローカルに記録します。

```bash
lerobot-record \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --robot.cameras='{"front": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader \
    --dataset.repo_id=your_username/rebot-dm-test \
    --dataset.single_task="Pick up the object" \
    --dataset.num_episodes=5 \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=true
```

RS の場合、`motor_family` を `rs` に変更し、ロボットポートをネイティブ CAN チャネルに変更します。モーターのみのテストを行う場合は、カメラの引数を削除します。

### 両手

このDMの例では、共有のトップカメラと各アームごとの1つのリストカメラを記録します。データセットのカメラキーは`top`、`left_wrist`、`right_wrist`です。

```bash
lerobot-record \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --robot.cameras='{
      top: {
        type: opencv,
        index_or_path: "/dev/video2",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.left_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video0",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.right_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video4",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1 \
    --dataset.repo_id=local/rebot-bimanual-dm-camera-test \
    --dataset.root=/tmp/rebot-bimanual-dm-camera-test \
    --dataset.single_task="Test coordinated movement of both reBot DM arms" \
    --dataset.fps=30 \
    --dataset.num_episodes=2 \
    --dataset.episode_time_s=20 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=false
```

> [!TIP]
> 両手 RS セットアップの場合、両方のモーターファミリーを`rs`に設定し、それぞれ別のネイティブ CAN チャネルを使用します。混合セットアップでは、片方のアームに`dm`を、もう片方のアームに`rs`を選択できます。

のアップロード、リプレイ、学習、評価を行うには、[Imitation Learning for Robots](./il_robots)を参照してください。

## 高度なコントロール

両方のビルドは、同じ関節名と、度単位のパブリックな位置を公開します。LeRobot は、各ファミリーのモーター方向の符号をアクションと観測に適用するため、ポリシーやテレオペレーターはモーター符号の変換を行う必要はありません。

- DMはデフォルトでアームにMIT制御、グリップに`force_pos`を使用します。`gripper_torque_ratio`のデフォルト値は`0.07`です。DMは`--robot.control_mode=pos_vel`もサポートしています。
- RS は MIT 制御と力制限インピーダンスグリップを使用しています。これは、MotorBridge が RobStride に対して `force_pos` を提供しないためです。測定されたグリップの動作に応じて、コマンドトルクは移動中に `3.5` N·m、保持中に `1.0` N·m に制限されます。フィードバックが失敗した場合、LeRobot はグリップトルクをゼロにコマンドしようとし、その後アームを無効にします。
- `mit_kp`、`mit_kd`、および`pos_vel_velocity`は、各関節に対するスカラー値1つ、または関節をキーとするマッピングのいずれかを指定できます。
- `max_relative_target`は、コマンドと最新の測定位置の差に上限を設けます。例えば、`--robot.max_relative_target=5.0`は、すべてのコマンドされた関節の变化を5度に制限します。
- `joint_limits`は、公開されている関節の自由度において、ファミリーのデフォルト値を任意に上書きします。

Followerモーターの方向は、モーターファミリーから内部で選択されます。テレオペレーションの関節が誤った方向に動く場合、リーダーの`joint_directions`は設定可能のままです。

  DMとRSは同じ座標規約を使用しますが、その幾何学、ゲイン、およびダイナミクスは異なります。ビルド間でポリシーやデータセットを転送する前に、それらを検証してください。

## トラブルシューティング

| 問題                                  | 確認                                                                                                       |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| シリアルデバイスが存在しないか、使用中です         | 一度に1台ずつデバイスを再接続し、`lerobot-find-port`を再実行し、権限を確認し、Linuxでは`brltty`を削除してください。 |
| ネイティブCANは接続できません                | アダプタの動作時間、チャンネル名、1 Mbpsのビットレート、モーターの出力、CAN配線、ターミネーションを確認してください。          |
| テレオペレーションされた関節が逆方向に動く | プログラムを停止し、`motor_family`を確認して、リーダーの`joint_directions`をチェックしてください。                        |
| キャリブレーションは再利用されません                | キャリブレーションで使用したのと同じロボットまたはテレオペレーターの`id`を使用してください。                                   |

アセンブリ、配線、およびハードウェア固有の診断については、[B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/)および[B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/)のSeeed Studioガイドを参照してください。

