# OpenArm

[OpenArm](https://openarm.dev) es un brazo humanoide de 7DOF de código abierto diseñado para la investigación y el despliegue de IA física.

Para obtener tu OpenArm, ya sea ensamblado o de bricolaje, y unirte a la comunidad global, explora a los fabricantes verificados y certificados de todo el mundo en [openarm.dev](https://openarm.dev).

## ¿Qué lo hace único?

- **Diseño a escala humana**: OpenArm está diseñado con proporciones similares a las humanas, escalado para una persona de aproximadamente 160-165 cm de estatura. Esto proporciona un equilibrio óptimo entre un alcance práctico y una inercia manejable para una operación segura y receptiva.

- **Arquitectura centrada en la seguridad**: Construido con motores retroaccionables QDD y alta compliancia, OpenArm prioriza la interacción segura entre humanos y robots, al tiempo que mantiene capacidades de carga prácticas (6,0 kg pico / 4,1 kg nominal) para tareas del mundo real.

- **Diseñado para durar**: Los componentes estructurales críticos utilizan una construcción de aluminio y acero inoxidable, lo que garantiza un rendimiento robusto para la recopilación repetitiva de datos y el uso continuo en investigación.

- **Totalmente accesible y fabricable**: Cada componente, desde piezas de CNC y carcasas impresas en 3D hasta el cableado eléctrico, está diseñado para que investigadores individuales y laboratorios puedan comprarlo y fabricarlo, con los datos de fabricación completos proporcionados.

- **Práctico y asequible**: Por 6.500 USD por un sistema bimanual completo, OpenArm ofrece capacidades de grado de investigación por una fracción del costo de los robots humanoides tradicionales.

## Requisitos de la plataforma

  **Solo Linux**: OpenArm actualmente solo funciona en Linux. El adaptador USB de bus CAN no tiene controladores para macOS y no se ha probado en Windows.

## Guía de seguridad

Antes de operar OpenArm, lea la [guía de seguridad oficial](https://docs.openarm.dev/getting-started/safety-guide). Puntos clave:

- **Instalación segura**: Fije el brazo a una superficie plana y estable con tornillos o abrazaderas
- **Distancia de seguridad**: Mantén las partes del cuerpo y los objetos fuera del rango de movimiento durante la operación
- **Equipo de protección**: Use siempre gafas de seguridad; utilice EPI adicionales según sea necesario
- **Límites de carga**: No exceda los límites de carga especificados (6,0 kg pico / 4,1 kg nominal por brazo)
- **Parada de emergencia**: Conozca la ubicación y el funcionamiento del dispositivo de parada de emergencia
- **Inspección regular**: Verifique los tornillos flojos, los límites mecánicos dañados, los ruidos inusuales y los daños en el cableado

## Configuración del hardware

Siga la documentación oficial de hardware de [OpenArm](https://docs.openarm.dev) para:

- Lista de materiales y aprovisionamiento
- Instrucciones para impresión 3D
- Ensamblaje mecánico
- Instalación eléctrica

Los repositorios de hardware están disponibles en [github.com/enactic/openarm](https://github.com/enactic/openarm).

## Configuración del bus CAN

OpenArm utiliza comunicación por bus CAN con motores Damiao. Una vez que el adaptador USB de bus CAN esté conectado a su PC con Linux, siga la [guía de motores Damiao y bus CAN](./damiao) para configurar la interfaz.

Configuración rápida:

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

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

## Instalar LeRobot 🤗

Siga nuestra [Guía de instalación](./installation) y luego instale el soporte del motor Damiao:

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

## Uso

### Brazo seguidor (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()
```

### Brazo líder (teleoperador)

El brazo líder se utiliza para la teleoperación: se mueve manualmente para controlar el brazo seguidor.

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

### Teleoperación

Para teleoperar OpenArm con control líder-seguidor:

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

Usa el mismo `--robot.id` y `--teleop.id` que durante la calibración, para que LeRobot encuentre los archivos de calibración.

### Teleoperación bimanual

Para teleoperar una configuración bimanual de OpenArm con dos brazos líderes y dos seguidores:

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

### Registro de datos

Para registrar un conjunto de datos durante la teleoperación:

```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` añade la fecha y la hora de la sesión al nombre del conjunto de datos, por lo que se guarda como `my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS`. Consulta la [guía de grabación](./il_robots#record-a-dataset) para conocer las cámaras, los controles de teclado y el resto del flujo de trabajo.

## Opciones de configuración

### Configuración del seguidor

| Parámetro             | Predeterminado   | Descripción                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | Interfaz CAN (p. ej., `can0`)                               |
| `side`                | `None`    | Lado del brazo: `"left"`, `"right"` o `None` para límites personalizados |
| `use_can_fd`          | `True`    | Habilitar CAN FD para tasas de datos más altas                        |
| `can_bitrate`         | `1000000` | Tasa de bits nominal (1 Mbps)                                   |
| `can_data_bitrate`    | `5000000` | Tasa de bits de datos CAN FD (5 Mbps)                               |
| `max_relative_target` | `None`    | Límite de seguridad para las posiciones relativas objetivo                 |
| `position_kp`         | Por articulación | Ganancias proporcionales de control de posición                        |
| `position_kd`         | Por articulación | Ganancias derivadas de control de posición                          |

### Configuración del líder

| Parámetro          | Predeterminado   | Descripción                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | Interfaz CAN (p. ej., `can1`)        |
| `manual_control`   | `True`    | Desactivar el par para el movimiento manual  |
| `use_can_fd`       | `True`    | Habilitar CAN FD para tasas de datos más altas |
| `can_bitrate`      | `1000000` | Tasa de bits nominal (1 Mbps)            |
| `can_data_bitrate` | `5000000` | Tasa de bits de datos CAN FD (5 Mbps)        |

## Configuración del motor

OpenArm utiliza motores Damiao con la siguiente configuración predeterminada:

| Conjunto                       | Tipo de motor | Enviar ID | ID de recepción |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (Giro del hombro)      | DM8009     | 0x01    | 0x11    |
| joint_2 (Elevación de hombro)     | DM8009     | 0x02    | 0x12    |
| joint_3 (Rotación del hombro) | DM4340     | 0x03    | 0x13    |
| joint_4 (Flexión del codo)        | DM4340     | 0x04    | 0x14    |
| joint_5 (Giro de muñeca)        | DM4310     | 0x05    | 0x15    |
| joint_6 (Inclinación de la muñeca)       | DM4310     | 0x06    | 0x16    |
| joint_7 (Rotación de la muñeca)    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

## Solución de problemas

### Sin respuesta de los motores

1. Comprueba las conexiones de la fuente de alimentación
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. Ejecute diagnósticos: `lerobot-setup-can --mode=test --interfaces=can0`
4. Consulte la [guía de solución de problemas de Damiao](./damiao#troubleshooting) para obtener más detalles

### No se encontró la interfaz CAN

Asegúrese de que la interfaz CAN esté configurada:

```bash
ip link show can0
```

## Recursos

- [Sitio web de OpenArm](https://openarm.dev)
- [Documentación de OpenArm](https://docs.openarm.dev)
- [GitHub de OpenArm](https://github.com/enactic/openarm)
- [Guía de seguridad](https://docs.openarm.dev/getting-started/safety-guide)
- [Damiao Motors y CAN Bus](./damiao)

