# OpenArm

[OpenArm](https://openarm.dev)は、物理AIの研究およびデプロイメントのために設計されたオープンソースの7自由度ヒューマノイドアームです。

組み立て済みまたはDIYのOpenArmを手に入れ、グローバルコミュニティに参加するには、世界中の認証済み・認定済みメーカーを[openarm.dev](https://openarm.dev)で検索してください。

## 何がユニークなのか?

- **人間スケールドesign**：OpenArmは、身長160〜165cm程度の人間に合わせたプロポーションで設計されています。これにより、実用的なリーチと、安全かつ反応性の高い操作に必要な管理可能な慣性の間での最適なバランスが実現されます。

- **安全性を最優先としたアーキテクチャ**：QDDバックドライブ可能モーターと高いコンプライアンスを備えて構築されたOpenArmは、実用的なペイロード能力（ピーク6.0kg / 公称4.1kg）を維持しつつ、安全な人間とロボットの相互作用を優先します。

- **耐久性に優れた設計**：重要な構造部品にはアルミニウムとステンレス鋼を採用しており、反復的なデータ収集や継続的な研究利用においても堅牢なパフォーマンスを発揮します。

- **完全なアクセス性と構築可能性**: CNC部品や3Dプリント筐体、電気配線に至るまで、すべてのコンポーネントは、個人研究者や研究室が購入・構築できるように設計されており、完全な製造データが提供されます。

- **実用的かつ手頃な価格**: 完全な両手操作システムが6,500米ドルで、OpenArmは従来のヒューマノイドロボットの費用のわずか一部で、研究レベルの機能を提供します。

## プラットフォーム要件

  **Linux のみ**: OpenArm は現在、Linux でのみ動作します。CAN バス USB アダプターには macOS 用のドライバーがなく、Windows でのテストも実施されていません。

## セーフティガイド

OpenArmを操作する前に、[公式の安全ガイド](https://docs.openarm.dev/getting-started/safety-guide)をお読みください。主なポイントは以下の通りです：

- **安全な設置**: 腕をネジやクランプで平らで安定した面に固定します
- **安全距離**: 稼働中は、身体部位や物体を可動範囲の外に保ってください
- **保護具**: 常に安全ゴーグルを着用してください。必要に応じて追加のPPEを使用してください
- **ペイロードの制限**: 指定されたペイロードの制限（アームあたりピーク6.0kg / 公称4.1kg）を超えないでください。
- **緊急停止**: 緊急停止装置の位置と操作方法を把握してください
- **定期的な点検**: ねじの緩み、機械的リミットの損傷、異音、配線の損傷を確認します

## ハードウェアのセットアップ

以下の内容については、公式の[OpenArmハードウェアドキュメント](https://docs.openarm.dev)を参照してください:

- 部品表と調達
- 3Dプリントの指示
- 機械的アセンブリ
- 電気配線

ハードウェアのリポジトリは、[github.com/enactic/openarm](https://github.com/enactic/openarm) で利用できます。

## CANバスセットアップ

OpenArm uses CAN bus communication with Damiao motors. Once you have the CAN bus USB adapter plugged into your Linux PC, follow the [Damiao Motors and CAN Bus guide](./damiao) to configure the interface.

クイックセットアップ:

```bash
# Setup CAN interfaces
lerobot-setup-can --mode=setup --interfaces=can0,can1

# Test motor communication
lerobot-setup-can --mode=test --interfaces=can0,can1
```

## LeRobot🤗のインストール

[インストールガイド](./installation)に従って、Damiaoモーターのサポートをインストールしてください:

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

## 使用方法

### フォロワーアーム（ロボット）

```bash
lerobot-calibrate \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower
```

```python
from lerobot.robots.openarm_follower import OpenArmFollower, OpenArmFollowerConfig

config = OpenArmFollowerConfig(
    port="can0",
    side="right",  # or "left" for left arm
    id="my_openarm_follower",
)

follower = OpenArmFollower(config)
follower.connect()

# Read current state
obs = follower.get_observation()
print(obs)

# Send action (position in degrees)
action = {
    "joint_1.pos": 0.0,
    "joint_2.pos": 0.0,
    "joint_3.pos": 0.0,
    "joint_4.pos": 45.0,
    "joint_5.pos": 0.0,
    "joint_6.pos": 0.0,
    "joint_7.pos": 0.0,
    "gripper.pos": 0.0,
}
follower.send_action(action)

follower.disconnect()
```

### リーダーアーム（テレオペレーター）

リーダーアームはテレオペレーションに使用され、手動で動かすことでフォロワーアームを制御します。

```bash
lerobot-calibrate \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader
```

```python
from lerobot.teleoperators.openarm_leader import OpenArmLeader, OpenArmLeaderConfig

config = OpenArmLeaderConfig(
    port="can1",
    id="my_openarm_leader",
    manual_control=True,  # Disable torque for manual movement
)

leader = OpenArmLeader(config)
leader.connect()

# Read current position (as action to send to follower)
action = leader.get_action()
print(action)

leader.disconnect()
```

### テレオペレーション

リーダー・フォロワー制御でOpenArmをテレオペレーションするには:

```bash
lerobot-teleoperate \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader
```

キャリブレーション時と同じ`--robot.id`と`--teleop.id`を使用してください。これにより、LeRobotがキャリブレーションファイルを見つけられます。

### 両手テレオペレーション

2つのリーダーアームと2つのフォロワーアームからなるバイマヌアルなOpenArmセットアップを遠隔操作するには:

```bash
lerobot-teleoperate \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can0 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can1 \
    --robot.right_arm_config.side=right \
    --robot.id=my_bimanual_follower \
    --teleop.type=bi_openarm_leader \
    --teleop.left_arm_config.port=can2 \
    --teleop.right_arm_config.port=can3 \
    --teleop.id=my_bimanual_leader
```

### データの記録

テレオペレーション中にデータセットを記録するには:

```bash
lerobot-record \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader \
    --dataset.repo_id=${HF_USER}/my_openarm_dataset \
    --dataset.single_task="Describe your task here" \
    --dataset.fps=30 \
    --dataset.num_episodes=10
```

`lerobot-record` は、セッションの日時をデータセット名に追加するため、`my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS` として保存されます。カメラ、キーボード操作、およびその他のワークフローについては、[レコーディングガイド](./il_robots#record-a-dataset)を参照してください。

## 設定オプション

### フォロワー設定

| パラメータ             | デフォルト   | 説明                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | CANインターフェース（例: `can0`）                               |
| `side`                | `None`    | Arm側: カスタム制限の場合は`"left"`、`"right"`、または`None` |
| `use_can_fd`          | `True`    | 高速なデータレートを実現するためにCAN FDを有効にする                        |
| `can_bitrate`         | `1000000` | 公称ビットレート (1 Mbps)                                   |
| `can_data_bitrate`    | `5000000` | CAN FD データビットレート (5 Mbps)                               |
| `max_relative_target` | `None`    | 相対ターゲット位置の安全限界                 |
| `position_kp`         | 関節ごと | 位置制御比例ゲイン                        |
| `position_kd`         | 関節ごと | 位置制御の微分ゲイン                          |

### リーダー設定

| パラメータ          | デフォルト   | 説明                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | CANインターフェース（例: `can1`）        |
| `manual_control`   | `True`    | 手動移動時のトルクを無効にする  |
| `use_can_fd`       | `True`    | 高速なデータレートを実現するためにCAN FDを有効にする |
| `can_bitrate`      | `1000000` | 公称ビットレート (1 Mbps)            |
| `can_data_bitrate` | `5000000` | CAN FD データビットレート (5 Mbps)        |

## モーター設定

OpenArmは、以下のデフォルト設定でDamiaoモーターを使用します：

| ジョイント                       | モータータイプ | IDを送信 | 受信 ID |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (肩のパン)      | DM8009     | 0x01    | 0x11    |
| joint_2 (肩の挙上)     | DM8009     | 0x02    | 0x12    |
| joint_3（肩の回転） | DM4340     | 0x03    | 0x13    |
| joint_4 (肘屈曲)        | DM4340     | 0x04    | 0x14    |
| joint_5（手首ロール）        | DM4310     | 0x05    | 0x15    |
| joint_6（手首ピッチ）       | DM4310     | 0x06    | 0x16    |
| joint_7（手首の回転）    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

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

### モーターからの応答なし

1. 電源の接続を確認する
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. 診断を実行します: `lerobot-setup-can --mode=test --interfaces=can0`
4. 詳細については、[Damiaoトラブルシューティングガイド](./damiao#troubleshooting)を参照してください。

### CANインターフェースが見つかりません

CANインターフェースが設定されていることを確認してください:

```bash
ip link show can0
```

## リソース

- [OpenArm ウェブサイト](https://openarm.dev)
- [OpenArm ドキュメント](https://docs.openarm.dev)
- [OpenArm GitHub](https://github.com/enactic/openarm)
- [セーフティガイド](https://docs.openarm.dev/getting-started/safety-guide)
- [Damiao MotorsとCANバス](./damiao)

