# OpenArm

[OpenArm](https://openarm.dev) est un bras humanoïde 7 DOF open source conçu pour la recherche et le déploiement en IA physique.

Pour obtenir votre OpenArm, assemblé ou en kit, et rejoindre la communauté mondiale, parcourez les fabricants vérifiés et certifiés à travers le monde sur [openarm.dev](https://openarm.dev).

## Qu'est-ce qui est unique ?

- **Conception à l'échelle humaine** : OpenArm est conçu avec des proportions anthropomorphes, dimensionné pour une personne d'environ 160 à 165 cm de taille. Cela offre un équilibre optimal entre une portée pratique et une inertie maîtrisable pour un fonctionnement sûr et réactif.

- **Architecture axée sur la sécurité** : Conçu avec des moteurs rétroactionnables QDD et une haute compliance, OpenArm privilégie une interaction sûre entre l'humain et le robot tout en conservant des capacités de charge utiles (6,0 kg en pointe / 4,1 kg nominales) pour des tâches réelles.

- **Conçu pour durer** : Les composants structurels critiques sont fabriqués en aluminium et en acier inoxydable, garantissant des performances robustes pour la collecte répétée de données et l'utilisation continue en recherche.

- **Entièrement accessible et réalisable** : chaque composant, des pièces CNC et boîtiers imprimés en 3D au câblage électrique, est conçu pour être achetable et réalisable par des chercheurs individuels et des laboratoires, avec des données de fabrication complètes fournies.

- **Pratique et abordable** : À 6 500 USD pour un système bimanuel complet, OpenArm offre des capacités de niveau recherche pour une fraction du coût des robots humanoïdes traditionnels.

## Exigences de la plateforme

  **Linux uniquement** : OpenArm fonctionne actuellement uniquement sur Linux. L’adaptateur USB de bus CAN ne dispose pas de pilotes pour macOS et n’a pas été testé sur Windows.

## Guide de sécurité

Avant d'utiliser OpenArm, veuillez lire le [guide de sécurité officiel](https://docs.openarm.dev/getting-started/safety-guide). Points clés :

- **Installation sécurisée** : Fixez le bras à une surface plane et stable à l'aide de vis ou de pinces
- **Distance de sécurité** : Gardez les parties du corps et les objets hors de la portée de mouvement pendant le fonctionnement
- **Équipement de protection** : Portez toujours des lunettes de sécurité ; utilisez un EPI supplémentaire si nécessaire
- **Limites de charge utile** : Ne pas dépasser les limites de charge utile spécifiées (6,0 kg au pic / 4,1 kg nominaux par bras)
- **Arrêt d'urgence** : Connaître l'emplacement et le fonctionnement du dispositif d'arrêt d'urgence
- **Inspection régulière** : Vérifiez la présence de vis desserrées, de limites mécaniques endommagées, de bruits inhabituels et de dommages au câblage

## Configuration matérielle

Suivez la [documentation matérielle officielle d'OpenArm](https://docs.openarm.dev) pour :

- Liste des matériaux et approvisionnement
- Instructions d’impression 3D
- Assemblage mécanique
- Câblage électrique

Les dépôts de matériel sont disponibles sur [github.com/enactic/openarm](https://github.com/enactic/openarm).

## Configuration du bus CAN

OpenArm utilise la communication par bus CAN avec des moteurs Damiao. Une fois l’adaptateur USB du bus CAN branché sur votre PC Linux, suivez le [guide Damiao Motors et bus CAN](./damiao) pour configurer l’interface.

Installation rapide :

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

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

## Installer LeRobot 🤗

Suivez notre [Guide d’installation](./installation), puis installez le support du moteur Damiao :

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

## Utilisation

### Bras suiveur (robot)

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

### Bras leader (Téléopérateur)

Le bras leader est utilisé pour la téléopération, c'est-à-dire pour le déplacer manuellement afin de contrôler le bras suiveur.

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

### Téléopération

Pour téléopérer OpenArm avec un contrôle maître-esclave :

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

Utilisez les mêmes `--robot.id` et `--teleop.id` que lors de l'étalonnage, afin que LeRobot trouve les fichiers d'étalonnage.

### Téléopération bimanuelle

Pour téléopérer un setup OpenArm bimanuel avec deux bras leaders et deux bras followers :

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

### Enregistrement des données

Pour enregistrer un jeu de données lors d'une téléopération :

```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` ajoute la date et l’heure de la session au nom du jeu de données, qui est donc enregistré sous `my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS`. Consultez le [guide d’enregistrement](./il_robots#record-a-dataset) pour les caméras, les contrôles clavier et le reste du flux de travail.

## Options de configuration

### Configuration du suiveur

| Paramètre             | Par défaut   | Description                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | Interface CAN (par exemple, `can0`)                               |
| `side`                | `None`    | Côté bras : `"left"`, `"right"` ou `None` pour des limites personnalisées |
| `use_can_fd`          | `True`    | Activer CAN FD pour des débits de données plus élevés                        |
| `can_bitrate`         | `1000000` | Débit nominal (1 Mbps)                                   |
| `can_data_bitrate`    | `5000000` | Débit de données CAN FD (5 Mbps)                               |
| `max_relative_target` | `None`    | Limite de sécurité pour les positions cibles relatives                 |
| `position_kp`         | Par articulation | Gains proportionnels de contrôle de position                        |
| `position_kd`         | Par articulation | Gains dérivés de contrôle de position                          |

### Configuration du leader

| Paramètre          | Par défaut   | Description                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | Interface CAN (par exemple, `can1`)        |
| `manual_control`   | `True`    | Désactiver le couple pour le mouvement manuel  |
| `use_can_fd`       | `True`    | Activer CAN FD pour des débits de données plus élevés |
| `can_bitrate`      | `1000000` | Débit nominal (1 Mbps)            |
| `can_data_bitrate` | `5000000` | Débit de données CAN FD (5 Mbps)        |

## Configuration du moteur

OpenArm utilise des moteurs Damiao avec la configuration par défaut suivante :

| Joint                       | Type de moteur | Envoyer l'ID | ID de réception |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (Rotation de l'épaule)      | DM8009     | 0x01    | 0x11    |
| joint_2 (Élévation de l'épaule)     | DM8009     | 0x02    | 0x12    |
| joint_3 (Rotation de l'épaule) | DM4340     | 0x03    | 0x13    |
| joint_4 (Flexion du coude)        | DM4340     | 0x04    | 0x14    |
| joint_5 (Rotation du poignet)        | DM4310     | 0x05    | 0x15    |
| joint_6 (Inclinaison du poignet)       | DM4310     | 0x06    | 0x16    |
| joint_7 (Rotation du poignet)    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

## Dépannage

### Aucune réponse des moteurs

1. Vérifier les connexions de l'alimentation
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. Lancer les diagnostics : `lerobot-setup-can --mode=test --interfaces=can0`
4. Consultez le [guide de dépannage Damiao](./damiao#troubleshooting) pour plus de détails

### Interface CAN introuvable

Vérifiez que l'interface CAN est configurée :

```bash
ip link show can0
```

## Ressources

- [Site Web d'OpenArm](https://openarm.dev)
- [Documentation OpenArm](https://docs.openarm.dev)
- [GitHub OpenArm](https://github.com/enactic/openarm)
- [Guide de sécurité](https://docs.openarm.dev/getting-started/safety-guide)
- [Damiao Motors et bus CAN](./damiao)

