# OpenArm

[OpenArm](https://openarm.dev) là cánh tay humanoid 7DOF mã nguồn mở được thiết kế cho nghiên cứu và triển khai AI vật lý.

Để có được OpenArm của bạn, dù là đã lắp ráp sẵn hay tự lắp ráp, và tham gia vào cộng đồng toàn cầu, hãy tìm hiểu các nhà sản xuất được xác minh và chứng nhận trên toàn thế giới tại [openarm.dev](https://openarm.dev).

## Điểm khác biệt?

- **Thiết kế theo tỷ lệ con người**: OpenArm được thiết kế với các tỷ lệ giống con người, được thu nhỏ để phù hợp với người cao khoảng 160-165cm. Điều này mang lại sự cân bằng tối ưu giữa tầm với thực tế và quán tính có thể kiểm soát được, cho phép vận hành an toàn và phản hồi nhanh.

- **Kiến trúc đặt an toàn lên hàng đầu**: Được xây dựng với động cơ QDD có khả năng đảo ngược và độ tuân thủ cao, OpenArm ưu tiên tương tác an toàn giữa con người và robot trong khi vẫn duy trì khả năng tải thực tế (đỉnh 6,0kg / danh định 4,1kg) cho các tác vụ thực tế.

- **Được thiết kế để bền bỉ**: Các thành phần cấu trúc quan trọng được chế tạo từ nhôm và thép không gỉ, đảm bảo hiệu suất ổn định cho việc thu thập dữ liệu lặp đi lặp lại và sử dụng nghiên cứu liên tục.

- **Truy cập và chế tạo hoàn toàn**: Mọi thành phần, từ các chi tiết CNC và vỏ in 3D đến hệ thống dây điện, đều được thiết kế để các nhà nghiên cứu và phòng thí nghiệm cá nhân có thể mua và chế tạo, kèm theo dữ liệu chế tạo đầy đủ.

- **Thực dụng & Chi phí hợp lý**: Với giá 6.500 USD cho một hệ thống hai tay hoàn chỉnh, OpenArm mang lại khả năng cấp nghiên cứu với chi phí chỉ bằng một phần nhỏ so với các robot humanoid truyền thống.

## Yêu cầu về nền tảng

  **Chỉ dành cho Linux**: OpenArm hiện chỉ hoạt động trên Linux. Bộ chuyển đổi USB cho bus CAN không có trình điều khiển cho macOS và chưa được kiểm tra trên Windows.

## Hướng dẫn An toàn

Trước khi vận hành OpenArm, vui lòng đọc [hướng dẫn an toàn chính thức](https://docs.openarm.dev/getting-started/safety-guide). Các điểm chính:

- **Cài đặt an toàn**: Cố định cánh tay vào bề mặt phẳng, ổn định bằng ốc vít hoặc kẹp
- **Khoảng cách an toàn**: Giữ các bộ phận cơ thể và vật thể nằm ngoài phạm vi di chuyển trong quá trình vận hành
- **Thiết bị bảo hộ**: Luôn đeo kính bảo hộ; sử dụng thêm PPE khi cần
- **Giới hạn tải trọng**: Không được vượt quá giới hạn tải trọng quy định (6,0kg đỉnh / 4,1kg danh định cho mỗi cánh tay)
- **Dừng khẩn cấp**: Biết vị trí và cách vận hành thiết bị dừng khẩn cấp
- **Kiểm tra định kỳ**: Kiểm tra các vít lỏng, giới hạn cơ khí bị hỏng, tiếng ồn bất thường và hư hỏng dây điện

## Cấu hình phần cứng

Xem tài liệu phần cứng [OpenArm](https://docs.openarm.dev) chính thức để biết thêm về:

- Danh sách vật tư và nguồn cung
- Hướng dẫn in 3D
- Lắp ráp cơ khí
- Đường dây điện

Các kho phần cứng có sẵn tại [github.com/enactic/openarm](https://github.com/enactic/openarm).

## Cấu hình Bus CAN

OpenArm sử dụng giao tiếp CAN bus với động cơ Damiao. Sau khi bạn đã cắm bộ chuyển đổi CAN bus USB vào máy tính Linux, hãy làm theo [hướng dẫn về động cơ Damiao và CAN bus](./damiao) để cấu hình giao diện.

Cài đặt nhanh:

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

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

## Cài đặt LeRobot 🤗

Theo [Hướng dẫn cài đặt](./installation) của chúng tôi, sau đó cài đặt hỗ trợ động cơ Damiao:

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

## Cách sử dụng

### Cánh tay theo dõi (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()
```

### Cánh tay điều khiển (Teleoperator)

Cánh tay leader được sử dụng cho teleoperation - di chuyển thủ công để điều khiển cánh tay 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()
```

### Điều khiển từ xa

Để điều khiển OpenArm từ xa bằng phương pháp điều khiển 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
```

Sử dụng cùng `--robot.id` và `--teleop.id` như trong quá trình hiệu chuẩn để LeRobot tìm thấy các tệp hiệu chuẩn.

### Điều khiển từ xa hai tay

Để điều khiển từ xa một hệ thống OpenArm hai tay với hai cánh tay dẫn và hai cánh tay theo:

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

### Ghi Dữ Liệu

Để ghi lại một bộ dữ liệu trong quá trình vận hành từ xa:

```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` thêm ngày và giờ của phiên vào tên tập dữ liệu, do đó nó được lưu dưới dạng `my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS`. Xem [hướng dẫn ghi hình](./il_robots#record-a-dataset) để biết về camera, điều khiển bàn phím và phần còn lại của quy trình.

## Tùy chọn cấu hình

### Cấu hình Follower

| Tham số             | Mặc định   | Mô tả                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | Giao diện CAN (ví dụ: `can0`)                               |
| `side`                | `None`    | Bên cánh tay: `"left"`, `"right"`, hoặc `None` cho các giới hạn tùy chỉnh |
| `use_can_fd`          | `True`    | Bật CAN FD để đạt tốc độ truyền dữ liệu cao hơn                        |
| `can_bitrate`         | `1000000` | Tốc độ bit danh định (1 Mbps)                                   |
| `can_data_bitrate`    | `5000000` | Tốc độ bit dữ liệu CAN FD (5 Mbps)                               |
| `max_relative_target` | `None`    | Giới hạn an toàn cho các vị trí đích tương đối                 |
| `position_kp`         | Theo từng khớp | Hệ số khuếch đại tỷ lệ cho điều khiển vị trí                        |
| `position_kd`         | Theo từng khớp | Hệ số lợi đạo hàm của điều khiển vị trí                          |

### Cấu hình Leader

| Tham số          | Mặc định   | Mô tả                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | Giao diện CAN (ví dụ: `can1`)        |
| `manual_control`   | `True`    | Tắt mô-men xoắn cho chuyển động thủ công  |
| `use_can_fd`       | `True`    | Bật CAN FD để đạt tốc độ truyền dữ liệu cao hơn |
| `can_bitrate`      | `1000000` | Tốc độ bit danh định (1 Mbps)            |
| `can_data_bitrate` | `5000000` | Tốc độ bit dữ liệu CAN FD (5 Mbps)        |

## Cấu hình động cơ

OpenArm sử dụng động cơ Damiao với cấu hình mặc định như sau:

| Liên hợp                       | Loại động cơ | Gửi ID | ID nhận |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (Xoay vai)      | DM8009     | 0x01    | 0x11    |
| joint_2 (Nâng vai)     | DM8009     | 0x02    | 0x12    |
| joint_3 (Xoay vai) | DM4340     | 0x03    | 0x13    |
| joint_4 (Uốn khuỷu tay)        | DM4340     | 0x04    | 0x14    |
| joint_5 (Xoay cổ tay)        | DM4310     | 0x05    | 0x15    |
| joint_6 (Góc nghiêng cổ tay)       | DM4310     | 0x06    | 0x16    |
| joint_7 (Xoay cổ tay)    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

## Xử lý sự cố

### Không có phản hồi từ động cơ

1. Kiểm tra các kết nối nguồn điện
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. Chạy chẩn đoán: `lerobot-setup-can --mode=test --interfaces=can0`
4. Xem [hướng dẫn khắc phục sự cố Damiao](./damiao#troubleshooting) để biết thêm chi tiết

### Không tìm thấy giao diện CAN

Đảm bảo giao diện CAN được cấu hình:

```bash
ip link show can0
```

## Tài nguyên

- [Trang web OpenArm](https://openarm.dev)
- [Tài liệu OpenArm](https://docs.openarm.dev)
- [GitHub OpenArm](https://github.com/enactic/openarm)
- [Hướng dẫn an toàn](https://docs.openarm.dev/getting-started/safety-guide)
- [Động cơ Damiao và Bus CAN](./damiao)

