모델보다 먼저 데이터 수집 장치를 설계하라
모방학습을 처음 시작하면 많은 사람이 모델부터 고민한다. CNN을 쓸지, Transformer를 쓸지, 이미지와 관절값을 어떻게 합칠지, 손실 함수는 무엇으로 할지 같은 질문이 먼저 떠오른다. 물론 중요한 질문이다. 하지만 로봇 모방학습에서는 그보다 앞에 있는 질문이 있다.
"무엇을, 어떤 시간 간격으로, 어떤 의미를 담아 기록할 것인가?"
사람이 로봇팔을 훌륭하게 조작해 컵을 집었다고 해도, 그 장면을 제대로 기록하지 못하면 학습 데이터가 되지 않는다. 카메라 이미지는 저장했지만 그 순간의 조이스틱 명령을 놓쳤다면 모델은 무엇을 따라 해야 할지 알 수 없다. 관절 상태는 저장했지만 그리퍼가 언제 닫혔는지 빠져 있다면 물체를 집는 핵심 순간이 사라진다. 시간 동기화가 어긋나 있으면 이미지는 컵 앞에 있는데 행동은 이미 들어 올리는 명령일 수도 있다.
좋은 모방학습 모델은 좋은 데이터에서 시작된다. 여기서 좋은 데이터란 단순히 양이 많은 데이터가 아니다. 로봇이 본 것, 로봇의 몸 상태, 사람이 내린 명령, 그 결과가 시간 순서대로 정확히 맞아 있는 데이터다.
이번 장에서는 로봇팔 시연 데이터를 수집하는 방법을 다룬다. 사람이 로봇을 원격 조작하는 Teleoperation, 조이스틱과 키보드 같은 입력 장치의 차이, 관절 상태와 카메라 이미지를 동기화하는 방법, 그리고 실패와 복구 장면을 왜 일부러 남겨야 하는지를 살펴본다.

Teleoperation: 사람이 로봇의 몸을 빌려 움직이는 방식
Teleoperation은 사람이 로봇을 원격으로 조작하는 방식이다. 줄여서 텔레옵이라고도 부른다. 여기서 원격이라는 말은 반드시 멀리 떨어져 있다는 뜻만은 아니다. 같은 책상 앞에 앉아 있어도, 사람이 조이스틱이나 키보드로 로봇팔을 움직이면 Teleoperation이다.
모방학습에서 Teleoperation은 매우 중요한 데이터 수집 방법이다. 사람이 직접 로봇을 움직이며 작업을 성공시키고, 시스템은 그 과정을 상태와 행동의 연속으로 기록한다. 이때 사람은 일종의 전문가 정책 역할을 한다. 로봇이 어떤 장면을 보고 어떤 행동을 해야 하는지, 사람이 몸으로 보여 주는 것이다.
예를 들어 "파란 블록을 집어 상자 안에 넣기"라는 작업을 데이터로 만들고 싶다고 하자. 시연자는 조이스틱을 잡고 로봇팔의 엔드 이펙터를 블록 근처로 이동시킨다. 그리퍼를 열고, 블록의 양옆으로 접근하고, 적절한 순간에 그리퍼를 닫는다. 블록이 잡히면 위로 들어 올리고, 상자 위로 이동한 뒤, 그리퍼를 열어 내려놓는다.
사람에게는 자연스러운 흐름이지만 로봇 데이터로 보면 매 순간 많은 값이 남는다. 카메라 이미지가 바뀌고, 관절 각도가 변하고, 엔드 이펙터 위치가 이동하고, 그리퍼 명령이 열림에서 닫힘으로 바뀐다. 모방학습은 바로 이 촘촘한 기록을 사용해 "이런 상태에서는 이런 행동을 선택한다"는 관계를 배운다.
Teleoperation의 장점은 사람이 복잡한 판단을 즉석에서 처리할 수 있다는 점이다. 블록이 조금 밀리면 다시 맞추고, 그리퍼가 비스듬하면 각도를 조정하고, 물체가 잘 잡히지 않으면 다시 접근한다. 이런 작은 보정은 규칙으로 작성하기 어렵지만, 시연 데이터에는 자연스럽게 들어간다.
시연 수집의 기본 절차
로봇팔 시연 데이터 수집은 "녹화 버튼을 누르고 움직이면 끝"이 아니다. 좋은 데이터를 만들려면 작업 단위, 시작 상태, 종료 조건, 성공 판정, 저장 형식을 미리 정해야 한다. 그렇지 않으면 나중에 학습 단계에서 데이터가 뒤섞이고, 무엇이 성공이고 무엇이 실패인지 알기 어려워진다.
가장 기본적인 수집 절차는 다음과 같이 구성할 수 있다.
작업을 하나 정한다. 예를 들어 "컵을 집어 오른쪽 영역에 놓기"처럼 목표가 명확해야 한다.
로봇과 물체의 시작 상태를 준비한다. 컵 위치, 로봇 초기 자세, 그리퍼 열림 상태를 기록한다.
데이터 기록기를 시작한다. 카메라, 관절 상태, 엔드 이펙터 위치, 그리퍼 상태, 사용자 입력을 동시에 저장한다.
사람이 입력 장치로 로봇을 조작해 작업을 수행한다.
작업이 끝나면 성공 여부와 실패 원인을 함께 저장한다.
장면을 초기화하고 물체 위치나 방향을 바꾼 뒤 다시 반복한다.
여기서 중요한 것은 한 번의 시연을 하나의 에피소드로 다루는 것이다. 에피소드는 시작과 끝이 있는 작업 기록이다. 컵 집기 작업이라면 로봇이 초기 자세에 있고 컵이 책상 위에 놓인 순간부터, 컵을 목표 위치에 내려놓거나 실패로 종료된 순간까지가 하나의 에피소드가 된다.
에피소드 단위로 데이터를 저장하면 나중에 관리가 쉬워진다. 성공한 시연만 골라 학습할 수도 있고, 실패한 시연 중 복구가 포함된 구간만 따로 분석할 수도 있다. 특정 물체나 특정 조명 조건에서 성능이 나쁜지도 추적할 수 있다.
무엇을 행동으로 기록할 것인가
Teleoperation에서 가장 먼저 결정해야 할 것은 사람이 내리는 명령을 어떤 형태로 기록할지다. 이것은 나중에 모델이 출력할 행동의 형태와 연결된다. 조이스틱을 움직였다는 사실만 저장하는 것이 아니라, 로봇이 학습할 수 있는 행동 벡터로 정리해야 한다.
로봇팔에서 자주 쓰는 행동 표현은 크게 세 가지다. 첫째는 관절 기준 행동이다. 각 관절을 얼마나 움직일지, 또는 다음 목표 관절 각도가 무엇인지 기록한다. 둘째는 엔드 이펙터 기준 행동이다. 그리퍼 끝을 x, y, z 방향으로 얼마나 움직일지, 자세를 얼마나 회전할지 기록한다. 셋째는 고수준 명령이다. 특정 위치로 이동하기, 그리퍼 닫기, 들어 올리기 같은 스킬 호출을 행동으로 저장한다.
모방학습 초기에는 엔드 이펙터 기준의 작은 이동량을 행동으로 두는 방식이 이해하기 쉽다. 예를 들어 한 시점의 행동을 다음과 같이 표현할 수 있다.
action_t = [dx, dy, dz, droll, dpitch, dyaw, gripper]여기서 dx, dy, dz는 엔드 이펙터를 어느 방향으로 조금 움직일지를 나타낸다. droll, dpitch, dyaw는 자세 회전 명령이다. gripper는 그리퍼를 열지 닫을지 나타내는 값이다. 아주 단순한 집기 작업에서는 회전 명령을 빼고 [dx, dy, dz, gripper]처럼 시작할 수도 있다.
주의할 점은 입력 장치의 원시값과 로봇 행동이 항상 같지는 않다는 것이다. 조이스틱의 왼쪽 스틱을 위로 밀었다는 값 자체보다, 그 결과로 로봇에게 전달된 속도 명령이나 목표 이동량이 더 유용할 때가 많다. 모방학습 모델은 나중에 조이스틱을 흉내 내는 것이 아니라 로봇 행동을 출력해야 하기 때문이다.
따라서 데이터에는 가능하면 두 값을 모두 남기는 것이 좋다. 원시 입력은 디버깅에 도움이 되고, 변환된 로봇 명령은 학습에 바로 사용할 수 있다.
입력 장치에 따라 데이터의 성격이 달라진다
Teleoperation에서 어떤 입력 장치를 쓰느냐는 단순한 취향 문제가 아니다. 입력 장치는 시연자의 움직임을 제한하고, 그 제한은 데이터의 성격을 만든다. 키보드로 만든 데이터와 VR 컨트롤러로 만든 데이터는 같은 작업이라도 움직임의 부드러움과 자유도가 다르다.
| 입력 방식 | 장점 | 한계 | 잘 맞는 상황 |
|---|---|---|---|
| 조이스틱·게임패드 | 연속적인 속도 제어가 쉽고 조작감이 좋다 | 6자유도 자세 제어를 모두 담기 어렵다 | 로봇팔 위치 이동, 그리퍼 열기·닫기, 간단한 Pick and Place |
| 키보드 | 구현이 쉽고 디버깅이 편하다 | 움직임이 계단식으로 거칠어질 수 있다 | 초기 실험, 시뮬레이션 테스트, 안전한 저속 조작 |
| 마우스 | 화면 기반 목표 선택이 직관적이다 | 실제 3D 움직임을 직접 제어하기에는 추가 변환이 필요하다 | 시뮬레이션, 이미지 위 클릭으로 목표점 지정, 데이터 라벨링 보조 |
| VR 컨트롤러 | 사람 손의 3D 움직임을 자연스럽게 반영할 수 있다 | 좌표계 보정과 안전 제한이 까다롭다 | 복잡한 조작, 자세가 중요한 작업, 양팔 로봇 시연 |
조이스틱은 가장 실용적인 출발점이다. 왼쪽 스틱으로 x, y 이동을 제어하고, 오른쪽 스틱으로 z 이동이나 회전을 제어할 수 있다. 버튼은 그리퍼 열기와 닫기에 배정할 수 있다. 조작자가 조금만 익숙해지면 부드러운 접근과 후퇴를 만들 수 있어 Pick and Place 데이터 수집에 잘 맞는다.
키보드는 거칠지만 강력한 장점이 있다. 구현이 쉽다. W, A, S, D로 평면 이동을 하고, Q, E로 위아래 이동을 하며, 스페이스바로 그리퍼를 닫는 식으로 빠르게 만들 수 있다. 다만 키를 누르는 동안 일정 속도로 움직이는 방식은 행동이 뚝뚝 끊기기 쉽다. 이 데이터로 학습한 정책도 부드럽지 않은 움직임을 배울 수 있으므로 속도 필터나 저역 통과 필터를 적용해 명령을 완만하게 만드는 것이 좋다.
마우스는 실제 로봇팔을 직접 조종하기보다 목표를 지정하는 방식에 잘 맞는다. 카메라 화면에서 컵 중심을 클릭하면 로봇이 그 위치로 접근하고, 사용자는 중간중간 목표점을 수정하는 식이다. 이 방식은 완전한 저수준 행동 데이터보다는 고수준 목표 선택 데이터에 가깝다. 하지만 시뮬레이션에서는 매우 편리하고, 이미지와 행동의 관계를 수집하는 데 도움이 된다.
VR 컨트롤러는 가장 직관적이지만 준비가 가장 까다롭다. 사람이 컨트롤러를 움직이면 로봇의 엔드 이펙터가 비슷하게 움직이도록 만들 수 있다. 손을 앞으로 내밀면 로봇팔도 앞으로 가고, 손목을 돌리면 그리퍼 자세도 돌아간다. 복잡한 조작을 보여 주기에 좋지만, 사람의 손 움직임을 로봇 작업 공간에 어떻게 매핑할지 신중히 정해야 한다. 사람 손은 자유롭게 움직일 수 있지만 로봇팔은 관절 한계와 충돌 위험이 있기 때문이다.
조이스틱으로 로봇팔 시연 만들기
가장 현실적인 예로 조이스틱 기반 시연 수집기를 생각해 보자. 목표는 로봇팔이 책상 위의 컵을 집어 오른쪽 영역에 놓는 데이터를 모으는 것이다. 조이스틱은 사람이 원하는 이동 방향을 입력하고, 제어 노드는 그 입력을 엔드 이펙터 속도 명령으로 변환한다.
구조는 간단하다. 조이스틱 노드가 스틱과 버튼 값을 읽는다. 텔레옵 노드는 이 값을 로봇 좌표계 기준의 이동 명령으로 바꾼다. 로봇 제어 노드는 그 명령을 받아 짧은 이동을 실행한다. 동시에 기록 노드는 카메라와 로봇 상태, 명령을 저장한다.
[Joystick]
↓
[Teleop Mapper] ── action command ──→ [Robot Controller]
↓ ↓
[Data Recorder] ← robot state/image/status ←조이스틱 입력을 바로 큰 움직임으로 연결하면 위험하다. 따라서 보통은 작은 속도 명령으로 제한한다. 예를 들어 스틱을 끝까지 밀어도 엔드 이펙터가 초당 몇 cm만 움직이게 한다. 처음에는 답답할 정도로 느리게 설정하는 편이 좋다. 데이터 수집에서 가장 나쁜 상황은 빠른 로봇이 물체를 치거나 작업 공간 밖으로 나가면서 위험한 데이터를 만드는 것이다.
버튼 배치도 단순해야 한다. 시연자는 작업 중에 로봇과 물체를 보느라 바쁘다. 버튼 조합이 복잡하면 실수가 늘어난다. 그리퍼 열기, 그리퍼 닫기, 일시 정지, 에피소드 종료 정도만 명확히 배치해도 충분하다.
좋은 조이스틱 텔레옵은 조작자의 의도를 지나치게 날것으로 전달하지 않는다. 입력을 안전하고 부드러운 로봇 명령으로 바꿔야 한다. 스틱 값에 데드존을 두어 미세한 흔들림을 무시하고, 속도 제한을 걸고, 작업 공간 밖으로 나가는 명령은 잘라낸다. 이렇게 해야 시연자도 안정적으로 움직일 수 있고, 데이터도 학습하기 쉬워진다.
키보드 조작은 단순하지만 데이터 품질을 조심해야 한다
키보드 텔레옵은 가장 빨리 만들 수 있는 방법이다. 별도의 장비가 없어도 되고, 시뮬레이션과 실제 로봇에서 같은 키 매핑을 쓸 수 있다. 초기 모방학습 실험에서는 키보드로 충분히 시작할 수 있다.
예를 들어 다음과 같은 매핑을 사용할 수 있다.
W/S : x 방향 앞/뒤 이동
A/D : y 방향 좌/우 이동
Q/E : z 방향 위/아래 이동
J/L : yaw 회전
O/P : gripper open/close
SPACE : pause
ENTER : finish episode문제는 키보드 입력이 이산적이라는 점이다. 키를 누르면 일정한 속도로 움직이고, 떼면 멈춘다. 사람 손의 미묘한 강약 조절이 들어가기 어렵다. 그래서 경로가 계단처럼 꺾일 수 있고, 물체 가까이에서 세밀한 접근이 힘들 수 있다.
이 문제를 줄이려면 키 입력을 곧바로 명령으로 쓰지 말고 내부 목표 속도를 서서히 바꾸는 방식이 좋다. 예를 들어 W를 누르면 x 속도가 즉시 최대값이 되는 것이 아니라 몇 프레임에 걸쳐 천천히 증가하게 한다. 키를 떼면 속도도 천천히 줄인다. 그러면 움직임이 훨씬 부드러워진다.
키보드 데이터는 복잡한 조작을 배우기에는 한계가 있지만, 시스템을 검증하는 데 매우 좋다. 기록기가 제대로 동작하는지, 시간 동기화가 맞는지, 에피소드 저장 구조가 괜찮은지 확인할 때 키보드는 훌륭한 도구다. 본격적인 대량 수집에 들어가기 전에 키보드로 작은 데이터셋을 만들어 전체 파이프라인을 먼저 점검하는 것을 추천한다.
VR 컨트롤러와 직접 시연의 매력
VR 컨트롤러를 사용하면 사람이 손을 움직이는 방식에 가까운 데이터를 만들 수 있다. 로봇팔의 엔드 이펙터를 하나의 가상 손처럼 다루는 것이다. 컨트롤러를 왼쪽으로 움직이면 로봇 그리퍼도 왼쪽으로 움직이고, 컨트롤러를 회전하면 그리퍼 자세도 회전한다. 트리거 버튼은 그리퍼 닫기로 사용할 수 있다.
이 방식은 특히 자세가 중요한 작업에 유리하다. 컵 손잡이에 그리퍼를 넣거나, 긴 물체를 특정 각도로 잡거나, 서랍 손잡이를 당기는 작업에서는 위치뿐 아니라 손목 방향이 매우 중요하다. 조이스틱으로는 이런 자세 조정을 직관적으로 하기 어렵지만, VR 컨트롤러는 사람이 손목을 돌리듯 조작할 수 있다.
하지만 VR 기반 텔레옵에는 좌표계 문제가 따라온다. 컨트롤러의 앞쪽이 로봇 좌표계의 어느 방향인지, 사람의 팔 움직임 10cm가 로봇 움직임 몇 cm에 해당하는지, 컨트롤러가 작업 공간 밖으로 나갔을 때 로봇은 어떻게 멈출지 정해야 한다. 이 매핑이 어색하면 시연자는 로봇을 제대로 조작하지 못하고, 데이터도 흔들린다.
또 하나의 방법은 중력 보상 모드에서 로봇팔을 사람이 직접 잡고 움직이는 것이다. 로봇이 자신의 무게를 보상해 주면 사람은 로봇팔을 비교적 가볍게 밀고 당기며 경로를 보여 줄 수 있다. 이를 kinesthetic teaching, 즉 물리적 시연이라고 부르기도 한다. 이 방식은 경로 자체를 가르치기에는 좋지만, 실제 작업 중 카메라를 보고 조금씩 보정하는 행동이나 그리퍼 타이밍을 함께 기록하려면 별도 인터페이스가 필요하다.
기록해야 할 상태: 로봇이 본 것과 느낀 것
시연 데이터는 단순한 동영상이 아니다. 모방학습 모델이 사용할 입력과 정답 행동이 모두 들어 있는 시간 기록이다. 따라서 매 시점마다 어떤 상태를 저장할지 정해야 한다.
로봇팔 조작 데이터에서 자주 저장하는 상태는 다음과 같다.
카메라 이미지: 로봇이 물체와 주변 환경을 보는 정보다.
깊이 이미지 또는 포인트 클라우드: 물체까지의 거리와 3D 구조를 담는다.
관절 상태: 각 관절의 위치, 속도, 필요하면 토크를 포함한다.
엔드 이펙터 자세: 로봇 기준 좌표계에서 그리퍼 끝의 위치와 방향이다.
그리퍼 상태: 열림 정도, 닫힘 명령, 물체를 잡았는지 추정하는 값을 포함한다.
사용자 행동 명령: 조이스틱, 키보드, VR 입력이 변환된 로봇 행동이다.
작업 메타데이터: 물체 종류, 목표 위치, 성공 여부, 실패 원인 같은 설명 정보다.
이 중에서 무엇이 꼭 필요한지는 학습하려는 정책에 따라 다르다. 이미지 기반 정책을 만들려면 카메라 이미지가 필수다. 관절 상태를 함께 넣으면 모델은 로봇팔이 현재 어떤 자세인지 알 수 있다. 엔드 이펙터 자세를 넣으면 목표와 현재 위치의 관계를 더 쉽게 배울 수 있다. 그리퍼 상태는 집기 작업에서 거의 필수에 가깝다. 그리퍼가 열려 있는지 닫혀 있는지 모르면 같은 이미지에서도 다음 행동이 달라질 수 있기 때문이다.
다만 처음부터 모든 센서를 무작정 저장하면 데이터가 커지고 관리가 어려워진다. 중요한 것은 "나중에 모델이 이 정보를 입력으로 쓸 것인가?"라는 질문이다. 쓰지 않을 데이터라도 디버깅과 검증에 도움이 되면 저장할 가치가 있다. 하지만 저장량, 동기화 난이도, 처리 속도까지 함께 고려해야 한다.
시간 동기화: 같은 순간을 같은 줄에 놓기
로봇 데이터 수집에서 가장 자주 생기는 문제는 시간 어긋남이다. 카메라는 30Hz로 이미지를 보내고, 관절 상태는 100Hz로 들어오고, 조이스틱 명령은 50Hz로 들어올 수 있다. 모든 센서가 같은 속도로 움직이지 않는다. 그렇다면 한 학습 샘플을 만들 때 어떤 이미지와 어떤 관절 상태와 어떤 행동을 묶어야 할까?
해결의 핵심은 타임스탬프다. 모든 데이터에는 기록된 시각이 붙어야 한다. 그리고 학습 샘플을 만들 때 기준 시간을 정한 뒤, 그 시간에 가장 가까운 센서 값을 찾아 묶는다.
예를 들어 카메라 프레임을 기준으로 샘플을 만든다고 하자. 10.000초에 이미지가 들어왔다면, 10.000초에 가장 가까운 관절 상태, 엔드 이펙터 자세, 그리퍼 상태, 행동 명령을 찾아 하나로 묶는다. 이때 너무 멀리 떨어진 값은 사용하지 않아야 한다. 이미지와 행동이 0.2초 이상 어긋나면 로봇 조작에서는 꽤 큰 차이가 될 수 있다.
간단한 샘플 구조는 다음처럼 생각할 수 있다.
{
"t": 12.340,
"image": "images/000123.jpg",
"joint_position": [0.12, -0.84, 1.31, -1.02, 0.44, 0.08],
"ee_pose": [0.42, -0.15, 0.28, 0.0, 3.14, 1.57],
"gripper": 0.82,
"action": [0.01, -0.02, 0.00, 0.0, 0.0, 0.01, 1.0]
}여기서 t는 기준 시간이다. image는 이미지 파일 경로이고, 나머지는 같은 시각에 맞춘 로봇 상태와 행동이다. 실제 시스템에서는 이미지 원본, 압축 이미지, 깊이 이미지, 카메라 내부 파라미터, 좌표 변환 정보까지 함께 관리할 수 있다.
시간 동기화에서 또 하나 중요한 점은 행동의 의미다. 현재 시점의 상태와 같은 시점의 행동을 묶는다고 말하지만, 실제로는 약간의 지연이 있다. 사람이 화면을 보고 조이스틱을 움직이고, 명령이 제어기로 전달되고, 로봇이 움직이기까지 시간이 걸린다. 데이터 수집 초기에 이 지연을 무시해도 되는지 확인해야 한다. 만약 지연이 크다면 행동을 몇 프레임 뒤로 맞추거나, 명령이 실제로 실행된 시각을 기준으로 다시 정렬해야 한다.
기록 주파수는 높을수록 좋은가
처음에는 모든 것을 가능한 한 빠르게 저장하고 싶어진다. 카메라 60Hz, 관절 500Hz, 명령 200Hz로 저장하면 더 좋은 데이터가 될 것처럼 보인다. 하지만 무조건 높은 주파수가 좋은 것은 아니다. 데이터 크기가 커지고, 저장 속도가 부족해 프레임이 누락될 수 있으며, 학습할 때 거의 같은 장면이 과도하게 반복될 수 있다.
모방학습에서는 작업의 속도에 맞는 기록 주파수를 선택하는 것이 중요하다. 로봇팔이 천천히 컵을 집는 작업이라면 10~30Hz 정도의 샘플로도 충분한 경우가 많다. 아주 빠른 동작이나 접촉 힘이 중요한 작업이라면 더 높은 주파수가 필요할 수 있다. 반대로 사람이 조이스틱으로 천천히 조작하는 데이터라면 너무 촘촘한 샘플은 중복을 늘릴 뿐이다.
실용적으로는 원본 센서 데이터는 가능한 한 안정적으로 저장하고, 학습용 데이터셋을 만들 때 일정 주파수로 다운샘플링하는 방식이 좋다. 원본을 남겨 두면 나중에 다른 방식으로 다시 가공할 수 있다. 다만 원본이 너무 커져 관리가 불가능해지지 않도록 에피소드 길이와 저장 용량을 계속 확인해야 한다.
에피소드 메타데이터를 남겨라
시연 데이터가 수백 개, 수천 개로 늘어나면 파일 이름만 보고는 무엇이 들어 있는지 알 수 없다. 이때 메타데이터가 필요하다. 메타데이터는 데이터에 대한 설명이다. 어떤 작업인지, 어떤 물체를 썼는지, 성공했는지, 실패했다면 왜 실패했는지 기록한다.
예를 들어 하나의 에피소드 폴더에 다음과 같은 metadata.yaml 파일을 둘 수 있다.
episode_id: cup_pick_place_000137
task: pick_and_place
object: red_cup
goal: right_zone
operator: operator_A
date: 2026-05-14
success: false
failure_stage: grasp
failure_reason: gripper_closed_too_early
recovery_included: true
notes: cup slipped once, operator reopened gripper and retried successfully이런 정보는 학습 자체보다 데이터 관리에서 빛을 발한다. 예를 들어 실패한 grasp만 모아 보고 싶을 때, 특정 시연자의 데이터만 제외하고 싶을 때, 복구 장면이 포함된 에피소드만 골라 학습하고 싶을 때 메타데이터가 없으면 매우 힘들다.
메타데이터는 처음에는 귀찮아 보이지만, 데이터셋이 커질수록 반드시 필요해진다. 특히 팀 프로젝트에서는 누가 어떤 조건에서 데이터를 수집했는지 남겨야 한다. 같은 "컵 집기"라도 시연자마다 속도와 습관이 다르고, 카메라 위치나 조명에 따라 데이터 분포가 달라질 수 있기 때문이다.
성공 데이터만 모으면 로봇은 실패했을 때 약해진다
모방학습 데이터라고 하면 많은 사람이 깔끔하게 성공한 시연만 떠올린다. 물론 성공 데이터는 중요하다. 모델은 좋은 행동을 배워야 한다. 엉망인 조작을 정답처럼 학습하면 정책도 엉망이 된다.
하지만 성공 데이터만 있으면 또 다른 문제가 생긴다. 실제 실행 중 로봇은 항상 완벽한 상태에 있지 않다. 그리퍼가 컵 중심에서 조금 벗어날 수 있고, 물체가 예상보다 미끄러질 수 있으며, 접근 중 컵을 살짝 밀 수도 있다. 이때 정책은 "살짝 실패한 상태에서 어떻게 회복할지" 알아야 한다.
사람의 시연이 항상 완벽했다면 데이터에는 이런 상태가 거의 없다. 모델은 완벽한 접근 경로 위에서는 잘 움직이지만, 그 경로에서 조금만 벗어나면 이상한 행동을 할 수 있다. 이것이 이전 장에서 말한 작은 오차의 누적 문제와 연결된다.
그래서 실패와 복구 장면을 데이터로 남겨야 한다. 단, 실패를 성공처럼 섞으면 안 된다. 실패한 행동, 실패 이후의 복구 행동, 최종 성공 여부를 구분해서 기록해야 한다.
예를 들어 컵을 집으려다 그리퍼가 너무 일찍 닫혀 컵을 밀었다고 하자. 시연자는 그리퍼를 다시 열고, 뒤로 살짝 물러나고, 컵 위치를 다시 맞춘 뒤, 천천히 재접근해 집기에 성공했다. 이 에피소드는 단순 성공 데이터보다 더 풍부하다. 로봇은 잘못 접근했을 때 물러나는 행동, 그리퍼를 다시 여는 행동, 재접근하는 행동을 배울 수 있다.
다만 모델 학습 시에는 어떤 부분을 정답 행동으로 사용할지 신중해야 한다. 무작정 전체를 학습하면 "컵을 미는 행동"까지 따라 할 수 있다. 따라서 실패 원인 구간과 복구 구간을 라벨링하고, 학습 목적에 따라 선택적으로 사용해야 한다.
실패 데이터의 종류를 구분하기
실패 데이터라고 해서 모두 같은 의미는 아니다. 어떤 실패는 절대 따라 하면 안 되는 나쁜 행동이고, 어떤 실패는 복구 능력을 배우는 데 매우 좋은 재료다. 데이터 수집 단계에서 실패의 종류를 구분해 두면 나중에 훨씬 유용하다.
로봇팔 조작에서 자주 만나는 실패 유형은 다음과 같다.
인식 실패: 물체를 잘못 찾거나, 목표가 아닌 물체를 향해 접근한다.
접근 실패: 그리퍼가 물체 중심에서 벗어나거나 장애물 때문에 접근하지 못한다.
집기 실패: 그리퍼가 너무 일찍 닫히거나 너무 늦게 닫혀 물체를 잡지 못한다.
들어 올리기 실패: 처음에는 잡은 것처럼 보였지만 들어 올리는 중 미끄러진다.
놓기 실패: 목표 위치가 아닌 곳에 놓거나, 놓는 과정에서 물체가 넘어간다.
안전 중단: 충돌 위험, 작업 공간 이탈, 사람 개입으로 동작이 멈춘다.
이 실패 유형은 나중에 모델 평가와 재계획에도 연결된다. 집기 실패가 많다면 그리퍼 타이밍이나 접근 자세 데이터를 더 모아야 한다. 들어 올리기 실패가 많다면 잡은 뒤 힘 조절이나 들어 올리는 속도에 문제가 있을 수 있다. 인식 실패가 많다면 모방학습 모델보다 비전 데이터나 객체 검출 파이프라인을 먼저 개선해야 한다.
중요한 것은 실패를 숨기지 않는 것이다. 실패 데이터는 프로젝트의 약점이 어디 있는지 알려 주는 지도다. 다만 그 지도를 학습 데이터에 넣을 때는 표지판을 달아야 한다. "이 구간은 잘못된 행동", "이 구간은 복구 행동", "이 에피소드는 최종 성공"처럼 의미를 남겨야 한다.
복구 행동은 로봇을 튼튼하게 만든다
복구 행동은 실패 직후 로봇이 다시 좋은 상태로 돌아가기 위해 하는 행동이다. 컵을 살짝 밀었을 때 뒤로 물러나기, 그리퍼가 빗나갔을 때 다시 열기, 물체가 흔들릴 때 속도를 줄이기, 목표 위치 근처에서 다시 정렬하기 같은 행동이 여기에 속한다.
복구 행동은 실제 로봇에서 매우 중요하다. 아무리 좋은 정책도 한 번에 모든 상황을 완벽하게 처리하기는 어렵다. 물체 표면이 미끄럽거나, 카메라 깊이값이 흔들리거나, 로봇팔의 위치 오차가 조금 생길 수 있다. 이때 로봇이 바로 실패로 끝나지 않고 스스로 자세를 고쳐 다시 시도할 수 있다면 성공률이 크게 올라간다.
복구 데이터를 수집하려면 시연자에게 지침을 줘야 한다. 실패하면 즉시 에피소드를 끊어 버리는 대신, 안전한 범위 안에서 어떻게 회복하는지 보여 달라고 요청한다. 물론 위험한 상황에서는 즉시 정지해야 한다. 하지만 단순히 살짝 빗나간 정도라면 그 상태에서 다시 맞추는 장면을 남기는 것이 좋다.
복구 행동은 나중에 상위 에이전트와도 연결된다. 예를 들어 LLM 기반 로봇 에이전트가 pick(red_cup) 스킬을 호출했는데, 저수준 정책이 한 번에 집지 못했다고 하자. 복구 행동을 배운 정책은 바로 실패를 반환하지 않고 작은 재접근을 시도할 수 있다. 그래도 실패하면 그때 상위 에이전트에게 "grasp failed"라고 알리고 재계획을 요청하면 된다.
데이터 수집 중 안전은 학습보다 우선이다
시연 데이터를 많이 모으고 싶어도 안전을 희생하면 안 된다. Teleoperation은 사람이 조작하지만 로봇은 실제 힘과 속도를 가진 기계다. 잘못된 입력, 통신 지연, 좌표계 오류, 소프트웨어 버그가 모두 위험으로 이어질 수 있다.
데이터 수집 환경에는 최소한 다음 안전 장치가 필요하다.
물리적 비상 정지 버튼을 시연자 손이 닿는 곳에 둔다.
로봇 작업 공간을 제한하고, 그 밖으로 나가는 명령은 실행하지 않는다.
처음에는 속도와 가속도를 낮게 설정한다.
사람 손, 얼굴, 몸이 로봇 작업 공간에 들어가지 않도록 한다.
충돌 가능성이 있는 물체를 줄이고, 깨지기 쉬운 물건은 초기 실험에서 제외한다.
텔레옵 노드가 멈추거나 입력이 끊기면 로봇도 즉시 정지하도록 만든다.
특히 좌표계 오류를 조심해야 한다. 조이스틱을 오른쪽으로 밀었는데 로봇이 왼쪽으로 움직이거나, 위로 올리려 했는데 아래로 내려가면 시연자는 순간적으로 당황한다. 실제 데이터 수집 전에 빈 공간에서 모든 축 방향을 천천히 확인해야 한다.
안전 제어는 데이터에도 영향을 준다. 너무 빠르고 위험한 움직임을 허용하면 데이터가 불안정해지고, 너무 강하게 제한하면 사람이 자연스러운 시연을 만들기 어렵다. 따라서 초기에는 보수적으로 시작하고, 시연자가 익숙해질수록 조금씩 조정하는 것이 좋다.
저장 구조를 단순하게 유지하기
데이터셋은 나중에 사람이 다시 열어 볼 수 있어야 한다. 복잡한 저장 구조는 처음에는 멋져 보이지만, 몇 주 뒤에는 스스로도 이해하기 어려울 수 있다. 처음에는 단순하고 명확한 구조가 좋다.
예를 들어 다음과 같은 폴더 구조를 사용할 수 있다.
dataset/
pick_red_cup/
episode_000001/
metadata.yaml
samples.jsonl
images/
rgb_000000.jpg
rgb_000001.jpg
rgb_000002.jpg
depth/
depth_000000.png
depth_000001.png
episode_000002/
metadata.yaml
samples.jsonl
images/
depth/samples.jsonl은 한 줄에 하나의 샘플을 저장하는 형식으로 생각할 수 있다. 각 줄에는 시간, 이미지 경로, 관절 상태, 엔드 이펙터 자세, 그리퍼 상태, 행동이 들어간다. 이미지와 깊이 데이터는 파일로 따로 저장하고, JSON에는 경로를 넣는다.
대규모 데이터셋에서는 더 효율적인 바이너리 포맷이나 데이터베이스를 쓸 수 있다. ROS2 환경에서는 bag 파일로 원본 토픽을 저장한 뒤, 나중에 학습용 포맷으로 변환하는 방식도 흔하다. 하지만 처음부터 포맷에 너무 집착할 필요는 없다. 중요한 것은 빠짐없이, 동기화되어, 다시 재현 가능한 형태로 남기는 것이다.
기록 노드의 역할
데이터 기록 노드는 조용하지만 매우 중요한 역할을 한다. 텔레옵 노드가 로봇을 움직이는 동안, 기록 노드는 여러 입력을 받아 하나의 에피소드로 묶는다. 기록 노드는 로봇을 제어하지 않아도 된다. 오히려 제어와 기록을 분리하는 편이 안전하고 관리하기 쉽다.
기록 노드가 해야 할 일은 대략 다음과 같다.
start_episode(task_info)
while recording:
read latest camera image
read latest joint state
read latest end-effector pose
read latest gripper state
read latest action command
synchronize by timestamp
save sample
end_episode(success, failure_reason, notes)여기서 latest라는 말에 주의해야 한다. 단순히 가장 최근 값을 무조건 묶으면 시간 차이가 커질 수 있다. 가능하면 각 메시지의 타임스탬프를 보고 기준 시간에 맞춰 정렬해야 한다. 또한 저장이 느려져 제어 루프를 방해하지 않도록, 기록은 별도 스레드나 버퍼를 사용해 처리하는 것이 좋다.
실제 로봇에서는 "기록이 잘 되고 있는지"를 화면에 보여 주는 것도 중요하다. 현재 에피소드 번호, 저장된 샘플 수, 카메라 프레임 수, 누락된 메시지 수, 디스크 여유 공간을 표시하면 데이터 수집 중 문제를 빨리 발견할 수 있다. 한 시간 동안 열심히 시연했는데 이미지가 하나도 저장되지 않았다면 너무 늦다.
데이터 품질 검수는 수집 직후에 한다
데이터 수집이 끝난 뒤 바로 해야 할 일이 있다. 학습이 아니라 검수다. 방금 수집한 에피소드 몇 개를 재생해 보고, 상태와 행동이 맞게 들어갔는지 확인해야 한다. 이 과정을 건너뛰면 나중에 모델이 이상하게 학습될 때 원인을 찾기 어렵다.
검수할 때는 다음을 확인한다.
이미지가 실제 작업 장면을 제대로 담고 있는가.
관절 상태와 엔드 이펙터 위치가 비정상적으로 튀지 않는가.
행동 명령이 조작자의 입력과 같은 방향으로 기록되었는가.
그리퍼 열림·닫힘 시점이 영상과 맞는가.
성공과 실패 라벨이 실제 결과와 일치하는가.
시간 간격이 일정하고 큰 누락 구간이 없는가.
가장 좋은 검수 도구는 재생기다. 에피소드 데이터를 읽어 이미지와 로봇 상태, 행동 화살표를 함께 보여 주면 문제를 금방 찾을 수 있다. 예를 들어 이미지 위에는 그리퍼 위치를 표시하고, 오른쪽에는 dx, dy, dz 행동 벡터를 화살표로 보여 줄 수 있다. 그리퍼가 컵에 가까워지는데 행동 화살표가 반대 방향을 가리킨다면 좌표계나 동기화에 문제가 있을 가능성이 높다.
데이터 품질 검수는 귀찮지만 비용을 크게 줄여 준다. 나쁜 데이터로 학습한 뒤 모델을 고치려고 하면 며칠이 걸릴 수 있다. 반면 수집 직후 문제를 발견하면 텔레옵 매핑이나 기록 노드를 바로 수정하고 다시 모으면 된다.
다양성은 계획해서 넣어야 한다
좋은 시연 데이터에는 다양성이 있어야 한다. 하지만 다양성은 저절로 생기지 않는다. 사람이 아무 생각 없이 데이터를 모으면 비슷한 장면만 반복되기 쉽다. 컵을 항상 가운데 놓고, 로봇 초기 자세를 항상 같게 하고, 같은 조명에서만 수집하게 된다.
수집 전에 변화시킬 요소를 정해 두면 훨씬 균형 잡힌 데이터셋을 만들 수 있다. 예를 들어 컵 집기 작업이라면 컵 위치, 컵 방향, 로봇 초기 자세, 배경 물체, 조명, 카메라 각도를 조금씩 바꿔 가며 시연한다. 모든 조합을 완벽히 커버할 필요는 없지만, 실제 실행에서 만날 가능성이 높은 변화는 데이터에 들어가야 한다.
다양성을 넣을 때도 순서가 중요하다. 처음부터 너무 어려운 장면을 섞으면 시연 실패가 많아지고 데이터 품질이 떨어질 수 있다. 먼저 단순한 장면에서 안정적인 성공 데이터를 모으고, 이후 조금씩 변화를 추가하는 편이 좋다. 예를 들어 첫 번째 데이터셋은 빈 책상 위 컵, 두 번째 데이터셋은 컵 위치 변화, 세 번째 데이터셋은 주변 장애물 추가, 네 번째 데이터셋은 조명 변화처럼 확장할 수 있다.
이렇게 단계적으로 모으면 모델도 평가하기 쉬워진다. 단순 장면에서는 잘 되는데 장애물 장면에서 실패한다면 어떤 데이터가 부족한지 명확해진다.
시연자의 습관을 관리하기
모방학습 데이터에는 시연자의 습관이 남는다. 어떤 사람은 물체에 매우 천천히 접근하고, 어떤 사람은 빠르게 접근한 뒤 마지막에 급하게 멈춘다. 어떤 사람은 컵을 항상 위에서 집고, 어떤 사람은 옆에서 비스듬히 집는다. 모델은 이 차이를 모두 데이터로 본다.
한 명의 시연자만 사용하면 행동 스타일이 일관적이라는 장점이 있다. 하지만 그 사람의 습관에 과하게 맞춰질 수 있다. 여러 명의 시연자를 사용하면 다양한 전략을 배울 수 있지만, 같은 상황에서 행동이 서로 달라 모델이 혼란스러워질 수 있다.
따라서 데이터 수집 전에는 간단한 시연 가이드를 만드는 것이 좋다. 예를 들어 컵을 집을 때는 먼저 위쪽으로 충분히 접근한 뒤 천천히 내려가고, 그리퍼가 컵 양옆에 들어간 뒤 닫고, 들어 올릴 때는 일정 높이까지 수직으로 올린다는 식이다. 이 가이드는 로봇을 딱딱하게 만들기 위한 규칙이 아니라, 데이터의 일관성을 유지하기 위한 약속이다.
시연자별 ID도 남겨야 한다. 나중에 특정 시연자의 데이터에서 실패가 많거나 움직임이 과격하다는 것을 발견하면, 그 데이터를 제외하거나 별도로 분석할 수 있다.
작은 데이터셋으로 먼저 전체 루프를 닫기
모방학습 프로젝트에서 흔한 실수는 처음부터 대량 데이터를 모으는 것이다. 아직 기록 포맷도 안정되지 않았고, 행동 표현도 확정되지 않았고, 학습 코드도 검증되지 않았는데 수천 개의 에피소드를 모으면 나중에 문제가 생겼을 때 손실이 크다.
처음에는 아주 작은 데이터셋으로 전체 루프를 닫는 것이 좋다. 예를 들어 컵 집기 시연 20개만 수집한다. 그 데이터로 학습용 포맷을 만들고, 간단한 Behavior Cloning 모델을 학습하고, 시뮬레이션이나 저속 실제 로봇에서 실행해 본다. 성능이 완벽하지 않아도 괜찮다. 목적은 전체 파이프라인이 이어지는지 확인하는 것이다.
이 작은 실험에서 많은 문제가 드러난다. 이미지와 행동이 한 프레임씩 어긋나 있을 수 있다. 그리퍼 상태가 반대로 저장되었을 수 있다. 행동 값의 단위가 너무 커서 로봇이 흔들릴 수 있다. 관절 상태가 빠진 것이 모델 성능에 큰 영향을 줄 수도 있다.
작은 데이터셋으로 이런 문제를 고친 뒤에야 대량 수집을 시작해야 한다. 데이터 수집은 시간이 많이 드는 작업이다. 많이 모으기 전에 제대로 모이는지 확인하는 것이 가장 빠른 길이다.
수집 데이터와 스킬 구조 연결하기
이 책에서는 로봇을 하나의 거대한 모델로만 보지 않고, 인식, 계획, 실행, 피드백, 안전 제어가 결합된 에이전트로 바라본다. 모방학습 데이터도 이 구조와 연결해서 생각해야 한다.
예를 들어 pick 스킬 내부를 모방학습으로 만들고 싶다면, 데이터는 pick에 필요한 구간을 잘 담아야 한다. 컵을 찾는 단계부터 집고 들어 올리는 단계까지 기록할 수 있다. 하지만 컵을 목표 위치에 놓는 place까지 한 모델에 넣을지, 아니면 pick과 place를 나눌지는 설계 선택이다.
작업을 너무 크게 잡으면 모델이 배워야 할 것이 많아진다. "책상 위 컵을 찾아 집고 오른쪽에 놓기" 전체를 하나의 정책으로 배우려면 탐색, 접근, 잡기, 이동, 놓기를 모두 처리해야 한다. 반대로 작업을 너무 잘게 나누면 각 스킬은 쉬워지지만 스킬 사이 연결과 전환 조건을 설계해야 한다.
실용적인 접근은 처음에는 짧은 스킬부터 데이터로 만드는 것이다. 예를 들어 "이미 컵이 카메라에 보이고, 로봇팔이 근처에 있을 때 컵을 집어 들어 올리기"처럼 범위를 좁힌다. 이 스킬이 안정되면 나중에 상위 계획기나 LLM 에이전트가 이 스킬을 호출하도록 연결할 수 있다.
이번 장의 핵심 정리
로봇 행동 데이터 수집은 모방학습의 부가 작업이 아니라 핵심 작업이다. 사람이 로봇을 조작하는 장면을 그냥 저장하는 것이 아니라, 로봇이 학습할 수 있는 상태와 행동의 쌍으로 정리해야 한다. Teleoperation은 그 출발점이다. 조이스틱, 키보드, 마우스, VR 컨트롤러는 각각 다른 성격의 시연 데이터를 만들며, 입력 방식에 따라 움직임의 부드러움과 자유도가 달라진다.
좋은 데이터셋에는 카메라 이미지, 관절 상태, 엔드 이펙터 자세, 그리퍼 상태, 사용자 행동 명령이 시간적으로 맞춰 들어 있어야 한다. 타임스탬프와 에피소드 단위 저장, 메타데이터, 성공·실패 라벨은 나중에 학습과 분석을 가능하게 만든다.
성공 데이터만으로는 충분하지 않다. 실제 로봇은 실행 중 작은 오차를 만들고, 그 오차는 누적될 수 있다. 그래서 실패 장면과 복구 행동을 의미 있게 기록해야 한다. 단, 실패 행동을 정답처럼 섞지 않도록 라벨링해야 한다.
다음 장에서는 이렇게 수집한 데이터를 모델이 사용할 수 있는 형태로 더 구체화한다. 이미지 상태, 관절 상태, 엔드 이펙터 위치, 행동 벡터를 어떻게 표현하고, 한 시점의 샘플을 어떤 입력과 출력으로 나누는지 살펴볼 것이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.