13텔레오퍼레이션
리더 암(Star Arm 102)·VR·휴대폰·게임패드로 reBot 을 원격 조종하는 구조와 지연·안전 문제를 다룹니다.
텔레오퍼레이션이란#
텔레오퍼레이션(teleoperation, 원격 조종) 은 사람이 어떤 입력 장치를 움직이면, 그 움직임을 읽어서 로봇팔에 실시간으로 명령으로 보내는 방식입니다. 입력 장치를 리더(leader), 따라 움직이는 로봇을 팔로워(follower) 라고 부릅니다. reBot-DevArm 에서는 B601-RS 또는 B601-DM 이 팔로워입니다.
구조는 놀랄 만큼 단순합니다. 아래 반복문이 초당 수십 번 돌아갑니다.
while True:
action = leader.get_action() # ① 리더의 현재 자세를 읽는다
follower.send_action(action) # ② 팔로워에게 그 자세로 가라고 명령한다다음 장들에서 만들 LeRobot 데이터셋의 action(정답 행동) 이 바로 ① 에서 읽은 리더의 값입니다. 즉 텔레오퍼레이션을 하는 것 자체가 데이터 수집입니다. 사람이 잘 조종해야 좋은 데이터가 나오고, 좋은 데이터가 있어야 좋은 정책(16장)이 나옵니다.
reBot 에서 쓸 수 있는 리더는 크게 네 갈래입니다. 이 장에서 하나씩 살펴봅니다.
| 방식 | 리더 장치 | 무엇을 맞추나 | 출처 · 상태 |
|---|---|---|---|
| 관절 대 관절 | 리더 암 (Star Arm 102 / reBot Arm 102) | 관절 각도를 그대로 | Seeed 공식 LeRobot 가이드 |
| 손 자세 → IK | VR 컨트롤러 (PICO 4) | 손의 위치·방향 → 역기구학 | README 로드맵 "Done", 외부 저장소 |
| 상대 자세 → IK | iPhone · HEBI Mobile I/O · Meta Quest | 누른 순간부터의 변화량 | 커뮤니티 기여 (B601-RS) |
| 속도 명령 → IK | 게임패드 | 스틱 기울기 = 이동 속도 | 커뮤니티 기여 (ROS 2, 시뮬레이션 전용 테스트) |
먼저 시뮬레이터에서 체험하기#
실물을 켜기 전에 리더-팔로워의 감을 잡아 두면 사고를 크게 줄일 수 있습니다. 시뮬레이터는 기구학만 계산하므로(중력·마찰 없음) 마음껏 실수해도 됩니다.
- 3D 시뮬레이터를 열고 텔레오퍼 탭을 고릅니다. 상단에서 RS / DM 모델을 골라 둡니다.
- 리더 암 표시 & 추종 시작 을 켭니다. 화면에 반투명한 리더 암과 불투명한 팔로워 암이 겹쳐 나타납니다.
- 탭 안의 리더 슬라이더로 joint1(허리)을 천천히 좌우로 움직여 보세요. 팔로워가 살짝 늦게 따라옵니다.
- 추종 지연(ms) 슬라이더를 0 → 80 → 300 ms 로 바꿔 가며 같은 동작을 반복합니다. 지연이 커질수록 리더와 팔로워 사이가 벌어지고, 리더를 멈춘 뒤에도 팔로워가 한참 뒤에 도착합니다.
- 이번에는 joint1 을 빠르게 왕복시켜 보세요. 지연 300 ms 에서는 팔로워가 왕복의 끝까지 가기도 전에 방향을 바꿉니다 — 실물에서는 이때 사람이 "왜 안 따라오지?" 하고 더 크게 움직이게 되어 동작이 거칠어집니다.
- 리더를 관절 한계 근처로 보내 보세요. 한계를 넘는 값은 잘리고 경고가 표시됩니다. 실물에서 이 상황은 모터 과부하나 충돌로 이어집니다.
지연이 있는 시스템에서는 천천히, 일정한 속도로 움직이는 것이 정답입니다. 이 습관은 15장의 "좋은 시연 조건" 과 그대로 이어집니다.
리더 암 — Star Arm 102 (reBot Arm 102)#
가장 기본적이고 공식 가이드가 갖춰진 방식은 작은 리더 암을 손으로 움직이는 것입니다. 리더 암의 관절 각도를 읽어 reBot 의 같은 번호 관절로 보냅니다.
어떤 제품인가#
reBot README 의 Leader Arm (Optional) 항목은 Seeed 스토어의 Star Arm 102 상품을 리더 암으로 안내하고, 12V 10A 전원(SO-ARM101 의 12V 어댑터도 사용 가능)을 함께 구입하라고 적고 있습니다. Star Arm 102 는 홍콩의 Fashion Star 가 만든 오픈소스 6+1 자유도 팔 시리즈입니다(GitHub).
| 항목 | Star Arm 102-LD | Star Arm 102-HD | Star Arm 102-FL |
|---|---|---|---|
| 역할 | 리더 (가벼움, 관절이 자유롭게 움직임) | 리더 (자세 유지형) | 팔로워 |
| 전원 | 12V@3A | 12V@5A | 12V@8A |
| 도달 거리 | 420 mm | 420 mm | 420 mm |
| 엔코더 | 12비트 자기 엔코더 | 12비트 자기 엔코더 | — |
| 통신 | UART / UC-01 | UART / UC-01 | UART / UC-01 |
(값은 Star Arm 102 저장소 사양표 기준입니다. 변동될 수 있으니 구매 전 원문을 확인하세요.)
reBot 의 팔(도달 754~767 mm)보다 리더(420 mm)가 훨씬 작습니다. 그래도 문제가 없는 이유는 위치가 아니라 관절 각도를 맞추기 때문입니다. 관절 1번이 30° 돌면 팔로워 관절 1번도 30° 돕니다. 팔 길이가 달라도 같은 "모양" 이 됩니다.
호환 상태를 정확히 알기#
이름이 여러 개라 헷갈리기 쉬우니 정리해 둡니다.
- Seeed 위키와 LeRobot 은 이 리더를 reBot Arm 102 (leader) 라고 부릅니다.
- reBot README 의 Leader Arm Compatibility 표에는 Star Arm 102-LD 가 "Open to compatibility integration" 으로 올라 있습니다.
- Star Arm 102 저장소의 reBot 페이지는 상태를 "B601-DM·B601-RS 용 upstream LeRobot 안내가 있음, 자체 벤치 재검증은 하지 않음" 이라고 적고, 모든 LD·HD 리비전에 대한 일괄 보증은 아니다, HD 의 버튼·잠금 기능은 별개 라고 밝힙니다.
Seeed 가 안내하는 리더 암 + 공식 LeRobot 가이드 조합은 문서화되어 있습니다. 다만 HD 모델이나 다른 리비전은 별도 확인이 필요합니다. 구매 전 README와 Star Arm 102 의 reBot 연동 문서를 확인하세요.
LeRobot 에서의 이름#
리더 암은 USB-UART 모듈로 연결되어 보통 /dev/ttyUSB0 으로 보입니다. 팔로워는 DM 이 Damiao 시리얼 브리지(/dev/ttyACM0), RS 가 네이티브 CAN(can0) 입니다. 장치 이름은 어느 LeRobot 을 쓰느냐에 따라 다릅니다.
| 출처 | 리더 타입 | 팔로워 타입 |
|---|---|---|
| Seeed 위키 (DM) — Seeed 포크 | rebot_arm_102_leader | seeed_b601_dm_follower |
| Seeed 위키 (RS) — Seeed 포크 | rebot_arm_102_leader | seeed_b601_rs_follower |
| LeRobot 공식 문서 — upstream | rebot_102_leader | rebot_b601_follower + --robot.motor_family=dm/rs |
Seeed 위키(DM) 의 텔레오퍼레이션 명령은 다음과 같습니다.
sudo chmod 666 /dev/ttyUSB* # 리더 암
sudo chmod 666 /dev/ttyACM* # 팔로워 암 (시리얼 브리지)
lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--teleop.type=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leaderRS 는 먼저 can0 를 1 Mbps 로 올린 뒤 --robot.type=seeed_b601_rs_follower --robot.port=can0 --robot.can_adapter=socketcan 으로 바꿉니다. 설치와 캘리브레이션은 15장에서 순서대로 다룹니다. 명령은 명령어 생성기로도 만들 수 있습니다.
- 캘리브레이션을 시작하면 리더 서보의 현재 위치가 0 으로 재설정됩니다. 그래서 반드시 위키 사진의 영점 자세(그리퍼 완전히 닫힘)에 맞춘 뒤 Enter 를 누릅니다.
- 관절 한계(
joint_ranges)와 방향은 캘리브레이션이 아니라 설정 파일config_rebot_arm_102_leader.py에서 옵니다. 방향이 반대면 다시 캘리브레이션하지 말고 설정을 고치라고 안내합니다.
Seeed 위키는 텔레오퍼레이션 중 리더·팔로워의 전원이 끊기거나, 접촉이 불량하거나, 신호선이 빠지면 먼저 프로그램을 멈추고 팔을 영점(홈) 자세로 되돌린 뒤 전원을 다시 연결하고 재시작하라고 강하게 경고합니다. 그대로 이어서 돌리면 데이터가 꼬여 팔이 폭주할 수 있습니다.
그리고 전원 전압을 다시 확인하세요. 리더는 12V, 팔로워는 RS 48V / DM 24V 입니다. 세 가지 어댑터를 바꿔 꽂지 않도록 라벨을 붙여 두면 좋습니다.
VR 텔레오퍼레이션 — PICO 4#
README 로드맵(B601-DM)의 VR Teleoperation 항목은 "PICO 4 VR-based bilateral teleoperation — Done" 이고, 구현은 외부 저장소 lerobot-teleoperator-rebot-vr 입니다. 저장소 설명을 보면 여기서 "bilateral" 은 양팔(dual-arm) 동시 조작을 뜻합니다(힘 되먹임 의미가 아님).
리더 암과 가장 큰 차이는 관절이 아니라 손의 자세(위치+방향)를 넘긴다는 점입니다. 컨트롤러의 자세를 로봇 좌표로 바꾼 다음 역기구학(IK) 으로 관절각을 계산합니다(11장).
| 구성 | 내용 |
|---|---|
| 대상 | reBot B601-DM, Linux, Python 3.12+, LeRobot 0.6.x |
| 입력 | PICO 4 컨트롤러 자세·버튼 (개발자 모드 + USB 디버깅, 송신 앱 설치) |
| IK | 분할 IK: q1~q3 은 joint4 피벗 위치를 따라가는 QP, q4~q6 은 손목 방향을 닫힌 해로 |
| 모터 명령 | MIT(중력 피드포워드 포함) 또는 POS_VEL 모드 |
| 단일/양팔 | 둘 다 지원. 양팔은 CAN 버스 2개, 나란히 같은 방향으로 놓아야 함 |
분할 IK 는 "위치 문제와 방향 문제를 나눠 푼다" 는 고전적인 아이디어입니다. 어깨·팔꿈치(q1~q3)가 손목 위치를, 손목 3축(q4~q6)이 방향을 맡으니 손목을 비틀어도 어깨 위치 추종이 흔들리지 않습니다.
| 컨트롤러 입력 | 동작 |
|---|---|
| Grip (꾹 누르기) | 누르고 있는 동안만 따라옴. 놓으면 그 자리에서 정지 |
| Trigger | 그리퍼 개폐 (Grip 과 독립) |
| 오른쪽 A / 왼쪽 X | 해당 팔을 초기 자세로 복귀 |
| 오른쪽 B / 왼쪽 Y | 해당 팔 6관절을 0 으로, 그리퍼 닫기 |
- 설정에 따라 Grip 을 누르지 않아도 시작할 때 팔이 스스로 움직일 수 있습니다. 영점·관절 방향·작업 공간을 먼저 확인하고 저속 점검(
--startup-zero-test, 0.25 rad/s 이하)부터 하세요. - 종료 시 기본으로 모터가 꺼져 팔이 떨어질 수 있습니다. 받침대와 비상 정지를 준비하세요.
- MIT 모드는 실험적이며
mit_torque_limit_nm은 피드포워드 토크만 제한합니다. - 양팔 사이 충돌 감지는 없습니다.
휴대폰 · Quest 텔레오퍼레이션 — 상대 자세 매핑#
README 의 B601-RS 커뮤니티 기여 표에는 rebot-phone-teleop 이 올라 있습니다. iPhone 앱(SwiftUI + ARKit), HEBI Mobile I/O 앱, Meta Quest(브라우저 WebXR, 패스스루) 중 하나를 손에 들고 움직이면 그리퍼가 따라옵니다. B601-RS 와 iPhone 16 Pro Max 로 실물 검증했고, HEBI·Quest 경로는 더 새롭고 실물 테스트가 적다고 밝힙니다.
왜 "상대" 자세인가#
휴대폰의 절대 위치를 그대로 로봇 좌표에 넣으면, 사람이 서 있는 위치에 따라 팔이 엉뚱한 곳으로 튀어 갑니다. 그래서 TidyBot++(CoRL 2024) 방식을 따라 버튼(데드맨)을 누른 순간을 기준점으로 삼고, 그 뒤의 변화량만 그리퍼에 더합니다.
목표 위치 = 누른 순간의 그리퍼 위치 + A · (지금 휴대폰 위치 − 누른 순간 휴대폰 위치)A 는 휴대폰 세계 좌표를 로봇 베이스 좌표로 돌려 주는 행렬입니다. 회전도 같은 방식으로 "누른 순간부터 얼마나 돌았는지" 만 적용합니다. 버튼을 떼고 손을 편한 곳으로 옮긴 뒤 다시 누르면 이어서 조종할 수 있습니다 — 마우스를 들어 옮기는 것과 같은 클러치(clutch) 동작입니다.
서버 쪽 구성#
CAN 버스에 연결된 PC(또는 Jetson·라즈베리 파이)에서 서버가 돌며 다음을 합니다.
- 200 Hz MIT 스트리밍 드라이버 — 가속도를 제한한 목표값을 200 Hz 로 보냄
- 중력 피드포워드 — 팔 무게를 버틸 토크를 미리 더해 줌(5장의
τ_ff) - 공식 RS URDF 위에서 감쇠 최소제곱(DLS) IK
- 관절 한계·테이블·작업 공간 검사, 그리퍼 스톨 보호
- 연결만으로는 모터를 읽기만 합니다. 모터 켜기는 팔 옆 PC 의 제어 페이지에서만 됩니다.
- 기기마다 페어링이 필요하고, 휴대폰·헤드셋 동작 허용은 15분 단위로 PC 에서 직접 켭니다.
- 데드맨을 누르고 있어야 움직입니다. 자세 데이터가 끊기면 0.15~0.3초 안에 멈추고, 3초간 데이터가 없으면 연결이 끊깁니다.
- 관절이 명령보다 15° 넘게 0.4초 이상 뒤처지거나, 피드백이 없거나, 모터가 80 °C 를 넘으면 고장으로 보고 그 자리에 고정합니다.
- 이 보호는 모두 소프트웨어입니다. 저장소는 팔의 전원 스위치를 비상 정지로 쓰라고 안내합니다.
게임패드 · 기타 방식#
- 게임패드 IK 텔레오퍼(커뮤니티, ROS 2) — README 의 B601-DM 커뮤니티 기여에 "Gamepad teleop with IK/FK & safety — 끝점을 IK 로 제어, RViz 실시간 시각화(시뮬레이션 전용 테스트)" 로 소개되어 있습니다. 스틱 기울기를 끝점의 이동 속도로 바꾸는 방식이라, 조종기를 놓으면 그 자리에 멈춥니다. 현재 해당 기능은 저자 저장소의 보관(archived) 브랜치에 있고 더 이상 유지되지 않는다고 적혀 있으니 참고용으로만 보세요(저장소).
- reBot 자체를 리더로 — reBot-Isaacsim 의
gravity_joint_sender는 그리퍼 대신 손잡이를 단 reBot 을 중력 보상 상태로 손으로 밀고, 그 관절각을 Isaac Sim 으로 보내는 모드입니다. 20장에서 다시 봅니다.
| 방식 | 장점 | 단점 | 데이터 수집 적합도 |
|---|---|---|---|
| 리더 암 | 직관적, 관절 1:1, 공식 LeRobot 지원 | 리더 하드웨어 필요 | ★★★ |
| VR | 양손, 몰입감, 손목 방향 자유 | IK 특이점, 장비·설정 복잡 | ★★ |
| 휴대폰·Quest | 장비 부담 적음, 원격 가능 | 실험적, 정밀도 한계 | ★★ |
| 게임패드 | 저렴, 미세 이동 쉬움 | 느리고 비직관적 | ★ |
지연 · 스케일링 · 안전#
지연은 어디서 생기나#
텔레오퍼레이션의 체감 지연은 여러 단계가 더해진 것입니다.
| 구간 | 예 |
|---|---|
| 입력 읽기 | 리더 서보 읽기, VR 추적 갱신, 휴대폰 → Wi-Fi/Tailscale/터널 |
| 계산 | IK 풀이, 한계 검사 |
| 명령 전송 | CAN / 시리얼 브리지 |
| 모터 응답 | MIT 게인(kp·kd)이 낮으면 천천히 따라감 |
Seeed 위키에 실린 녹화 로그 한 줄을 보면 각 부분의 속도를 읽을 수 있습니다.
dt:33.34 (30.0hz) dtRlead: 5.06 (197.5hz) dtWfoll: 0.25 (3963.7hz) dtRfoll: 6.22 (160.7hz) ...전체 루프는 30 Hz(33 ms) 이고, 리더 읽기(dtRlead)에 약 5 ms, 팔로워 상태 읽기(dtRfoll)에 약 6 ms 가 걸렸다는 뜻입니다. 휴대폰 저장소는 같은 원리로 원격 터널(Cloudflare)이 Tailscale 보다 지연을 더한다고 적고 있습니다.
스케일링#
- 관절 매핑(리더 암) 은 각도 1:1 이라 스케일이 따로 없습니다. 대신 리더와 팔로워의 관절 범위가 다르면 잘림이 생깁니다. 예: Star Arm 102 의 joint1 은 ±110° 인데 reBot RS 의 joint1 은 ±2.8 rad(약 ±160°) 입니다.
- 자세 매핑(VR·휴대폰) 은 손의 이동량에 배율을 곱할 수 있습니다. 배율이 크면 작은 손짓으로 멀리 가지만 떨림도 커지고, 작으면 정밀하지만 큰 동작에 클러치를 여러 번 해야 합니다.
안전 인터록 체크리스트#
- 전원 확인 — 리더 12V, 팔로워 RS 48V / DM 24V. 전원 스위치(비상 정지)는 손 닿는 곳에.
- 작업 공간 비우기 — 토크가 켜진 팔의 움직임 범위 안에 손·얼굴을 넣지 않습니다.
- 저속·소동작부터 — LeRobot 공식 문서는 작은 동작으로 모든 관절 방향을 먼저 확인하라고 합니다. upstream LeRobot 에는 한 번에 바뀌는 각도를 제한하는
--robot.max_relative_target(예:5.0= 5°) 옵션도 있습니다. - 데드맨·클러치 — VR·휴대폰은 버튼을 놓으면 멈추는지 먼저 확인합니다.
- 끊김 대응 — 전원·신호가 끊기면 프로그램 정지 → 영점 복귀 → 재연결 → 재시작.
- 토크가 꺼질 때를 대비 — 종료하거나 연결이 끊기면 팔이 중력으로 떨어질 수 있으니 받쳐 줄 준비를 합니다.
정리#
- 텔레오퍼레이션은 "리더를 읽어서 팔로워에 보낸다" 의 반복이며, 그 리더 값이 곧 데이터셋의
action입니다. - 공식 경로는 Star Arm 102(reBot Arm 102) 리더 암 + LeRobot 입니다. Seeed 포크는
rebot_arm_102_leader/seeed_b601_dm_follower·seeed_b601_rs_follower, upstream LeRobot 은rebot_102_leader/rebot_b601_follower라는 이름을 씁니다. - Star Arm 102-LD 호환은 "통합 개방" 상태이고, HD·다른 리비전은 따로 확인해야 합니다.
- VR(PICO 4, B601-DM)은 손 자세를 분할 IK 로, 휴대폰·Quest(B601-RS)는 상대 자세 매핑 + 200 Hz MIT 드라이버 + 중력 피드포워드로 조종합니다. 게임패드 IK 는 커뮤니티 ROS 2 시뮬레이션 테스트입니다.
- 지연은 읽기·계산·전송·모터 응답의 합입니다. 천천히 일정하게 움직이고, 데드맨·저속 확인·전원 스위치로 안전을 지킵니다.
확인 문제#
- 리더 암(420 mm)이 reBot(약 760 mm)보다 훨씬 작아도 텔레오퍼레이션이 되는 이유는 무엇인가요?
- Seeed 위키(DM) 기준으로 리더와 팔로워의 LeRobot 타입 이름과 기본 포트를 각각 적어 보세요.
- 휴대폰 텔레오퍼레이션이 휴대폰의 절대 위치 대신 "버튼을 누른 순간부터의 변화량" 을 쓰는 이유는 무엇인가요?
- 시뮬레이터에서 추종 지연을 300 ms 로 올리고 빠르게 왕복시키면 어떤 현상이 보이며, 실물 시연에서는 어떻게 대응해야 하나요?
- 텔레오퍼레이션 도중 팔로워 전원 커넥터가 순간적으로 빠졌습니다. 위키가 안내하는 순서는 무엇인가요?
- 위치가 아니라 관절 각도를 1:1 로 맞추기 때문입니다. 팔 길이가 달라도 같은 관절각이면 같은 "모양" 이 됩니다(단, 관절 범위가 다르면 잘림이 생깁니다).
- 리더
rebot_arm_102_leader,/dev/ttyUSB0(USB-UART). 팔로워seeed_b601_dm_follower,/dev/ttyACM0(Damiao 시리얼 브리지,--robot.can_adapter=damiao). - 사람이 서 있는 위치·방향과 상관없이 누른 순간의 그리퍼 위치에서 부드럽게 이어지게 하려고입니다. 절대 위치를 쓰면 팔이 갑자기 튀어 갈 수 있고, 클러치(떼었다 다시 누르기)로 손 위치를 다시 잡을 수도 없습니다.
- 팔로워가 리더를 따라잡지 못해 왕복 폭이 줄고, 멈춘 뒤에도 한참 늦게 도착합니다. 실물에서는 천천히, 일정한 속도로 움직여 지연의 영향을 줄여야 합니다.
- 먼저 프로그램을 멈추고, 팔을 영점(홈) 자세로 되돌린 뒤, 전원을 다시 연결하고 프로그램을 재시작합니다.