# OpenArm

[OpenArm](https://openarm.dev) adalah lengan humanoid 7DOF open-source yang dirancang untuk penelitian dan penerapan AI fisik.

Untuk mendapatkan OpenArm Anda, baik yang sudah dirakit maupun rakitan sendiri, dan bergabung dengan komunitas global, jelajahi produsen yang terverifikasi dan tersertifikasi di seluruh dunia di [openarm.dev](https://openarm.dev).

## Apa yang Unik?

- **Desakan Skala Manusia**: OpenArm dirancang dengan proporsi menyerupai manusia, diskalakan untuk orang dengan tinggi sekitar 160-165 cm. Hal ini memberikan keseimbangan optimal antara jangkauan praktis dan inersia yang dapat dikelola untuk operasi yang aman dan responsif.

- **Arsitektur Berbasis Keselamatan**: Dibangun dengan motor QDD yang dapat dikendalikan mundur dan kepatuhan tinggi, OpenArm mengutamakan interaksi manusia-robot yang aman sambil mempertahankan kemampuan beban praktis (puncak 6,0 kg / nominal 4,1 kg) untuk tugas-tugas di dunia nyata.

- **Dibangun untuk Ketahanan**: Komponen struktural kritis menggunakan konstruksi aluminium dan baja tahan karat, memastikan kinerja yang kokoh untuk pengumpulan data berulang dan penggunaan penelitian berkelanjutan.

- **Seluruhnya Dapat Diakses & Dibangun**: Setiap komponen, mulai dari bagian CNC dan casing yang dicetak 3D hingga kabel listrik, dirancang agar dapat dibeli dan dibangun oleh peneliti individu dan laboratorium, dengan data fabrikasi lengkap yang disediakan.

- **Praktis & Terjangkau**: Dengan harga 6.500 USD untuk sistem bimanual lengkap, OpenArm menghadirkan kemampuan kelas riset dengan biaya yang jauh lebih rendah dibandingkan robot humanoid tradisional.

## Persyaratan Platform

  **Hanya Linux**: OpenArm saat ini hanya berfungsi di Linux. Adapter USB bus CAN tidak memiliki driver untuk macOS dan belum diuji di Windows.

## Panduan Keselamatan

Sebelum mengoperasikan OpenArm, silakan baca [panduan keselamatan resmi](https://docs.openarm.dev/getting-started/safety-guide). Poin-poin utama:

- **Pemasangan aman**: Kencangkan lengan ke permukaan datar dan stabil menggunakan sekrup atau klem
- **Jarak aman**: Jauhkan bagian tubuh dan benda dari jangkauan gerak selama pengoperasian
- **Peralatan pelindung**: Selalu gunakan kacamata pengaman; gunakan APD tambahan sesuai kebutuhan
- **Batas beban**: Jangan melebihi batas beban yang ditentukan (6,0 kg puncak / 4,1 kg nominal per lengan)
- **Stop darurat**: Ketahui lokasi dan cara pengoperasian perangkat stop darurat
- **Pemeriksaan rutin**: Periksa baut yang longgar, batas mekanis yang rusak, suara yang tidak biasa, dan kerusakan kabel

## Pengaturan Perangkat Keras

Ikuti [dokumentasi perangkat keras OpenArm resmi](https://docs.openarm.dev) untuk:

- Daftar bahan dan pengadaan
- Petunjuk pencetakan 3D
- Perakitan mekanis
- Instalasi kelistrikan

Repositori perangkat keras tersedia di [github.com/enactic/openarm](https://github.com/enactic/openarm).

## Pengaturan Bus CAN

OpenArm menggunakan komunikasi CAN bus dengan motor Damiao. Setelah Anda mencolokkan adapter USB CAN bus ke PC Linux Anda, ikuti [panduan Damiao Motors dan CAN Bus](./damiao) untuk mengonfigurasi antarmuka.

Pengaturan cepat:

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

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

## Install LeRobot 🤗

Ikuti [Panduan Instalasi](./installation) kami, lalu instal dukungan motor Damiao:

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

## Penggunaan

### Lengan Pengikut (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()
```

### Lengan Pemimpin (Teleoperator)

Lengan leader digunakan untuk teleoperasi - menggerakkannya secara manual untuk mengendalikan lengan follower.

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

### Teleoperasi

Untuk melakukan teleoperasi OpenArm dengan kontrol leader-follower:

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

Gunakan `--robot.id` dan `--teleop.id` yang sama seperti saat kalibrasi, agar LeRobot dapat menemukan file kalibrasi.

### Teleoperasi Bimanual

Untuk melakukan teleoperasi pada setup OpenArm bimanual dengan dua lengan leader dan dua lengan follower:

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

### Merekam Data

Untuk merekam dataset selama teleoperasi:

```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` menambahkan tanggal dan waktu sesi ke nama dataset, sehingga disimpan sebagai `my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS`. Lihat [panduan perekaman](./il_robots#record-a-dataset) untuk kamera, kontrol keyboard, dan sisa alur kerja.

## Opsi Konfigurasi

### Konfigurasi Pengikut

| Parameter             | Default   | Deskripsi                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | Antarmuka CAN (misalnya, `can0`)                               |
| `side`                | `None`    | Sisi lengan: `"left"`, `"right"`, atau `None` untuk batas kustom |
| `use_can_fd`          | `True`    | Aktifkan CAN FD untuk laju data yang lebih tinggi                        |
| `can_bitrate`         | `1000000` | Bitrate nominal (1 Mbps)                                   |
| `can_data_bitrate`    | `5000000` | Laju bit data CAN FD (5 Mbps)                               |
| `max_relative_target` | `None`    | Batas keamanan untuk posisi target relatif                 |
| `position_kp`         | Per sendi | Gain proporsional kontrol posisi                        |
| `position_kd`         | Per sendi | Peningkatan turunan kontrol posisi                          |

### Konfigurasi Leader

| Parameter          | Default   | Deskripsi                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | Antarmuka CAN (misalnya, `can1`)        |
| `manual_control`   | `True`    | Nonaktifkan torsi untuk gerakan manual  |
| `use_can_fd`       | `True`    | Aktifkan CAN FD untuk laju data yang lebih tinggi |
| `can_bitrate`      | `1000000` | Bitrate nominal (1 Mbps)            |
| `can_data_bitrate` | `5000000` | Laju bit data CAN FD (5 Mbps)        |

## Konfigurasi Motor

OpenArm menggunakan motor Damiao dengan konfigurasi default berikut:

| Ganda                       | Jenis Motor | Kirim ID | ID Terima |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (Pan bahu)      | DM8009     | 0x01    | 0x11    |
| joint_2 (Angkat bahu)     | DM8009     | 0x02    | 0x12    |
| joint_3 (Rotasi bahu) | DM4340     | 0x03    | 0x13    |
| joint_4 (Fleksi siku)        | DM4340     | 0x04    | 0x14    |
| joint_5 (Putaran pergelangan tangan)        | DM4310     | 0x05    | 0x15    |
| joint_6 (Pitch pergelangan tangan)       | DM4310     | 0x06    | 0x16    |
| joint_7 (Rotasi pergelangan tangan)    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

## Pemecahan Masalah

### Tidak Ada Respons dari Motor

1. Periksa koneksi catu daya
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. Jalankan diagnostik: `lerobot-setup-can --mode=test --interfaces=can0`
4. Lihat [panduan pemecahan masalah Damiao](./damiao#troubleshooting) untuk detail lebih lanjut

### CAN Interface Tidak Ditemukan

Pastikan antarmuka CAN telah dikonfigurasi:

```bash
ip link show can0
```

## Sumber daya

- [Situs Web OpenArm](https://openarm.dev)
- [Dokumentasi OpenArm](https://docs.openarm.dev)
- [GitHub OpenArm](https://github.com/enactic/openarm)
- [Panduan Keamanan](https://docs.openarm.dev/getting-started/safety-guide)
- [Damiao Motors dan CAN Bus](./damiao)

