# Reachy 2

Reachy 2 là một robot hình người mã nguồn mở do Pollen Robotics sản xuất, được thiết kế đặc biệt cho việc phát triển AI có thân xác (embodied AI) và các ứng dụng thực tế. Hãy xem [trang web của Pollen Robotics](https://www.pollen-robotics.com/reachy/), hoặc truy cập [tài liệu của Reachy 2](https://docs.pollen-robotics.com/) để biết thêm thông tin về nền tảng này!

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

Hiện tại, có hai cách để điều khiển từ xa Reachy 2:

- VR teleoperation của Pollen Robotics (không có trong LeRobot).
- Teleoperation giữa các robot (dùng một Reachy 2 để điều khiển một robot khác).

## Mô phỏng Reachy 2

**(Chỉ dành cho Linux)** Bạn có thể chạy Reachy 2 trong môi trường mô phỏng (Gazebo hoặc MuJoCo) bằng cách sử dụng [ảnh Docker](https://hub.docker.com/r/pollenrobotics/reachy2_core) được cung cấp.

1. Cài đặt [Docker Engine](https://docs.docker.com/engine/).
2. Run (cho MuJoCo):

```
docker run --rm -it \
  --name reachy \
  --privileged \
  --network host \
  --ipc host \
  --device-cgroup-rule='c 189:* rwm' \
  --group-add audio \
  -e ROS_DOMAIN_ID="$ROS_DOMAIN_ID" \
  -e DISPLAY="$DISPLAY" \
  -e RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity}]: {message}" \
  -e REACHY2_CORE_SERVICE_FAKE="${REACHY2_CORE_SERVICE_FAKE:-true}" \
  -v /dev:/dev \
  -v "$HOME/.reachy_config":/home/reachy/.reachy_config_override \
  -v "$HOME/.reachy.log":/home/reachy/.ros/log \
  -v /usr/lib/x86_64-linux-gnu:/opt/host-libs \
  --entrypoint /package/launch.sh \
  pollenrobotics/reachy2_core:1.7.5.9_deploy \
  start_rviz:=true start_sdk_server:=true mujoco:=true
```

> [!NOTE]
> Nếu MuJoCo chạy chậm (tần số mô phỏng thấp), hãy thêm `-e LD_LIBRARY_PATH="/opt/host-libs:$LD_LIBRARY_PATH" \` vào lệnh trước đó để cải thiện hiệu suất:
>
> ```
> docker run --rm -it \
>   --name reachy \
>   --privileged \
>   --network host \
>   --ipc host \
>   --device-cgroup-rule='c 189:* rwm' \
>   --group-add audio \
>   -e ROS_DOMAIN_ID="$ROS_DOMAIN_ID" \
>   -e DISPLAY="$DISPLAY" \
>   -e RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity}]: {message}" \
>   -e REACHY2_CORE_SERVICE_FAKE="${REACHY2_CORE_SERVICE_FAKE:-true}" \
>   -e LD_LIBRARY_PATH="/opt/host-libs:$LD_LIBRARY_PATH" \
>   -v /dev:/dev \
>   -v "$HOME/.reachy_config":/home/reachy/.reachy_config_override \
>   -v "$HOME/.reachy.log":/home/reachy/.ros/log \
>   -v /usr/lib/x86_64-linux-gnu:/opt/host-libs \
>   --entrypoint /package/launch.sh \
>   pollenrobotics/reachy2_core:1.7.5.9_deploy \
>   start_rviz:=true start_sdk_server:=true mujoco:=true
> ```

## Cài đặt

### Yêu cầu tiên quyết

- Trên robot của bạn, kiểm tra xem **ảnh dịch vụ** có đáp ứng các phiên bản tối thiểu hay không:
  - **reachy2-core >= 1.7.5.2**
  - **webrtc >= 2.0.1.1**

Sau đó, nếu bạn muốn sử dụng điều khiển từ xa VR:

- Cài đặt [ứng dụng teleoperation Reachy 2](https://docs.pollen-robotics.com/teleoperation/teleoperation-introduction/discover-teleoperation/). Sử dụng phiên bản **>=v1.2.0**

Chúng tôi khuyến nghị sử dụng hai máy tính: một máy để điều khiển từ xa (yêu cầu hệ điều hành Windows) và một máy khác để ghi hình với LeRobot.

### Cài đặt LeRobot

Làm theo [các hướng dẫn cài đặt](https://github.com/huggingface/lerobot#installation) để cài đặt LeRobot.

Cài đặt LeRobot với các phụ thuộc của Reachy 2:

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

## Bước 1: Ghi âm

### Lấy địa chỉ IP của Reachy 2

Trước khi bắt đầu điều khiển từ xa và ghi lại dữ liệu, hãy tìm [địa chỉ IP của robot](https://docs.pollen-robotics.com/getting-started/setup-reachy2/connect-reachy2/). Chúng tôi khuyến nghị mạnh mẽ việc kết nối tất cả các thiết bị (PC và robot) qua **Ethernet**.

### Bản ghi buổi ra mắt

Sử dụng lệnh `lerobot-record` của LeRobot để quản lý các phiên ghi hình. Quy trình `pollen_data_acquisition_server` được tài liệu hóa trước đây tại đây không còn khả dụng nữa.

Khi sử dụng ứng dụng teleoperation VR Reachy 2, hãy chọn "Standard session". Ứng dụng VR điều khiển chuyển động của robot, trong khi `lerobot-record` quản lý bộ dữ liệu và bắt đầu cũng như kết thúc các episode.

### Ghi lại bằng `lerobot-record`

Reachy 2 được hỗ trợ đầy đủ bởi các tính năng ghi hình của LeRobot.

**Ví dụ: bắt đầu ghi âm mà không có đế di động:** Trước tiên, thêm reachy2 và reachy2_teleoperator vào phần import của script ghi âm. Sau đó, bạn có thể sử dụng lệnh sau:

```bash
lerobot-record \
    --robot.type=reachy2 \
    --robot.ip_address=192.168.0.200 \
    --robot.id=r2-0000 \
    --robot.use_external_commands=true \
    --robot.with_mobile_base=false \
    --teleop.type=reachy2_teleoperator \
    --teleop.ip_address=192.168.0.200 \
    --teleop.with_mobile_base=false \
    --robot.with_torso_camera=true \
    --dataset.repo_id=pollen_robotics/record_test \
    --dataset.single_task="Reachy 2 recording test" \
    --dataset.num_episodes=1 \
    --dataset.episode_time_s=5 \
    --dataset.fps=15 \
    --dataset.push_to_hub=true \
    --dataset.private=true \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2 \
    # --dataset.rgb_encoder.vcodec=auto \
    --display_data=true
```

#### Tùy chọn cụ thể

**Tổng quan về cài đặt mở rộng (bao gồm tất cả các tùy chọn):**

```bash
lerobot-record \
    --robot.type=reachy2 \
    --robot.ip_address=192.168.0.200 \
    --robot.use_external_commands=true \
    --robot.with_mobile_base=true \
    --robot.with_l_arm=true \
    --robot.with_r_arm=true \
    --robot.with_neck=true \
    --robot.with_antennas=true \
    --robot.with_left_teleop_camera=true \
    --robot.with_right_teleop_camera=true \
    --robot.with_torso_camera=false \
    --robot.camera_width=640 \
    --robot.camera_height=480 \
    --robot.disable_torque_on_disconnect=false \
    --robot.max_relative_target=5.0 \
    --teleop.type=reachy2_teleoperator \
    --teleop.ip_address=192.168.0.200 \
    --teleop.use_present_position=false \
    --teleop.with_mobile_base=false \
    --teleop.with_l_arm=true \
    --teleop.with_r_arm=true \
    --teleop.with_neck=true \
    --teleop.with_antennas=true \
    --dataset.repo_id=pollen_robotics/record_test \
    --dataset.single_task="Reachy 2 recording test" \
    --dataset.num_episodes=1 \
    --dataset.episode_time_s=5 \
    --dataset.fps=15 \
    --dataset.push_to_hub=true \
    --dataset.private=true \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2 \
    # --dataset.rgb_encoder.vcodec=auto \
    --display_data=true
```

##### `--robot.use_external_commands`

Xác định xem LeRobot robot.send_action() có gửi lệnh đến robot hay không. **Bắt buộc** phải đặt thành false khi sử dụng ứng dụng teleoperation VR, vì ứng dụng đã gửi lệnh.

##### `--teleop.use_present_position`

Xác định xem người vận hành từ xa đọc mục tiêu hay vị trí hiện tại của robot. Phải được đặt thành true nếu một Reachy 2 tuân thủ được sử dụng để điều khiển một robot khác.

##### Sử dụng các phần liên quan

Từ các bài kiểm tra ban đầu của chúng tôi, việc ghi lại **tất cả** các khớp khi chỉ một số khớp đang di chuyển có thể làm giảm chất lượng mô hình với một số chính sách nhất định. Để tránh điều này, bạn có thể loại trừ các phần cụ thể khỏi việc ghi và phát lại bằng cách sử dụng:

```bash
--robot.with_<part>=false
```

với `<part>` là một trong các giá trị: `mobile_base`, `l_arm`, `r_arm", `neck`, `antennas`. Tham số này xác định xem phần tương ứng có được ghi lại trong các quan sát hay không. Mặc định là True nếu không được đặt.

Mặc định, **tất cả các phần đều được ghi lại**.

Cơ chế theo từng phần tương tự cũng có sẵn trong `reachy2_teleoperator`.

```bash
--teleop.with\_<part>
```

với `<part>` là một trong các giá trị: `mobile_base`, `l_arm`, `r_arm", `neck`, `antennas`. Xác định xem phần tương ứng có được ghi lại trong các hành động hay không. True nếu không được đặt.

> **Quan trọng:** Trong một phiên nhất định, **các phần được bật phải khớp nhau** trên cả robot và thiết bị điều khiển từ xa. Ví dụ, nếu robot chạy với `--robot.with_mobile_base=false`, thiết bị điều khiển từ xa phải tắt cùng phần đó `--teleoperator.with_mobile_base=false`.

##### Sử dụng các camera phù hợp

Bạn có thể thực hiện tương tự cho **cameras**. Bật hoặc tắt từng camera với các tham số mặc định bằng cách sử dụng:

```bash
--robot.with_left_teleop_camera=<true|false> \
--robot.with_right_teleop_camera=<true|false> \
--robot.with_torso_camera=<true|false>
```

Mặc định, không có camera nào được ghi lại, tất cả các đối số camera được đặt thành `false`. Nếu bạn muốn, bạn có thể sử dụng các tham số `width` và `height` tùy chỉnh cho các camera của Reachy 2 bằng cách sử dụng đối số `--robot.camera_width` & `--robot.camera_height`:

```bash
--robot.camera_width=1920 \
--robot.camera_height=1080
```

Điều này sẽ thay đổi độ phân giải của cả 3 camera robot mặc định (được bật bởi các đối số bool ở trên).

Nếu bạn muốn, bạn có thể thêm các camera bổ sung ngoài những camera trên robot như bình thường bằng cách sử dụng:

```bash
--robot.cameras="{ extra: {type: opencv, index_or_path: 42, width: 640, height: 480, fps: 30}}" \
```

## Bước 2: Phát lại

Đảm bảo robot được cấu hình với các bộ phận giống như trong bộ dữ liệu:

```bash
lerobot-replay \
    --robot.type=reachy2 \
    --robot.ip_address=192.168.0.200 \
    --robot.use_external_commands=false \
    --robot.with_mobile_base=false \
    --dataset.repo_id=pollen_robotics/record_test \
    --dataset.episode=0
```

## Bước 3: Huấn luyện

```bash
lerobot-train \
  --dataset.repo_id=pollen_robotics/record_test \
  --policy.type=act \
  --output_dir=outputs/train/reachy2_test \
  --job_name=reachy2 \
  --policy.device=mps \
  --trackio.enable=true \
  --policy.repo_id=pollen_robotics/record_test_policy
```

## Bước 4: Đánh giá

```bash
lerobot-eval \
  --robot.type=reachy2 \
  --robot.ip_address=192.168.0.200 \
  --dataset.repo_id=pollen_robotics/eval_record_test \
  --dataset.single_task="Evaluate reachy2 policy" \
  --dataset.num_episodes=10 \
  --policy.path=outputs/train/reachy2_test/checkpoints/last/pretrained_model
```

Các phần đã được chuyển:

[ (Tùy chọn nhưng được khuyến nghị) Cài đặt pollen_data_acquisition_server ]

[ Tùy chọn 1: Sử dụng máy chủ thu thập dữ liệu Pollen (khuyến nghị cho teleop VR) ]

[ Tùy chọn 2: Sử dụng lerobot.record ]

