# Reachy 2

Reachy 2, Pollen Robotics tarafından üretilen, özellikle vücutlanmış yapay zeka ve gerçek dünya uygulamalarının geliştirilmesi için tasarlanmış açık kaynaklı bir humanoid robottur. Platform hakkında daha fazla bilgi için [Pollen Robotics web sitesini](https://www.pollen-robotics.com/reachy/) inceleyebilir veya [Reachy 2 dokümantasyonuna](https://docs.pollen-robotics.com/) erişebilirsiniz!

## Reachy 2'yi teleoperate edin

Şu anda Reachy 2'yi teleoperate etmenin iki yolu var:

- Pollen Robotics'ın VR teleoperasyonu (LeRobot'ta yer almaz).
- Robot-robot teleoperasyonu (bir Reachy 2'yi kullanarak diğerini kontrol edin).

## Reachy 2 Simülasyonu

**(Sadece Linux)** Sağlanan [Docker görüntüsü](https://hub.docker.com/r/pollenrobotics/reachy2_core) ile Reachy 2'yi simülasyonda (Gazebo veya MuJoCo) çalıştırabilirsiniz.

1. [Docker Engine](https://docs.docker.com/engine/) kurun.
2. Run (MuJoCo için):

```
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]
> MuJoCo yavaş çalışıyorsa (düşük simülasyon frekansı), performansı iyileştirmek için önceki komutun sonuna `-e LD_LIBRARY_PATH="/opt/host-libs:$LD_LIBRARY_PATH" \` ekleyin:
>
> ```
> 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
> ```

## Kurulum

### Ön koşullar

- Robotunuzda, **hizmet görüntülerinin** minimum sürümleri karşıladığından emin olun:
  - **reachy2-core >= 1.7.5.2**
  - **webrtc >= 2.0.1.1**

Ardından, VR teleoperasyonu kullanmak istiyorsanız:

- [Reachy 2 teleoperation uygulamasını](https://docs.pollen-robotics.com/teleoperation/teleoperation-introduction/discover-teleoperation/) yükleyin. **>=v1.2.0** sürümünü kullanın

İki bilgisayar kullanmanızı öneririz: biri teleoperasyon için (Windows gereklidir), diğeri ise LeRobot ile kayıt için.

### LeRobot'u Yükle

LeRobot'u yüklemek için [kurulum talimatlarını](https://github.com/huggingface/lerobot#installation) izleyin.

Reachy 2 bağımlılıklarıyla LeRobot'u yükleyin:

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

## Adım 1: Kayıt

### Reachy 2 IP adresini alın

Teleoperasyon ve veri kaydına başlamadan önce [robotun IP adresini](https://docs.pollen-robotics.com/getting-started/setup-reachy2/connect-reachy2/) bulun. Tüm cihazların (PC ve robot) **Ethernet** üzerinden bağlanmasını şiddetle öneririz.

### Tanıtım kaydı

LeRobot'un `lerobot-record` komutunu kayıt oturumlarını yönetmek için kullanın. Daha önce burada belgelenen `pollen_data_acquisition_server` iş akışı artık kullanılamıyor.

Reachy 2 VR teleoperation uygulamasını kullanırken "Standard session" seçeneğini seçin. VR uygulaması robotun hareketini kontrol ederken `lerobot-record` veri setini yönetir ve bölümleri başlatır ve durdurur.

### `lerobot-record` ile kayıt yapın

Reachy 2, LeRobot'un kayıt özellikleri tarafından tam olarak desteklenmektedir.

**Örnek: mobil taban olmadan kayıt başlatma:** Önce record betiğinin içe aktarmalarına reachy2 ve reachy2_teleoperator ekleyin. Ardından aşağıdaki komutu kullanabilirsiniz:

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

#### Belirli Seçenekler

**Genişletilmiş kurulum özeti (tüm seçenekler dahil):**

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

LeRobot robot.send_action() fonksiyonunun robota komut gönderip göndermediğini belirler. VR teleoperation uygulaması kullanılırken, uygulama zaten komut gönderdiği için bu değer **Must** false olarak ayarlanmalıdır.

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

Teleoperatörün robotun hedef konumunu mu yoksa mevcut konumunu mu okuduğunu belirleyin. Uyumlu bir Reachy 2 kullanılarak başka bir Reachy 2 kontrol ediliyorsa, bu değer true olarak ayarlanmalıdır.

##### İlgili kısımları kullanın

İlk testlerimizden, yalnızca bazı eklem hareket ederken **tüm** eklemelerin kaydedilmesinin belirli politikalarla model kalitesini düşürebildiğini gördük. Bunu önlemek için, belirli parçaları kaydetme ve oynatma işlemlerinden dışarıda bırakmak için şunu kullanabilirsiniz:

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

`<part>` aşağıdakilerden biridir: `mobile_base`, `l_arm`, `r_arm", `neck`, `antennas`. Bu parametre, ilgili parçanın gözlemlerde kaydedilip kaydedilmeyeceğini belirler. Ayarlanmazsa True.

Varsayılan olarak, **tüm parçalar kaydedilir**.

Aynı parça bazlı mekanizma `reachy2_teleoperator` içinde de mevcuttur.

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

`<part>` aşağıdakilerden biri olmalıdır: `mobile_base`, `l_arm`, `r_arm", `neck`, `antennas`. İlgili parçanın eylemlerde kaydedilip kaydedilmediğini belirler. Ayarlanmamışsa True.

> **Önemli:** Belirli bir oturumda, **etkin parçalar** hem robotta hem de teleoperatörde eşleşmelidir. Örneğin, robot `--robot.with_mobile_base=false` ile çalışıyorsa, teleoperatör aynı parçayı `--teleoperator.with_mobile_base=false` ile devre dışı bırakmalıdır.

##### İlgili kameraları kullanın

**cameras** için de aynı işlemi yapabilirsiniz. Her kamerayı varsayılan parametrelerle etkinleştirmek veya devre dışı bırakmak için şunu kullanın:

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

Varsayılan olarak hiçbir kamera kaydedilmez, tüm kamera argümanları `false` olarak ayarlanır. İsterseniz, Reachy 2'nin kameraları için özel `width` ve `height` parametrelerini `--robot.camera_width` & `--robot.camera_height` argümanını kullanarak belirleyebilirsiniz:

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

Bu, yukarıdaki bool argümanları tarafından etkinleştirilen tüm 3 varsayılan robot kamerasının çözünürlüğünü değiştirecektir.

İsterseniz, robottaki kameraların dışında ek kameraları da şu şekilde ekleyebilirsiniz:

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

## Adım 2: Yeniden oynatma

Robotun veri setindeki parçalarla aynı şekilde yapılandırıldığından emin olun:

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

## Adım 3: Eğitim

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

## Adım 4: Değerlendirme

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

Taşınan bölümler:

[ (İsteğe bağlı ancak önerilir) pollen_data_acquisition_server'ı yükleyin ]

[ Seçenek 1: Pollen veri edinme sunucusunun kullanılması (VR teleop için önerilir) ]

[ Seçenek 2: lerobot.record kullanma ]

