# reBot B601

reBot B601은 Seeed Studio의 모방 학습 및 embodied AI를 위한 오픈소스 로봇 암입니다. 이 구성은 6-DOF 팔로워 암과 그립퍼, 그리고 텔레오퍼레이션을 위한 reBot Arm 102 리더로 이루어져 있습니다.

Follower는 Damiao(DM) 또는 RobStride(RS) 모터를 사용할 수 있습니다. 두 구성 모두 동일한 LeRobot 로봇 유형과 조인트 이름을 사용하며, `--robot.motor_family`로 하드웨어를 선택합니다.

| 빌드                                                              | `motor_family` | 모터                                   | 기본 연결   |
| ------------------------------------------------------------------ | -------------- | ---------------------------------------- | -------------------- |
| [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) | `dm`           | Damiao(`4340P` 베이스, `4310` 손목)     | Damiao 직렬 브리지 |
| [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/) | `rs`           | RobStride(`rs-06` 베이스, `rs-00` 손목) | 네이티브 CAN           |

이 가이드는 단일 암 및 양손(바이매뉴얼) 구성에 대한 하드웨어 설정, 보정, 텔레오퍼레이션 및 녹화를 다룹니다.

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm"
    width="48%"
  />

_B601 팔로워(왼쪽)와 reBot Arm 102 리더(오른쪽). DM과 RS 팔로워는 동일한 관절 레이아웃과 전반적인 외관을 공유하지만 서로 다른 모터를 사용합니다. 이미지는 Seeed Studio의 허락을 받아 사용했습니다._

## 하드웨어 및 안전

팔로워에 따라 Seeed Studio 가이드를 사용하여 모터를 조립, 배선 및 구성하세요: [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) 또는 [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/).

  팔로우어를 안정적인 표면에 고정하고 작업 공간을 비워 두세요. 토크가 비활성화되었거나 프로그램이 연결 해제된 경우, 중력에 의해 팔이 움직일 수 있으므로 팔을 지지해야 합니다. 작동 중 전원 또는 데이터 케이블이 연결 해제되면 프로그램을 중지하고 리더와 팔로우어를 제로 위치로 되돌린 후 다시 연결하고 재시작하세요.

## LeRobot 설치 🤗

[설치 가이드](./installation)를 따르고, reBot 지원을 설치합니다:

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

이 명령은 팔로워용 `motorbridge`와 reBot Arm 102 리더용 `motorbridge-smart-servo`를 설치합니다.

## 하드웨어 연결

DM은 기본적으로 시리얼 브릿지를 사용하며, 선택적으로 네이티브 CAN을 사용할 수 있습니다. RS는 네이티브 CAN을 요구합니다.

| `can_adapter` | 사용                                     | 예시 포트   |
| ------------- | --------------------------------------- | -------------- |
| `damiao`      | Damiao 직렬 브리지; DM 전용           | `/dev/ttyACM0` |
| `socketcan`   | MotorBridge 네이티브 CAN; RS에 필수 | `can0`         |

모터 패밀리가 기본 어댑터를 선택합니다. 대신 네이티브 CAN을 통해 DM을 실행하려면 `--robot.can_adapter=socketcan`을 추가하고 해당 CAN 채널을 `--robot.port`로 사용하세요.

### 시리얼 브리지

`lerobot-find-port`를 사용하여 DM 시리얼 브리지 및 리더 포트 식별합니다. 이름 구분이 어려운 경우 시리얼 장치를 한 번에 하나씩 연결합니다.

```bash
lerobot-find-port
```

  Linux에서는 `brltty`가 시리얼 장치를 캡처하는 경우 `sudo apt remove brltty`를 실행하여 제거해야 합니다. `sudo chmod 666 /dev/ttyACM* /dev/ttyUSB*`를 사용하여 일시적인 접근 권한이 필요할 수도 있습니다.

### 네이티브 CAN

`socketcan` 구성 이름은 플랫폼 간에 유지됩니다. Linux는 SocketCAN을 사용합니다. macOS에는 호환되는 PCAN 어댑터와 MacCAN PCBUSB 런타임이 필요합니다. Windows의 네이티브 CAN 지원은 실험 단계이며 PEAK PCAN 어댑터와 PCAN-Basic이 필요합니다. 설치 세부 사항은 [MotorBridge 플랫폼 설정](https://github.com/motorbridge/motorbridge/tree/v0.5.1)을 참조하세요.

Linux에서는 RS 팔로워를 연결하기 전에 각 네이티브 CAN 인터페이스를 1 Mbps로 구성하세요:

```bash
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
ip -details link show can0
```

`can0`를 CAN 백엔드가 제공하는 채널로 교체하세요. 양팔 네이티브 CAN 구성은 두 팔이 동일한 모터 ID를 사용하기 때문에 `can0`와 `can1`와 같은 별도의 채널이 필요합니다.

## 장치 유형

| 유형                     | 장치                        |
| ------------------------ | ----------------------------- |
| `rebot_b601_follower`    | 단일 팔로워               |
| `bi_rebot_b601_follower` | 양손 팔로어             |
| `rebot_102_leader`       | Single reBot Arm 102 leader   |
| `bi_rebot_102_leader`    | 양수 조작 reBot Arm 102 리더 |

`motor_family`의 기본값은 `dm`입니다. 양팔 구성에서는 각 팔이 자체적인 `left_arm_config.*` 또는 `right_arm_config.*` 설정을 가지며, 모터 패밀리도 독립적으로 선택할 수 있습니다.

## 교정

Calibration은 현재 물리적 포즈를 모터의 제로 위치로 설정하고 LeRobot 캘리브레이션 파일을 저장합니다. 각 팔을 아래에 표시된 제로 위치에 그리퍼가 완전히 닫힌 상태로 배치한 후, 프롬프트가 표시되면 ENTER 키를 누르세요.

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm at its zero position"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm at its zero position"
    width="48%"
  />

_팔로워 제로 위치(왼쪽)와 리더 제로 위치(오른쪽). DM 팔로워가 표시되어 있으며, RS 팔로워는 동일한 관절 구성을 사용합니다._

이후 명령에서 동일한 `--robot.id`와 `--teleop.id`를 사용하여 LeRobot이 저장된 보정을 로드하도록 합니다. 이미 보정이 존재하는 경우, 해당 명령은 기존 보정을 재사용하거나 `c`를 입력하여 다시 보정할 수 있도록 합니다.

### 팔로워

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower
```

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower
```

Calibration은 왼쪽 팔로우어에 대해 실행된 후 오른쪽 팔로우어에 대해 실행됩니다.

```bash
lerobot-calibrate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1
```

RS 팔로우어 2개를 사용하는 경우, 두 family 모두를 `rs`로 설정하고 두 포트에 대해 별도의 네이티브 CAN 채널을 사용하세요. 팔별 보정 파일에는 `_left` 및 `_right` 접미사가 사용됩니다.

### 리더

```bash
lerobot-calibrate \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-calibrate \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## 원격 조작

작은 움직임으로 시작하여 전체 워크스페이스를 사용하기 전에 모든 관절의 방향을 확인하세요.

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## 데이터셋 기록

기록하기 전에 텔레오퍼레이션을 테스트하세요. 카메라를 추가하려면 먼저 다음으로 식별하세요:

```bash
lerobot-find-cameras opencv
```

### 단일 암

이 예제는 OpenCV 카메라 하나를 사용하여 로컬에서 다섯 개의 DM 에피소드를 기록합니다:

```bash
lerobot-record \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --robot.cameras='{"front": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader \
    --dataset.repo_id=your_username/rebot-dm-test \
    --dataset.single_task="Pick up the object" \
    --dataset.num_episodes=5 \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=true
```

RS의 경우 `motor_family`를 `rs`로 변경하고 로봇 포트는 네이티브 CAN 채널로 설정하세요. 모터만 테스트하려면 카메라 인수를 제거하세요.

### 양수

이 DM 예제는 공유된 상단 카메라와 각 팔당 1개의 손목 카메라를 기록합니다. 데이터셋의 카메라 키는 `top`, `left_wrist`, `right_wrist`입니다.

```bash
lerobot-record \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --robot.cameras='{
      top: {
        type: opencv,
        index_or_path: "/dev/video2",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.left_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video0",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.right_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video4",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1 \
    --dataset.repo_id=local/rebot-bimanual-dm-camera-test \
    --dataset.root=/tmp/rebot-bimanual-dm-camera-test \
    --dataset.single_task="Test coordinated movement of both reBot DM arms" \
    --dataset.fps=30 \
    --dataset.num_episodes=2 \
    --dataset.episode_time_s=20 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=false
```

> [!TIP]
> 양손 RS 구성의 경우, 두 모터 패밀리 모두를 `rs`로 설정하고 서로 다른 네이티브 CAN 채널을 사용하세요. 혼합 구성에서는 한 팔에 `dm`을, 다른 팔에 `rs`를 선택할 수 있습니다.

정책을 업로드, 재생, 학습 및 평가하는 방법은 [Imitation Learning for Robots](./il_robots)를 참고하세요.

## 고급 제어

두 빌드 모두 동일한 조인트 이름과 도(degree) 단위의 공개 위치를 노출합니다. LeRobot은 각 계열의 모터 방향 부호를 동작과 관측에 적용하므로, 정책과 텔레오퍼레이터는 모터 부호를 변환할 필요가 없습니다.

- DM은 기본적으로 팔에 MIT 제어, 그립퍼에 `force_pos`를 사용합니다. `gripper_torque_ratio`의 기본값은 `0.07`이며, DM은 `--robot.control_mode=pos_vel`도 지원합니다.
- RS는 MotorBridge가 RobStride에 대해 `force_pos`를 제공하지 않기 때문에 MIT 제어와 힘 제한 임피던스 그립터를 사용합니다. 측정된 그립터 움직임에 따라, 명령 토크는 이동 중에는 `3.5` N·m, 유지 중에는 `1.0` N·m로 제한됩니다. 피드백이 실패하면 LeRobot은 그립터 토크를 0으로 명령한 후 팔을 비활성화합니다.
- `mit_kp`, `mit_kd`, `pos_vel_velocity`는 각 관절에 대해 하나의 스칼라 또는 관절 키 기반 매핑을 허용합니다.
- `max_relative_target`은 명령 값과 최신 측정 위치 사이의 차이를 제한합니다. 예를 들어, `--robot.max_relative_target=5.0`은 모든 명령된 관절의 변화를 5도로 제한합니다.
- `joint_limits`은 공개된 관절의 각도에서 패밀리 기본값을 선택적으로 재정의합니다.

팔로워 모터의 방향은 모터 패밀리에서 내부적으로 선택됩니다. 텔레오퍼레이션 조인트가 잘못된 방향으로 이동하는 경우, 리더의 `joint_directions`는 여전히 설정할 수 있습니다.

  DM과 RS는 동일한 좌표 규약을 사용하지만, 기하 구조, 이득, 동역학이 다릅니다. 빌드 간에 정책과 데이터셋을 이전하기 전에 이를 검증하세요.

## 문제 해결

| 문제                                  | 확인                                                                                                       |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 시리얼 장치가 없거나 사용 중입니다         | 기기 하나씩 다시 연결하고, `lerobot-find-port`를 다시 실행한 후, 권한을 확인하고, Linux에서는 `brltty`를 제거합니다. |
| 네이티브 CAN은 연결할 수 없습니다                | 어댑터 런타임, 채널 이름, 1 Mbps 비트레이트, 모터 출력, CAN 배선 및 종단을 확인하세요.          |
| 원격 조작 조인트가 잘못된 방향으로 이동합니다 | 프로그램을 중지하고 `motor_family`를 확인한 후 리더의 `joint_directions`를 확인하세요.                        |
| Calibration은 재사용되지 않습니다                | 교정 시 사용했던 동일한 로봇 또는 텔레오퍼레이터 `id`를 사용하세요.                                   |

조립, 배선 및 하드웨어 관련 진단에 대해서는 [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) 및 [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/)에 대한 Seeed Studio 가이드를 참고하세요.

