실행
학습한 checkpoint 를 studio 의 Policy 페이지에서 Pinkrab 에 실행합니다. 실행 중에 policy 가 실수하면 Hermit 으로 두 팔을 넘겨받아 바로잡을 수 있고, 바로잡은 구간은 다음 학습의 데이터가 됩니다.
- 첫 구동과 같이
ros2 launch pinkrab_bringup robot.launch.py로 로봇을 bringup 합니다. - 작업 자리에 물체를 놓습니다. 시연할 때와 같은 자리, 같은 종류의 물체여야 policy 가 학습한 장면을 봅니다.
- 실행할 checkpoint 가 이 컴퓨터로 복사되어 있어야 합니다(Train 페이지의 copy here).
실행 전 점검
섹션 제목: “실행 전 점검”새 checkpoint 는 실물에서 Drive 하기 전에 pinkrab-picture-swap 으로 policy 가 그리퍼 카메라 영상을 보고 움직이는지 확인합니다.
pinkrab-picture-swap ~/pinkrab/train/<run>/checkpoints/last/pretrained_model학습에 쓴 dataset 에서 프레임을 골라, 두 손의 영상을 다른 프레임의 것으로 바꿨을 때와 state 를 바꿨을 때 policy 의 답이 얼마나 달라지는지를 손마다 잽니다. 영상을 바꿔도 답의 방향이 거의 같다면(cos 가 +1 에 가까우면) policy 는 영상이 아니라 state 를 보고 움직이는 것이라서, 실물에서는 처음 움직인 방향으로 계속 흘러갑니다. 두 손 모두 영상을 바꾼 답이 cos 0.55 이하이면 “looks at its pictures” 로 통과하고, 아니면 “does NOT look at its pictures” 를 출력하고 종료 코드 1 로 끝납니다. 기준값은 pinkrab_core config 의 swap_max_picture_cos 이고, 검사하려면 학습에 쓴 dataset 이 이 컴퓨터에 있어야 합니다.
Policy 페이지
섹션 제목: “Policy 페이지”studio 첫 화면의 Policy 카드를 누르면 위 막대에 연결 상태와 교정 페달, Connect 가 있고, 그 아래 왼쪽에 두 단계, 오른쪽에 두 팔의 손목 카메라 화면과 policy 의 답이 나옵니다. 버튼은 누를 수 있을 때만 켜집니다.
Connect 를 누르면 실물 로봇과 두 팔의 손목 카메라, 페달을 엽니다. 탑 카메라는 교정할 때만 켜집니다. 필요한 설정이 끝나지 않았으면 무엇이 남았는지 보여 줍니다.
- Checkpoint: 실행할 checkpoint 를 고릅니다. 작업 명령을 받는 policy 이면 아래에 command 칸이 나오고, 처음에는 dataset 의 작업 설명이 들어 있습니다.
- Run: Ask 또는 Drive 를 누릅니다. 연결되면 두 팔을 Ready·Home 자세로 옮기는 버튼도 여기에 나옵니다.
| 버튼 | 동작 |
|---|---|
| Ask | 두 팔을 Ready 자세를 거쳐 시연이 시작한 자세로 옮긴 뒤, policy 에 물어 그 답을 화면에 그리기만 합니다. 팔은 더 움직이지 않습니다 |
| Drive | 두 팔을 같은 시작 자세로 옮긴 뒤, policy 의 답대로 팔을 움직입니다 |
| Stop | 그 자리에서 멈춥니다. 서보는 멈춘 자리를 버팁니다 |
시작 자세는 시연들의 첫 자세를 평균한 자리라서, 두 팔은 시연에서 두 손이 서 있던 만큼 벌어지고 서로를 향한 채 시작합니다. 처음 실행하는 checkpoint 는 Ask 로 답을 먼저 보고 Drive 로 넘어가는 편이 안전합니다.
policy 가 숫자가 아닌 값(NaN)을 답하거나, 관절이 한계에 닿은 채 목표에서 계속 멀어지면 실행이 멈춥니다. 팔에 가는 명령은 실행 중에도 safety gate 의 관절 범위·충돌·속도 검사를 거칩니다.
추론 설정
섹션 제목: “추론 설정”Checkpoint 옆의 톱니 버튼을 누르면 설정 창이 열립니다. 위에는 어느 카메라가 어느 팔의 것인지 고르는 칸이 있고, 아래에는 고른 checkpoint 의 policy type 추론 설정이 학습 때 값과 나란히 보입니다. 다시 학습하지 않고 바꿀 수 있는 값들로, 예를 들어 chunk 에서 몇 step 을 실행한 뒤 다시 카메라를 볼지(n_action_steps), 한 step 에 겹치는 chunk 들을 섞을지(temporal_ensemble_coeff) 같은 것입니다. 모든 policy 에 공통인 값(장치, 관절 속도, 실행을 멈추는 기준)은 “every policy” 에 접혀 있습니다.
Save 를 누르면 ~/pinkrab/inference.yaml 에 저장되고, 다음 Ask 와 Drive 부터 그 값으로 실행합니다.
움직임 shaping
섹션 제목: “움직임 shaping”safety gate 는 policy 의 명령을 바로 서보에 보내지 않고 부드럽게 다듬습니다(shaping). 명령은 관절이 향할 자리로만 쓰이고, gate 가 초당 60번 관절마다 그 자리로 다가가는 setpoint 를 계산해 보냅니다. 이때 관절의 속도, 가속도, 가속도의 변화(jerk)가 각각 상한 아래에 머물러서, chunk 와 chunk 가 이어지는 자리에서 명령이 갑자기 꺾여도 팔은 0.1 초쯤에 걸쳐 방향을 바꿉니다. 다듬은 자세도 관절 범위와 충돌 검사를 똑같이 거칩니다.
| 설정 (every policy) | 기본값 | 뜻 |
|---|---|---|
smoothing |
켜짐 | shaping 을 쓸지. 끄면 명령을 받는 대로 max_joint_dps 만 지켜 보냅니다 |
max_joint_dps |
60 | 관절 속도 상한, °/s |
max_joint_accel_dps2 |
400 | 관절 가속도 상한, °/s². 60 °/s 까지 0.15 초 |
max_joint_jerk_dps3 |
8000 | 가속도 변화의 상한, °/s³. 낮을수록 출발과 멈춤이 더 둥글어집니다 |
shaping 은 명령을 조금 늦게 따라가게 만듭니다. 30 °/s 로 움직이는 명령이라면 팔은 약 2° 뒤에서 따라가고, 멈춘 명령은 지나치지 않습니다. policy 는 다음 동작을 팔이 실제로 있는 자리가 아니라 마지막으로 보낸 자리에 더하므로, 이 지연은 쌓이지 않습니다. 명령이 0.1 초 넘게 오지 않거나 숫자가 아닌 값처럼 명령 자체가 거절되면, gate 는 팔을 마지막 명령까지 데려가지 않고 그 자리에서 감속해 세웁니다. 관절 읽기값이 끊기거나 다듬은 자세가 충돌 검사에 걸리면 마지막으로 보낸 자세에서 바로 섭니다. gate 는 policy 가 팔을 넘겨받을 때마다 설정을 다시 읽으므로, 저장한 값은 다음 Drive 부터 적용됩니다. Hermit 따라가기, 교정, studio 의 jog 와 Ready·Home 이동도 같은 방식으로 다듬는데, 상한은 inference.yaml 이 아니라 pinkrab_core config 의 teleop 값(속도 300 °/s, 가속도 900 °/s², jerk 15000 °/s³)을 쓰고 jaw 는 속도 상한만 지킵니다.
Hermit 으로 교정
섹션 제목: “Hermit 으로 교정”Drive 로 실행하는 동안 policy 가 실수하면 풋 페달로 두 팔을 넘겨받아 바로잡습니다. 넘겨받을 때마다 교정 하나가 시작되고, 교정에서 Hermit 이 팔을 움직인 구간마다 dataset 의 에피소드 하나가 됩니다. 페달 1 로 팔을 세운 동안은 구간이 나뉩니다.
| 페달 | policy 가 움직일 때 | 두 팔을 넘겨받은 동안 |
|---|---|---|
| 2 | 두 팔을 넘겨받습니다 | policy 에게 돌려줍니다 |
| 1 | 팔이 Hermit 을 따라가게 하거나, 그 자리에 세웁니다 | |
| 3 | 실행을 멈추고 기록을 저장합니다 | 이번 교정을 버리고 팔을 그 자리에 세웁니다 |
- 팔이 틀어지기 시작하면 바로 페달 2 로 넘겨받습니다. 두 팔은 그 자리에 선 채 기다리고, 넘겨받은 순간의 자세가 기억됩니다.
- 양손의 Hermit 을 팔의 tool 과 비슷한 자세로 잡은 뒤 페달 1 을 밟으면, 첫 구동과 같이 팔이 Hermit 이 움직인 만큼 따라갑니다. 각 jaw 는 policy 가 마지막으로 보낸 열림을 유지하다가, Hermit 의 jaw 열림이 그 값에 닿으면 그때부터 손가락을 따라갑니다.
- 바로잡은 뒤 페달 2 를 밟으면 policy 가 그 자리에서 이어서 움직입니다.
교정을 잘못했으면 넘겨받은 동안 페달 3 을 밟습니다. 두 팔은 Hermit 을 더 따라가지 않고 그 자리에 서며, 그 교정은 기록에 버린 것으로 표시되어 dataset 에 들어가지 않습니다. 책상 위에서 움직인 물체를 손으로 제자리에 돌려놓은 뒤 페달 2 를 밟으면, 두 팔이 넘겨받았던 자세로 천천히 되돌아가 다시 세운 상태로 기다리고, 그때부터 2번 단계를 다시 합니다. 교정을 버린 뒤나 팔이 되돌아가는 동안 페달 3 을 밟으면 실행을 멈춥니다. 어느 경우든 페달 3 을 밟아서 팔이 움직이기 시작하는 일은 없습니다.
교정은 짧게 끝내고, policy 가 이어받을 수 있는 자세로 되돌려 놓은 뒤 돌려주는 편이 좋습니다. 이미 크게 벗어난 뒤의 교정은 policy 가 다시 만나기 어려운 장면이기 때문입니다.
실행 기록
섹션 제목: “실행 기록”Drive 로 한 실행은 처음부터 멈출 때까지 모두 기록됩니다. 두 손목 카메라의 영상, 두 팔의 관절, 그리고 그 순간 누가 팔을 움직였는지(policy, 사람, 세움)가 함께 남습니다. 탑 카메라는 넘겨받는 순간 켜지고 손을 놓으면 꺼지므로, Hermit 마커는 교정하는 동안만 기록됩니다. 기록할 수 없으면 실행하지 않습니다.
이번에 남긴 기록은 페달 아래 목록에 보이고, 누르면 영상으로 다시 볼 수 있습니다. 기록은 Collect 페이지 목록에도 시연과 함께 나타나며, Convert 하면 다시 하지 않고 남긴 교정에서 Hermit 이 팔을 움직인 구간만 구간마다 에피소드 하나로, 팔 쪽 카메라 영상과 팔의 관절로 계산한 동작으로 dataset 에 들어갑니다. 녹화 방식과 원리는 교정 데이터에 있습니다.
실행 결과 판정
섹션 제목: “실행 결과 판정”목록의 기록마다 succeeded 와 failed 가 있어서, 그 실행이 과제를 해냈는지 지켜본 사람이 적습니다. 영상과 관절 기록만으로는 물체가 제자리에 들어갔는지 알 수 없기 때문입니다. 누른 쪽을 다시 누르면 판정이 지워지고, 판정은 그 기록의 meta.json 에 outcome 으로 남습니다.
Hermit 으로 넘겨받은 실행은 policy 혼자 해낸 것이 아니라서 판정 버튼 대신 taken over 가 보이고 실패로 셉니다. 목록 위에는 지금 고른 checkpoint 의 실행 가운데 몇 번이 성공했는지가 나오며, 아직 판정하지 않은 실행은 세지 않습니다. 같은 조건으로 여러 번 실행해 성공률을 잴 때는 실행이 끝날 때마다 바로 판정하고, 실패한 실행도 지우지 않고 남겨 둡니다.