PART 4 텔레오퍼레이션과 모방학습 · 약 30분

13텔레오퍼레이션

리더 암(Star Arm 102)·VR·휴대폰·게임패드로 reBot 을 원격 조종하는 구조와 지연·안전 문제를 다룹니다.

텔레오퍼레이션이란#

텔레오퍼레이션(teleoperation, 원격 조종) 은 사람이 어떤 입력 장치를 움직이면, 그 움직임을 읽어서 로봇팔에 실시간으로 명령으로 보내는 방식입니다. 입력 장치를 리더(leader), 따라 움직이는 로봇을 팔로워(follower) 라고 부릅니다. reBot-DevArm 에서는 B601-RS 또는 B601-DM 이 팔로워입니다.

구조는 놀랄 만큼 단순합니다. 아래 반복문이 초당 수십 번 돌아갑니다.

python
while True:
    action = leader.get_action()     # ① 리더의 현재 자세를 읽는다
    follower.send_action(action)     # ② 팔로워에게 그 자세로 가라고 명령한다
왜 이 장이 모방학습의 출발점인가

다음 장들에서 만들 LeRobot 데이터셋의 action(정답 행동) 이 바로 ① 에서 읽은 리더의 값입니다. 즉 텔레오퍼레이션을 하는 것 자체가 데이터 수집입니다. 사람이 잘 조종해야 좋은 데이터가 나오고, 좋은 데이터가 있어야 좋은 정책(16장)이 나옵니다.

리더 (사람이 움직임) · 리더 암 (102) · VR 컨트롤러 · 휴대폰 / Quest · 게임패드 PC get_action() (자세 매핑이면 IK) 한계·안전 검사 send_action() 팔로워 reBot B601 RS: CAN (can0) DM: 시리얼 브리지 + 손목/고정 카메라 읽기 명령 상태 데이터셋 한 프레임 (15장) action = 리더 값 · observation = 팔로워 상태 + 영상 초당 수십 번 반복되는 한 바퀴
리더에서 읽은 값은 팔로워 명령이 되는 동시에 데이터셋의 정답(action)으로 저장됩니다.

reBot 에서 쓸 수 있는 리더는 크게 네 갈래입니다. 이 장에서 하나씩 살펴봅니다.

방식리더 장치무엇을 맞추나출처 · 상태
관절 대 관절리더 암 (Star Arm 102 / reBot Arm 102)관절 각도를 그대로Seeed 공식 LeRobot 가이드
손 자세 → IKVR 컨트롤러 (PICO 4)손의 위치·방향 → 역기구학README 로드맵 "Done", 외부 저장소
상대 자세 → IKiPhone · HEBI Mobile I/O · Meta Quest누른 순간부터의 변화량커뮤니티 기여 (B601-RS)
속도 명령 → IK게임패드스틱 기울기 = 이동 속도커뮤니티 기여 (ROS 2, 시뮬레이션 전용 테스트)

먼저 시뮬레이터에서 체험하기#

실물을 켜기 전에 리더-팔로워의 감을 잡아 두면 사고를 크게 줄일 수 있습니다. 시뮬레이터는 기구학만 계산하므로(중력·마찰 없음) 마음껏 실수해도 됩니다.

실습 — 텔레오퍼 탭과 지연 슬라이더
  1. 3D 시뮬레이터를 열고 텔레오퍼 탭을 고릅니다. 상단에서 RS / DM 모델을 골라 둡니다.
  2. 리더 암 표시 & 추종 시작 을 켭니다. 화면에 반투명한 리더 암과 불투명한 팔로워 암이 겹쳐 나타납니다.
  3. 탭 안의 리더 슬라이더로 joint1(허리)을 천천히 좌우로 움직여 보세요. 팔로워가 살짝 늦게 따라옵니다.
  4. 추종 지연(ms) 슬라이더를 0 → 80 → 300 ms 로 바꿔 가며 같은 동작을 반복합니다. 지연이 커질수록 리더와 팔로워 사이가 벌어지고, 리더를 멈춘 뒤에도 팔로워가 한참 뒤에 도착합니다.
  5. 이번에는 joint1 을 빠르게 왕복시켜 보세요. 지연 300 ms 에서는 팔로워가 왕복의 끝까지 가기도 전에 방향을 바꿉니다 — 실물에서는 이때 사람이 "왜 안 따라오지?" 하고 더 크게 움직이게 되어 동작이 거칠어집니다.
  6. 리더를 관절 한계 근처로 보내 보세요. 한계를 넘는 값은 잘리고 경고가 표시됩니다. 실물에서 이 상황은 모터 과부하나 충돌로 이어집니다.
지연을 몸으로 느끼면 좋은 시연이 나옵니다

지연이 있는 시스템에서는 천천히, 일정한 속도로 움직이는 것이 정답입니다. 이 습관은 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-LDStar Arm 102-HDStar Arm 102-FL
역할리더 (가벼움, 관절이 자유롭게 움직임)리더 (자세 유지형)팔로워
전원12V@3A12V@5A12V@8A
도달 거리420 mm420 mm420 mm
엔코더12비트 자기 엔코더12비트 자기 엔코더—
통신UART / UC-01UART / UC-01UART / 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_leaderseeed_b601_dm_follower
Seeed 위키 (RS) — Seeed 포크rebot_arm_102_leaderseeed_b601_rs_follower
LeRobot 공식 문서 — upstreamrebot_102_leaderrebot_b601_follower + --robot.motor_family=dm/rs

Seeed 위키(DM) 의 텔레오퍼레이션 명령은 다음과 같습니다.

bash
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_leader

RS 는 먼저 can0 를 1 Mbps 로 올린 뒤 --robot.type=seeed_b601_rs_follower --robot.port=can0 --robot.can_adapter=socketcan 으로 바꿉니다. 설치와 캘리브레이션은 15장에서 순서대로 다룹니다. 명령은 명령어 생성기로도 만들 수 있습니다.

리더 캘리브레이션의 특징 (Seeed 위키)
  • 캘리브레이션을 시작하면 리더 서보의 현재 위치가 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 으로, 그리퍼 닫기
VR 저장소가 직접 밝히는 주의사항
  • 설정에 따라 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) 방식을 따라 버튼(데드맨)을 누른 순간을 기준점으로 삼고, 그 뒤의 변화량만 그리퍼에 더합니다.

text
목표 위치 = 누른 순간의 그리퍼 위치 + A · (지금 휴대폰 위치 − 누른 순간 휴대폰 위치)

A 는 휴대폰 세계 좌표를 로봇 베이스 좌표로 돌려 주는 행렬입니다. 회전도 같은 방식으로 "누른 순간부터 얼마나 돌았는지" 만 적용합니다. 버튼을 떼고 손을 편한 곳으로 옮긴 뒤 다시 누르면 이어서 조종할 수 있습니다 — 마우스를 들어 옮기는 것과 같은 클러치(clutch) 동작입니다.

사람 손 (휴대폰 · 컨트롤러) 누른 순간 지금 Δ A · Δ 좌표 회전 reBot 그리퍼 (TCP) 누른 순간 TCP 목표 TCP → IK A · Δ 버튼을 떼면 정지 → 손을 편한 곳으로 옮겨 다시 누르면 새 기준점 (클러치)
데드맨을 누른 순간이 기준점이 되고, 그 뒤의 이동량(Δ)만 그리퍼에 더해집니다.

서버 쪽 구성#

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 위키에 실린 녹화 로그 한 줄을 보면 각 부분의 속도를 읽을 수 있습니다.

text
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·휴대폰) 은 손의 이동량에 배율을 곱할 수 있습니다. 배율이 크면 작은 손짓으로 멀리 가지만 떨림도 커지고, 작으면 정밀하지만 큰 동작에 클러치를 여러 번 해야 합니다.

안전 인터록 체크리스트#

실물 텔레오퍼레이션 전에
  1. 전원 확인 — 리더 12V, 팔로워 RS 48V / DM 24V. 전원 스위치(비상 정지)는 손 닿는 곳에.
  2. 작업 공간 비우기 — 토크가 켜진 팔의 움직임 범위 안에 손·얼굴을 넣지 않습니다.
  3. 저속·소동작부터 — LeRobot 공식 문서는 작은 동작으로 모든 관절 방향을 먼저 확인하라고 합니다. upstream LeRobot 에는 한 번에 바뀌는 각도를 제한하는 --robot.max_relative_target(예: 5.0 = 5°) 옵션도 있습니다.
  4. 데드맨·클러치 — VR·휴대폰은 버튼을 놓으면 멈추는지 먼저 확인합니다.
  5. 끊김 대응 — 전원·신호가 끊기면 프로그램 정지 → 영점 복귀 → 재연결 → 재시작.
  6. 토크가 꺼질 때를 대비 — 종료하거나 연결이 끊기면 팔이 중력으로 떨어질 수 있으니 받쳐 줄 준비를 합니다.

정리#

  • 텔레오퍼레이션은 "리더를 읽어서 팔로워에 보낸다" 의 반복이며, 그 리더 값이 곧 데이터셋의 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 시뮬레이션 테스트입니다.
  • 지연은 읽기·계산·전송·모터 응답의 합입니다. 천천히 일정하게 움직이고, 데드맨·저속 확인·전원 스위치로 안전을 지킵니다.

확인 문제#

  1. 리더 암(420 mm)이 reBot(약 760 mm)보다 훨씬 작아도 텔레오퍼레이션이 되는 이유는 무엇인가요?
  2. Seeed 위키(DM) 기준으로 리더와 팔로워의 LeRobot 타입 이름과 기본 포트를 각각 적어 보세요.
  3. 휴대폰 텔레오퍼레이션이 휴대폰의 절대 위치 대신 "버튼을 누른 순간부터의 변화량" 을 쓰는 이유는 무엇인가요?
  4. 시뮬레이터에서 추종 지연을 300 ms 로 올리고 빠르게 왕복시키면 어떤 현상이 보이며, 실물 시연에서는 어떻게 대응해야 하나요?
  5. 텔레오퍼레이션 도중 팔로워 전원 커넥터가 순간적으로 빠졌습니다. 위키가 안내하는 순서는 무엇인가요?
정답
  1. 위치가 아니라 관절 각도를 1:1 로 맞추기 때문입니다. 팔 길이가 달라도 같은 관절각이면 같은 "모양" 이 됩니다(단, 관절 범위가 다르면 잘림이 생깁니다).
  2. 리더 rebot_arm_102_leader, /dev/ttyUSB0 (USB-UART). 팔로워 seeed_b601_dm_follower, /dev/ttyACM0 (Damiao 시리얼 브리지, --robot.can_adapter=damiao).
  3. 사람이 서 있는 위치·방향과 상관없이 누른 순간의 그리퍼 위치에서 부드럽게 이어지게 하려고입니다. 절대 위치를 쓰면 팔이 갑자기 튀어 갈 수 있고, 클러치(떼었다 다시 누르기)로 손 위치를 다시 잡을 수도 없습니다.
  4. 팔로워가 리더를 따라잡지 못해 왕복 폭이 줄고, 멈춘 뒤에도 한참 늦게 도착합니다. 실물에서는 천천히, 일정한 속도로 움직여 지연의 영향을 줄여야 합니다.
  5. 먼저 프로그램을 멈추고, 팔을 영점(홈) 자세로 되돌린 뒤, 전원을 다시 연결하고 프로그램을 재시작합니다.