규칙으로 움직이기
센서 값에 따라 정해진 동작을 하도록 코드를 짠다. 모든 Physical AI 의 출발점.
글을 쓰는 AI 와 달리 Physical AI 는 몸이 있습니다. 센서로 세상을 읽고, 판단하고, 모터로 세상을 바꿉니다. 이 페이지는 그 구조와 꼭 필요한 용어를 정리하고, 우리 제품마다 어느 개념을 배울 수 있는지 나눠 보여 줍니다.
① 환경Environment선 위를 달리는 로봇카
② 관찰Observation카메라가 본 선과 블록
③ 판단Policy · 정책행동 = f(관찰)
Step고리 한 바퀴
④ 행동Action오른 바퀴를 더 빨리 → 왼쪽으로
매 Step 마다 같은 Policy(정책)가 관찰을 받아 행동을 고릅니다. 학습은 에피소드를 여러 번 되풀이하며 Policy 를 고쳐 가는 일입니다.
로봇이 놓인 세계. 책상·블록·바닥·사람까지 전부
센서·카메라가 지금 읽어 들인 값
관찰을 받아 다음 행동을 고르는 함수 — 규칙이든 신경망이든
모터·관절에 보내는 명령. 행동이 환경을 바꾸고 다시 관찰된다
고리를 한 번 도는 것을 스텝, 일을 시작해서 끝날 때까지를 에피소드라고 합니다. 센서가 관찰을, 모터(액추에이터)가 행동을 맡고, 그 사이의 Policy(정책)를 어떻게 만드느냐가 AI 의 몫입니다.
① 규칙Rule-based사람이 규칙을 적는다
② 강화학습RL해 보고 보상으로 고친다
③ 모방학습Imitation사람 시연을 따라 한다
④ VLAVision-Language-Action보고 듣고 바로 움직인다
⑤ LLM 플래너LLM Planner단계로 쪼개 도구를 부른다
| 방법 | 어떻게 | 무엇이 필요한가 | 잘하는 것 | 약한 곳 |
|---|---|---|---|---|
| 규칙 Rule-based | 사람이 if-then 규칙을 직접 적는다 | 필요 없음 | 예측 가능하고 바로 동작한다 | 상황이 조금만 바뀌어도 규칙을 다시 써야 한다 |
| 강화학습 Reinforcement Learning | 해 보고, 보상을 받고, 더 나은 쪽으로 고친다 | 시뮬레이션 속 수많은 시도 | 사람이 못 적는 동작(걷기·균형)을 찾는다 | 보상을 잘못 주면 엉뚱한 요령을 배운다 |
| 모방학습 Imitation Learning | 사람이 시연한 동작을 데이터로 모아 따라 하게 한다 | 시연 에피소드 수십~수백 개 | 보상을 설계하지 않아도 된다 | 시연에 없던 상황에 약하다 |
| VLA Vision-Language-Action | 보고(Vision) 말을 알아듣고(Language) 행동(Action)까지 내는 큰 모델 | 대규모 사전학습 + 우리 시연으로 미세조정 | 자연어로 일을 시킬 수 있다 | 무겁고, 실패 이유를 알기 어렵다 |
| LLM 플래너 LLM Planner | LLM 이 작업을 단계로 쪼개고 로봇 도구(함수)를 부른다 | 학습 없이 도구 설명만 | 처음 보는 지시도 계획을 세운다 | 느리고, 손 동작 자체는 다른 Policy 가 맡아야 한다 |
센서 값에 따라 정해진 동작을 하도록 코드를 짠다. 모든 Physical AI 의 출발점.
거리·색·기울기·관절 각도를 읽어 로봇이 지금 상태를 안다.
목표와 현재의 차이를 줄이도록 모터 명령을 계속 고친다(PID). 넘어지지 않는 로봇의 핵심.
관절 각도로 손끝 위치를 계산(FK)하고, 원하는 위치에 손을 보낼 각도를 거꾸로 구한다(IK).
카메라 영상에서 색·선·얼굴·물체를 찾아 위치를 알아낸다. 이미 학습된 모델을 쓰는 단계.
학생이 직접 모은 데이터로 분류 모델을 학습시켜 규칙을 대신한다(k-NN·이미지 분류).
보상을 주고 시행착오로 행동을 배우게 한다. 걷기·균형처럼 규칙으로 적기 어려운 동작.
사람이 리더암 등으로 시연한 동작을 데이터셋으로 모아 그대로 따라 하게 학습시킨다.
자연어 지시를 알아듣고 행동한다 — VLA 모델이나 LLM 이 도구를 부르는 방식.
가상 세계에서 먼저 시험하고 실물로 옮긴다. 둘의 차이(Reality Gap)를 줄이는 것이 과제.
| 제품 | ①규칙 | ②센서 | ③제어 | ④기구학 | ⑤비전 | ⑥분류 학습 | ⑦강화학습 | ⑧모방학습 | ⑨언어·VLA | ⑩시뮬레이션 |
|---|---|---|---|---|---|---|---|---|---|---|
| Quacky 꽥꽥이 (두 발 걷기 로봇) 초등 | ● | ○ | ● | |||||||
| T로보 초등 | ● | ○ | ||||||||
| 이노베이션 스톰 AI 로봇 초등 | ● | ● | ● | ● | ||||||
| V로보 초등 | ● | ○ | ||||||||
| AI 사탕 분류 스마트 팩토리 초등 | ● | ● | ● | |||||||
| Nezha 블록 분류기 초등 | ● | ● | ○ | |||||||
| LEGO Education Science 초등 | ● | ● | ○ | |||||||
| Duckbert 덕버트 (SG90 2족 보행 로봇) 중학교 | ● | ○ | ○ | ● | ||||||
| AiBlock AI 비전 키트 중학교 | ● | ● | ● | ● | ||||||
| XGO-Rider (micro:bit) 중학교 | ● | ● | ○ | ● | ||||||
| SPIKE Prime 컬러 소터 중학교 | ● | ● | ○ | |||||||
| 자율주행 AI 갈라쇼 중학교 | ● | ● | ○ | ● | ||||||
| Petoi Bittle X 로봇개 중학교 | ● | ● | ○ | ○ | ○ | |||||
| TurboPi AI 비전 로봇카 중학교 | ● | ● | ● | ○ | ○ | |||||
| LEGO Education CS & AI 중학교 | ● | ● | ● | ● | ||||||
| S 로보 중학교 | ● | ● | ○ | ○ | ● | |||||
| HiWonder uHandPi AI 로봇 손 중·고등학교 | ● | ○ | ● | ● | ||||||
| Wobbly 뒤뚱이 휠-레그 로봇 고등학교 | ● | ● | ● | ○ | ● | |||||
| StackForce Mini 휠-레그 로봇 고등학교 | ● | ● | ● | ○ | ● | |||||
| MentorPi A1 자율주행 고등학교 | ● | ● | ● | ● | ○ | |||||
| XGO-Rider2 (Raspberry Pi) 고등학교 | ● | ● | ● | ● | ○ | ● | ||||
| NexArm AI 로봇팔 고등학교 | ● | ○ | ● | ○ | ○ | ○ | ● | |||
| Hiwonder PuppyPi AI 로봇개 고등학교 | ● | ● | ● | ● | ○ | |||||
| reBot Arm B601 오픈소스 로봇팔 고등학교 | ● | ● | ○ | ● | ● | ● | ||||
| Microduck 마이크로덕 고등학교 | ● | ● | ● | ● | ||||||
| EV3 분류 기계 고등학교 | ● | ● | ○ | |||||||
| Dobot 컨베이어 분류 라인 고등학교 | ● | ● | ● | ○ | ○ | ● | ||||
| Unitree Go2 사족 보행 로봇 고등학교 | ● | ● | ● | ● | ||||||
| Unitree G1 휴머노이드 고등학교 | ● | ● | ● | ● | ||||||
| TetherIA Aero Hand Open 로봇 손 고등학교 | ● | ● | ○ | ● |
분류는 제품 페이지의 AI 단계·교육과정·구성을 근거로 엔스크린이 정했습니다. 상위 구성(Advanced·Ultimate·EDU)이나 동아리 심화 차시에서만 다루는 개념은 ○ 로 표시했습니다.
입력과 출력이 모두 데이터(텍스트·이미지·숫자)이고 결과가 화면에만 나타나는 AI입니다. 틀리면 다시 생성하면 되므로 실수의 대가가 작습니다.
ChatGPT 같은 LLM은 다음 단어를 내놓지만, 로봇 AI는 다음 순간의 관절 각도를 내놓아야 한다는 표로 비교합니다.
학습할 때 보지 못한 물체, 지시, 배치에서도 제대로 동작하는 능력입니다. VLA가 가장 크게 노리는 목표입니다.
학습 데이터에 있던 블록 위치에서도 실패했다면 일반화 문제가 아니라 정밀도 문제로 진단합니다.
카메라·센서로 실제 세계를 보고, 스스로 판단해, 모터를 움직여 물리 세계를 바꾸는 AI 분야입니다. 글이나 그림만 만드는 AI와 달리 몸을 가지고 행동합니다.
글을 잘 쓰는 챗봇도 컵 하나를 집어 식기세척기에 넣지는 못한다는 대비로 설명합니다.
세계 만들기, 시연, 데이터셋 기록, 학습, 평가로 이어지는 작업의 전체 흐름입니다. 뼈대가 같으면 새 과제나 실물 로봇에도 데이터와 설정만 바꿔 다시 쓸 수 있습니다.
최종 프로젝트에서 바꾸는 것은 세계·시연자·성공 판정·명령 문장뿐이고 IK, 카메라, 데이터셋 형식, 학습 명령은 그대로입니다.
사람이 동작 순서와 계산을 코드로 직접 짜 넣어 로봇을 움직이는 방식입니다. 학습 기반 AI와 대비됩니다.
앞 장의 프로그램은 블록 좌표, 역기구학, 다섯 단계 상태 기계가 필요했지만, ACT는 이미지만 보고 바로 행동을 냅니다.
사람이 상황별 동작을 코드로 직접 적어 로봇을 움직이는 방식입니다. 짧고 설명하기 쉽고 데이터가 필요 없지만, 상황이 바뀌면 규칙을 다시 써야 하고 깨지기 쉽습니다.
높이 상수 하나가 5 mm 어긋나자 성공률이 0%가 되었습니다. 산업용 로봇 대부분이 이 방식입니다.
몸을 가진 AI라는 뜻의 학계 용어로, 몸으로 세계와 부딪치며 배우는 지능을 연구하는 관점입니다. 이 책에서는 Physical AI와 같은 뜻으로 묶어 씁니다.
Embodied AI는 연구 관점, Physical AI는 산업·제품 관점을 조금 더 강조하는 이름으로 구분합니다.
정책이 내놓아 환경에 보내는 명령입니다. 로봇팔에서는 여러 관절의 목표 각도를 담은 숫자 배열이 됩니다.
1차원 세계에서는 +1 또는 -1이었고, SO-101 로봇팔에서는 길이 6짜리 실수 배열입니다.
한 번 관측한 뒤 여러 스텝 분량의 행동을 한꺼번에 내놓는 방식입니다. 열린 고리와 닫힌 고리의 중간쯤에 있습니다.
ACT 모델이 이 방식을 써서 묶음을 실행한 뒤 다음 관측에서 다시 계획합니다.
환경 속에서 행동하고 그 결과로 배우는 주체입니다. 안에 정책이 들어 있습니다.
5부 실습에서는 신경망 정책이 에이전트 역할을 합니다.
환경을 관찰하고, 정책이 행동을 고르고, 그 행동을 환경에 적용하는 과정을 계속 되풀이하는 구조입니다. 책 전체에서 이 틀은 바뀌지 않고 정책의 내용물만 점점 강해졌습니다.
정책 자리에 if문, IK와 상태 기계, PPO 신경망, ACT, SmolVLA, 그리고 LLM이 차례로 들어갔습니다.
주어진 환경에서 상황을 살피고, 무엇을 할지 고르고, 실제로 행동하는 주체(프로그램)입니다. LLM 에이전트는 도구를 쓰고, 로봇(Physical Agent)은 모터를 움직인다는 점만 다릅니다.
LLM 에이전트와 로봇을 나란히 놓으면 둘 다 관측→판단→행동을 반복하고, 환경이 디지털이냐 물리 세계냐만 다르다고 정리합니다.
행동한 결과를 다시 관찰해 다음 판단에 반영하는 방식입니다. 실패를 알아채고 고쳐 다시 시도할 수 있습니다.
LLM이 사진으로 블록 위치를 1.5 cm 잘못 추정해 빈 집게를 옮겼지만, 다시 사진을 보고 블록이 그대로인 것을 알아채 위치를 고쳐 성공했습니다.
행동한 결과를 다시 관측하고 그에 맞춰 다음 행동을 정하는 반복 방식입니다. 매번 다시 보기 때문에 중간에 생긴 오차를 바로잡을 수 있습니다.
관측→판단→행동을 도는 세 줄 루프 자체가 닫힌 고리입니다.
에이전트를 둘러싼 바깥 세계 전체입니다. 에이전트는 환경을 직접 고칠 수 없고 행동을 통해서만 영향을 줍니다.
실습의 LineWorld 클래스가 환경이고, 2부부터는 MuJoCo 시뮬레이터가 환경 역할을 합니다. 책상·블록·조명은 물론 로봇 팔 자체도 환경에 포함됩니다.
에이전트가 환경으로부터 받아 보는 정보입니다. 세계의 일부만 담고 있어서 전부를 알려 주지는 않습니다.
실습에서는 위치와 목표가 든 딕셔너리였고, 로봇에서는 카메라 이미지·관절 각도·그리퍼 개폐 여부가 됩니다. 관측을 무엇으로 줄지가 문제의 난이도를 좌우합니다.
센서로 세상을 관찰하고 몸(로봇)으로 행동하는 에이전트입니다. 로봇 동작을 도구로 열어 주면 대화형 AI 에이전트가 그대로 물리 에이전트가 됩니다.
AI 에이전트의 관측(도구 결과)·판단(LLM)·행동(도구 호출)이 로봇의 관측(카메라·센서)·판단(정책)·행동(관절 목표)과 칸칸이 대응합니다.
관측을 넣으면 다음 행동을 내놓는 함수로, Physical AI에서 'AI'에 해당하는 핵심 부분입니다. 함수의 모양은 같고 안의 내용물만 바뀝니다.
처음엔 if문 하나로 만든 정책이 책이 진행되며 강화학습 신경망, ACT, VLA로 바뀝니다.
세계의 완전하고 정확한 실제 모습(모든 물체의 위치·속도·질량·마찰 등)입니다. 시뮬레이터에서는 그대로 읽을 수 있지만 현실에서는 관측을 통해 짐작할 수밖에 없습니다.
3부까지는 시뮬레이터에서 블록 좌표(State)를 바로 읽고, 4부부터는 카메라 이미지(Observation)만으로 블록을 찾게 해서 난이도 차이를 체험합니다.
관찰 → 판단 → 행동의 고리를 한 바퀴 도는 것을 1 스텝이라고 합니다. 로봇은 이 고리를 1초에도 수십 번 되풀이하며 움직입니다.
선을 따라가는 로봇카라면 카메라 한 장을 보고 바퀴 속도를 한 번 정하는 것이 1 스텝입니다. 목표까지 7 스텝 걸렸다면 고리를 일곱 번 돈 것입니다.
닫힌 고리는 실행 중에 계속 다시 관측해 행동을 고치는 방식이고, 열린 고리는 처음 정한 대로 관측 없이 실행하는 방식입니다. 행동 묶음은 둘 사이의 절충입니다.
ACT는 2.5초마다 다시 보므로 블록을 살짝 밀어도 다시 찾아갈 수 있습니다.
실수 값처럼 끝없이 많은 값 중에서 정하는 행동입니다. 선택지가 무한해 학습이 훨씬 어렵지만 로봇은 피할 수 없습니다.
관절 6개의 각도를 실수로 정하는 로봇팔 제어.
정해진 몇 개의 선택지 가운데 하나를 고르는 행동입니다. 선택지가 유한해 다루기 쉽습니다.
격자 세계에서 위·아래·왼쪽·오른쪽 네 방향을 0~3 정수로 고르는 것.
열린 고리는 처음에 한 번 관측한 정보를 끝까지 믿고 실행하는 방식이고, 닫힌 고리는 실행 중에도 다시 관측해 결과를 확인하고 고치는 방식입니다.
비전 Pick and Place는 시작할 때 사진 한 장만 찍는 열린 고리라 블록이 밀리면 실패합니다. 매 단계 다시 찍으면 닫힌 고리가 됩니다.
처음에 계획을 세운 뒤 중간 결과를 확인하지 않고 끝까지 실행하는 방식입니다. 세계가 예상과 조금만 달라도 실패하기 쉽습니다.
블록이 예상 위치에서 1cm만 벗어나도 실패하는 것이 Rule 기반 Pick and Place가 취약한 이유로 연결됩니다.
센서가 세계의 일부만 보여 주기 때문에 전체 상태를 알 수 없는 상황입니다. Physical AI를 어렵게 만드는 대표적인 이유 중 하나입니다.
카메라는 물체의 앞면만 볼 뿐 뒷면이나 무게는 알 수 없습니다.
환경이 제공하는 두 기본 동작입니다. reset()은 새 에피소드를 위해 세계를 처음으로 되돌리고, step()은 행동을 적용해 시간을 한 칸 진행한 뒤 결과(관측·보상·종료 여부)를 돌려줍니다.
격자 세계에서 reset()은 에이전트를 (0,0)으로 돌려놓고, step()은 이동 후 보상과 done을 함께 알려 줍니다.
로봇 자신의 관절 각도와 속도처럼 로봇이 스스로 정확히 알 수 있는 정보입니다. 세계 전체의 상태와 달리 관측의 일부로 함께 들어갑니다.
VLA에 이미지·언어 명령과 함께 Robot State를 넣어 행동을 얻는 그림으로 나옵니다.
작업을 정해진 단계(상태)로 나누고 단계마다 할 일과 다음 단계로 넘어가는 조건을 정해 두는 프로그램 구조입니다.
Pick and Place의 각 단계는 '목표 위치로 이동'과 '집게 조작' 두 동작으로만 이루어지며, Lift 뒤 블록이 안 올라오면 실패로 끝냅니다.
모방학습의 가장 단순한 형태로, 시연 데이터의 (관측, 행동) 쌍을 모아 관측이 들어오면 시연자의 행동을 맞히도록 신경망을 훈련합니다. 라벨이 행동인 지도학습이라고 보면 됩니다.
이미지 분류가 (사진, 라벨)을 배우듯, 여기서는 (카메라 화면+관절각, 행동)을 배웁니다.
사전학습된 모델을 내 데이터로 조금 더 학습시켜 내 로봇과 작업에 맞추는 것입니다. 보통 일부 부분만 학습해 비용을 줄입니다.
파인튜닝 전 SmolVLA는 0%였지만, 우리 데이터셋으로 파인튜닝하자 평균 23% 성공했습니다.
사람이 작업을 여러 번 보여 준 (관측, 행동) 기록을 신경망이 그대로 흉내 내도록 학습하는 방법입니다. 보상이 필요 없고 수십 번 시연으로도 되는 경우가 많아 실물 로봇 연구의 주류가 되었습니다.
책에서는 로봇이 없으므로 3부의 규칙 기반 프로그램이 지치지 않는 자동 시연자가 되어 데이터를 만듭니다.
특정 작업에 쓰기 전에 아주 큰 범용 데이터로 미리 모델을 학습해 두는 것입니다. 이렇게 얻은 지식 덕분에 적은 로봇 데이터로도 학습이 가능해집니다.
로봇 시연 50번으로 '빨간'의 뜻까지 가르치기는 어렵지만, VLM은 그 지식을 이미 가지고 시작합니다.
관측을 무시하고 아무 행동이나 무작위로 고르는 정책입니다. 비교 기준선으로 쓰이며, 강화학습은 이런 무작위 시도에서 출발합니다.
5×5 격자에서 100번 돌리면 우연히 33%쯤 성공하지만, 규칙 정책은 매번 최단 8걸음에 도착합니다.
로봇이 여러 번 시도해 보면서 보상을 많이 받은 행동을 더 자주 하도록 정책을 조금씩 고쳐 가는 학습 방법입니다. 시연이 필요 없지만 보상 설계가 어렵고 시행착오가 매우 많이 필요합니다.
'블록에 가까우면 +1'처럼 보상을 잘못 주면 로봇이 블록 옆에서 손만 흔들 수도 있다는 예를 듭니다.
행동이 얼마나 좋았는지를 숫자로 매긴 점수로, 사람이 설계합니다. 학습할 때만 쓰이고, 학습이 끝난 정책은 보상을 보지 않습니다.
목표 도착 +10, 시간 초과 -1, 매 걸음 -0.1로 '빨리 도착할수록 좋다'를 표현합니다. 모방학습에는 보상이 없습니다.
사람이 if문 같은 규칙을 직접 적어 만든 정책입니다. 데이터가 필요 없고 이유를 설명하기 쉽지만, 규칙에 없는 상황이나 이미지처럼 복잡한 입력에는 약합니다.
'목표가 오른쪽이면 오른쪽으로 한 칸'이라는 규칙 정책은 격자 세계에서 100% 성공하지만 벽 하나만 생겨도 갇힙니다.
카메라 이미지와 말로 된 명령(그리고 로봇 상태)을 함께 받아 로봇 행동을 출력하는 하나의 큰 모델입니다. VLM의 세상 지식을 물려받아 한 모델로 여러 작업을 할 수 있지만 크고 GPU가 필요합니다.
'빨간 블록을 상자에 넣어'라는 문장과 이미지를 넣으면 행동이 나옵니다. RT-2, OpenVLA, π0, SmolVLA로 발전해 왔고, 학습 방식 자체는 모방학습입니다.
작은 실수로 시연에 없던 상황에 들어가면, 그 상황을 배운 적이 없어 더 큰 실수가 이어지는 현상입니다. Behavior Cloning의 대표적 약점입니다.
블록을 살짝 밀어 놓은 뒤처럼 시연자가 가 본 적 없는 상태에서 로봇이 점점 더 엇나갑니다.
활용은 지금까지 보상을 받은 행동을 반복하는 것이고, 탐험은 더 나은 행동을 찾으려고 새로운 행동을 시도하는 것입니다. 둘을 어떻게 섞느냐가 알고리즘마다 다릅니다.
활용만 하면 더 좋은 행동을 영영 못 찾고, 탐험만 하면 보상이 낮습니다.
파인튜닝 때 일부 층의 가중치를 바꾸지 않고 그대로 두는 것입니다. 사전학습으로 얻은 능력을 적은 데이터로 망치지 않게 지킵니다.
SmolVLA는 Vision Encoder와 언어 모델을 고정해, 4.5억 파라미터 중 약 1억만 학습합니다.
규칙 대신 신경망으로 만든 정책으로, 데이터를 통해 파라미터를 학습합니다. 이미지처럼 규칙을 적기 어려운 입력을 다룰 수 있지만 왜 그렇게 행동했는지 설명하기 어렵습니다.
5부의 정책은 14개 숫자를 받아 은닉층 2개(각 64 뉴런)를 거쳐 관절 목표 변화량 5개를 내놓습니다.
정책을 한 번에 크게 바꾸지 않고 이전 정책에서 너무 멀어지지 않도록 조금씩 고치는 강화학습 알고리즘입니다. 연속 행동에 바로 쓸 수 있고 기본 설정으로도 잘 동작합니다.
Stable-Baselines3로 PPO 모델을 만들고 learn()을 부르면 학습이 시작됩니다. 이 책은 강화학습 알고리즘으로 PPO 하나만 씁니다.
원하는 행동을 배우도록 보상 함수를 잘 적는 일입니다. 에이전트는 우리가 원하는 것이 아니라 적힌 보상을 최대화하므로, 보상에 허점이 있으면 그 허점을 파고듭니다.
가까이 가는 것만 보상하면 블록 옆에서 손만 흔들 수 있습니다. 로봇팔 실습에서 보상 식만 바꿔 성공률이 46%와 100%로 갈렸고, 손가락 방향은 보상에 없어 배우지 않았습니다.
희소 보상은 목표에 도달했을 때만 보상을 주고, 밀집 보상은 매 스텝 거리 등에 따라 보상을 줍니다. 희소 보상은 우연히 성공하기 전까지 신호가 없어 학습이 어렵습니다.
점 환경은 랜덤 성공률이 8%라 희소 보상도 통했지만, 로봇팔은 랜덤 성공률 0%라 희소 보상이 46%에 그쳤고 밀집 보상은 96%였습니다.
입력과 정답이 짝지어진 데이터로 모델이 정답을 맞히도록 훈련하는 방식입니다. 모방학습과 VLA 학습도 결국 이 방식입니다.
ACT는 예측한 행동 묶음과 시연의 정답 행동 묶음 차이를 줄이도록 학습합니다.
시연마다 다른 '스타일'을 작은 잠재 벡터 z로 압축해 함께 학습하여, 서로 다른 시연이 평균되어 버리는 것을 막는 장치입니다. 실행 때는 z를 0으로 둡니다.
z를 0으로 고정하므로 ACT는 같은 입력에 늘 같은 행동을 내고, 결과가 noise에 흔들리지 않습니다.
무작위 잡음에서 시작해 여러 단계에 걸쳐 잡음을 걷어 내며 행동을 다듬어 만드는 생성 방식으로, 확산 모델과 가까운 친척입니다. 여러 행동을 평균 내 버리는 문제를 피합니다.
SmolVLA는 잡음에서 출발해 10단계로 행동 묶음을 다듬습니다. 그래서 출발 noise가 달라지면 행동도 달라집니다.
같은 상황에서 올바른 행동이 여러 가지인 성질입니다. 단순히 평균을 내 배우면 어느 쪽도 아닌 엉뚱한 행동이 나옵니다.
시연자가 장애물을 어떤 때는 왼쪽, 어떤 때는 오른쪽으로 돌면 평균인 가운데로 가서 부딪힙니다.
거리 벌점에 '이번 스텝에 얼마나 가까워졌는가'와 도달 보너스 같은 항을 더해 학습을 돕도록 다듬은 보상입니다.
로봇팔 실습에서 shaped 보상은 100% 성공으로 가장 좋았습니다. 도달 보너스가 '근처에 머물기'와 '실제 도달'을 구분해 줍니다.
매 스텝 새로 예측하면서, 이전 예측들이 같은 시점에 대해 내놓은 행동과 가중 평균해 부드럽게 움직이게 하는 기법입니다.
실패 원인을 고치려고 켜 보았지만 오히려 0/6으로 나빠졌습니다.
물체를 아래로 끌어당기는 힘으로, 시뮬레이터에서는 숫자 하나로 바꿀 수 있습니다. 기본값은 지구와 같은 아래쪽 9.81입니다.
중력을 달의 값(-1.62)으로 바꾸면 블록이 책상에 닿는 시간이 2배로 늘고 튕긴 뒤 한참 만에 멈춥니다.
중력·충돌·마찰·관성 같은 물리 법칙을 컴퓨터 안에서 계산해 가상 세계를 움직이는 프로그램입니다. 로봇용은 보기 좋음보다 실제와 비슷함을 중시합니다.
가상 세계에서는 하루에 수만 번 실패해도 되고, 중력·마찰을 마음대로 바꾸며, 모든 물체 좌표를 언제든 읽을 수 있습니다.
시뮬레이터 안에 둔 카메라로, RGB와 깊이 이미지를 공짜로 주고 위치·방향·시야각을 정확히 알 수 있습니다.
장면에는 top(위 80 cm에서 내려다봄), fixed(비스듬히), side, front, wrist_cam(손목에 달림) 카메라가 있습니다.
가상 세계 안의 물체 하나로, 위치와 자세를 가집니다. 관절이 없는 바디는 세계에 고정됩니다.
레고 블록 한 조각에 비유하며, 관절 없는 책상 바디는 블록이 떨어져도 밀리지 않습니다.
물체의 모양끼리 닿거나 부딪히는 것을 계산하는 것입니다. 로봇이 물건을 잡으려면 접촉 계산이 정확해야 합니다.
책상에 떨어진 블록이 멈춘 뒤에도 높이 값이 아주 조금씩 떨리는데, 시뮬레이터가 맞닿은 면을 살짝 말랑하게 계산하기 때문입니다.
아무 데도 묶이지 않고 공간을 자유롭게 움직이는 물체에 붙이는 특별한 관절입니다.
떨어지는 공이나 굴러가는 블록에 붙이며, 위치 3개와 자세(쿼터니언) 4개로 7개의 값을 가집니다.
물체가 미끄러지거나 구르는 것을 막는 힘으로, MuJoCo에서는 미끄럼·비틀림·구름 마찰 세 값으로 정합니다.
기울인 책상에서 마찰 값을 1.0과 0.05로 바꿔 블록이 미끄러지는지 비교해 봅니다.
바디의 모양(구·상자·평면 등)을 정하는 요소로, 충돌 계산과 화면 그리기에 쓰입니다.
블록의 겉모습에 해당하며, 상자의 size는 절반 길이, 구의 size는 반지름입니다.
NVIDIA의 로봇 시뮬레이터로, 사실적인 렌더링과 대규모 병렬 시뮬레이션을 제공합니다. 고사양 GPU가 필요해 입문용 기본 도구에서는 뺐습니다.
외관 차이를 줄여 현실 격차를 본격적으로 좁히거나 천·액체 같은 복잡한 장면, 휴머노이드가 필요할 때 넘어갑니다.
이름을 붙여 저장해 둔 초기 상태로, 관절각·물체 위치(qpos)와 모터 명령(ctrl)을 한 번에 지정합니다.
home 키프레임은 팔을 위로 세워 손을 41 cm 높이에 둔 대기 자세로, 블록을 치거나 카메라를 가리지 않도록 두 번 고쳐 만들었습니다.
mj_forward는 시간을 흘리지 않고 현재 관절각에서의 위치 같은 파생값만 계산하고(기하), mj_step은 시간을 진행시키며 중력·모터 등 물리를 계산한다(물리).
IK를 풀 때는 mj_forward만 수백 번 부르며, 실제 상태를 건드리지 않으려 사본 데이터를 씁니다. qpos를 바꾼 뒤 위치를 읽으려면 mj_forward가 필요합니다.
mj_step은 가상 세계의 시간을 한 간격(timestep)만큼 앞으로 진행하는 함수입니다. 간격을 줄이면 더 정확해지지만 계산이 느려집니다.
기본 간격은 0.002초라서 1초를 흘리려면 500스텝을 돌립니다.
MuJoCo에서 가상 세계(바닥·물체·로봇·카메라 등)를 적어 두는 XML 형식의 설계 파일입니다.
XML 몇 줄로 바닥과 공 하나를 만들고, 중력 값 하나를 바꿔 '달에서 떨어뜨리기'를 해 봅니다.
MuJoCo가 세계를 나누는 두 객체입니다. MjModel은 모양·질량·관절 구조처럼 변하지 않는 설계도이고, MjData는 위치·속도·힘처럼 시간에 따라 변하는 현재 상태입니다.
책은 MjData가 곧 세계의 State라고 설명합니다.
MuJoCo에서 로봇을 다룰 때 가장 많이 쓰는 세 배열입니다. qpos·qvel은 관절의 현재 각도와 속도(관측), ctrl은 구동기에 보내는 명령(행동)입니다.
ctrl에 목표 각도를 넣어도 관절이 즉시 그 각도가 되지 않고 서서히 따라갑니다. 명령(ctrl)과 상태(qpos)는 서로 다른 배열입니다.
조명, 바닥 색, 카메라 위치처럼 학습 때 변하지 않았던 조건을 일부러 바꾸어 성능이 얼마나 유지되는지 재는 시험입니다.
사람 눈엔 같은 장면인데 바닥 색만 바꾸자 성공률이 50%에서 0%로, 카메라를 5 cm 옆으로 옮기자 10%로 떨어졌습니다.
MuJoCo 모델 안에 위치와 방향을 재기 위해 찍어 둔 기준점입니다. 로봇 손끝 위치와 손가락 방향을 읽을 때 씁니다.
SO-101의 gripperframe site는 두 손가락 사이에 있고 그 x축이 손가락 방향입니다. 처음에 z축으로 착각해 IK가 수렴하지 않았습니다.
Isaac Sim 위에서 강화학습과 모방학습을 하도록 만든 프레임워크입니다. 도메인 무작위화를 설정 몇 줄로 지원합니다.
reset/step 구조는 익숙한 형태 그대로지만 관측과 행동이 수천 개 환경 묶음으로 오갑니다.
같은 환경을 여러 개 동시에 돌려 학습 데이터를 빨리 모으는 방법입니다.
로봇팔 학습은 CPU에서 환경 8개를 병렬로 돌려 30만 스텝을 약 4분에 끝냈습니다.
GPU 하나로 수천 개의 로봇 환경을 동시에 돌려 학습 데이터를 빠르게 모으는 방법입니다.
4096개 로봇의 관측을 한 번에 처리해, 규모를 수백 배 키워도 학습 시간이 비슷하게 유지됩니다.
시뮬레이터의 물리 파라미터(마찰, 질량 등)를 실제 로봇과 물체를 측정해 그 값에 맞추는 작업입니다.
물리 오차를 줄이는 대비책으로, 시뮬레이션 쪽 숫자를 실물에 맞춰 고칩니다.
관절에 힘이나 목표 위치를 주어 실제로 움직이게 하는 장치, 즉 모터에 해당합니다.
SO-101의 구동기 6개는 모두 '이 각도로 가라'는 목표 각도를 받는 위치 제어형이며, 얼마나 세게 끌어당길지는 kp 값이 정합니다.
서로 독립적으로 움직일 수 있는 방향(관절)의 수입니다. 손을 공간의 원하는 위치와 자세로 모두 보내려면 최소 6 자유도가 필요합니다.
산업용 로봇팔이 6축인 이유이며, SO-101은 관절 5개+그리퍼 1개로 6 DOF입니다.
로봇팔 사슬의 맨 끝에서 실제로 일을 하는 부분입니다.
물체를 집는 그리퍼가 대표적인 엔드 이펙터입니다.
리더 팔의 움직임을 따라 실제 작업을 수행하는 팔입니다. 그 관절 센서 값이 관측 상태로 기록되고, 학습 뒤에는 정책이 이 팔에 명령을 보냅니다.
리더와 팔로워 사이의 작은 차이가 데이터의 '목표 관절각'과 '실제 관절각'의 차이로 나타납니다.
관절 각도들이 주어졌을 때 로봇 손끝이 어디에 있는지 계산하는 것입니다. 답이 항상 하나로 정해지고 계산이 확실합니다.
2관절 팔에서 두 관절이 모두 0이면 손끝은 두 링크 길이의 합(0.26 m)에 있고, 두 번째 관절을 접으면 손끝이 원점 쪽으로 다가옵니다.
물체를 집었다 놓는 집게 형태의 엔드 이펙터입니다.
SO-101의 gripper 관절은 사람의 손가락처럼 집게를 열고 닫습니다. 여닫아도 손끝 위치는 변하지 않습니다.
손끝을 보내고 싶은 목표 위치(와 방향)가 주어졌을 때 필요한 관절 각도를 거꾸로 찾는 문제입니다. 답이 없거나 여러 개일 수 있어 FK보다 어렵습니다.
블록 위 8 cm를 목표로 IK를 풀자 오차 0.9 mm로 관절각을 찾았고, 팔 길이 밖인 45 cm 앞은 오차가 줄지 않아 '못 간다'는 신호가 나왔습니다.
한 부분이 다른 부분에 대해 어떻게 움직일 수 있는지를 정하는 연결부입니다. 로봇팔의 관절은 대부분 한 축으로 회전하는 hinge입니다.
경첩이나 레일에 비유합니다. SO-101의 shoulder_pan, elbow_flex 등이 모두 hinge 관절입니다.
관절과 관절 사이를 잇는 단단한 막대 부분입니다. 로봇팔은 링크와 관절이 번갈아 이어진 사슬입니다.
사람 팔의 위팔·아래팔에 해당합니다.
로봇팔은 단단한 막대(링크)들이 회전하는 이음매(관절)로 이어진 구조입니다. 관절 각도가 바뀌면 그 뒤의 링크들이 함께 움직입니다.
FK는 각 링크를 앞 링크 끝에 누적 각도로 이어 붙이는 원리로 손끝 위치를 구합니다. SO-101은 관절이 5개입니다.
물체가 어느 쪽으로 얼마나 돌아가 있는지를 나타내는 정보입니다. 오일러 각이나 쿼터니언으로 표현합니다.
블록을 Z축으로 45도 돌려 놓으면 위치는 그대로지만 자세가 바뀝니다.
물체를 집어 들어 정해진 곳에 내려놓는 대표적인 로봇 작업입니다. 이 책의 모든 AI 실습은 이 작업을 AI가 대신하게 만드는 과정입니다.
블록 위로 손 보내기→내려가기→집기→들어 올리기→상자 위로 옮기기→놓기를 규칙으로 먼저 완성합니다.
위치와 자세를 함께 묶은 정보입니다. 물체나 로봇 손끝이 '어디에, 어떤 방향으로' 있는지를 한꺼번에 말해 줍니다.
손을 블록 위로 보낸다는 것은 손끝 위치를 블록 위로, 손가락 방향을 아래로 맞춘다는 뜻입니다.
원점에서 X, Y, Z 방향으로 각각 얼마나 떨어져 있는지를 세 숫자로 나타낸 것입니다.
pos="0.25 0 0.015"는 로봇 앞 25 cm, 바닥에서 1.5 cm 높이라는 뜻입니다.
로봇의 좌표계·운동학·제어를 다루는 오래된 공학 분야입니다. 전통 로봇은 사람이 짠 프로그램대로 움직이지만, Physical AI는 같은 기초 위에서 행동을 학습된 모델이 정하게 합니다.
공장 용접 로봇은 부품이 1cm만 어긋나도 실패하는 반면, Physical AI는 처음 보는 컵이나 다른 조명에서도 동작하는 것을 목표로 합니다.
The Robot Studio가 공개한 저가형 오픈소스 로봇팔로, 서보 모터 6개(관절 5개+그리퍼)로 이루어져 있습니다. LeRobot이 공식 지원하고 MuJoCo용 모델도 있어 가상과 실물을 잇기 좋습니다.
관절 이름이 역할을 말해 줍니다: shoulder_pan(좌우 회전), shoulder_lift(들어 올림), elbow_flex(팔꿈치), wrist_flex·wrist_roll(손목), gripper(집게).
시뮬레이션 전체의 원점을 기준으로 모든 물체를 같은 잣대로 재는 좌표계입니다.
MuJoCo의 xpos, xquat 값은 월드 좌표계 기준의 Pose입니다.
목표 물체 바로 위로 먼저 이동한 뒤 수직으로 내려가는 두 단계 동작입니다.
대기 자세에서 곧바로 낮은 높이로 가면 팔이 옆에서 들어가 블록을 밀어 버리므로 먼저 위 8 cm로 갑니다.
1초에 몇 번 판단하거나 명령을 갱신하는지를 나타낸 값(Hz)입니다. 관절을 안정적으로 잡으려면 수백 Hz가 필요합니다.
LLM은 한 번 답하는 데 수 초가 걸려 직접 모터를 제어할 수 없습니다. 그래서 굴러가는 물체 잡기나 힘 조절이 필요한 일은 학습된 정책 몫입니다.
느리게 생각하는 윗층(무엇을 어떤 순서로)과 빠르게 움직이는 아래층(관절을 목표에 붙잡아 두기)으로 역할을 나누는 설계입니다.
윗층 LLM은 0.2~2 Hz로 목표를 정하고, 아래층 제어기는 수백 Hz로 관절을 움직입니다. 윗층을 유지한 채 아래층 시뮬레이터나 로봇만 바꿀 수 있습니다.
각 관절의 현재 각도를 재는 센서입니다. 숫자가 바로 나오므로 따로 해석할 필요가 없습니다.
로봇 자신의 상태(Robot State)를 알려 주며, 시뮬레이션에서는 qpos가 이것에 해당합니다.
각 관절이 물리적으로 돌아갈 수 있는 최소·최대 각도입니다. 수학적으로 답이 있어도 이 범위를 넘으면 실제로는 갈 수 없습니다.
블록이 받침대에 너무 가까우면 손가락을 아래로 향하는 자세가 관절 한계에 걸려 IK 오차가 커지고 집기에 실패했습니다.
로봇의 움직임을 '손의 위치'가 아니라 '각 관절의 각도들'로 생각하는 관점입니다. 사람이 원하는 손 위치와 로봇이 받는 관절 각도 사이의 간극이 운동학의 주제가 됩니다.
로봇에게 주는 명령은 '손을 저기로'가 아니라 '관절 6개를 이 각도로'입니다.
관절 각도와 손끝 위치 사이의 관계를 계산하는 분야입니다. 각도에서 손 위치를 구하면 순운동학(FK), 원하는 손 위치에서 필요한 각도를 거꾸로 구하면 역운동학(IK)입니다.
관절을 하나씩 움직이며 손끝 좌표가 어떻게 바뀌는지 보는 실습이 운동학의 맛보기이고, 3부에서 본격적으로 다룹니다.
현재 값에서 목표 값까지 한 번에 건너뛰지 않고 일정한 간격으로 조금씩 나누어 이동하는 방법입니다.
move_arm은 목표 관절각을 정해진 시간에 걸쳐 나눠 보냅니다. 한 번에 넣으면 팔을 세게 휘둘러 블록을 치거나 실물에서는 위험합니다.
목표값과 현재값의 차이(오차)를 보고, 지금의 오차(P)·쌓인 오차(I)·오차가 변하는 속도(D)를 섞어 모터 명령을 계속 고치는 피드백 제어 방법입니다.
휠-레그 로봇이 앞으로 기울면 바퀴를 그만큼 앞으로 굴려 다시 세우는 것 — P·I·D 세 숫자를 바꾸며 잘 서는 값을 찾습니다.
위치는 손끝이 공간의 어디에 있는가(x, y, z), 자세는 손이 어느 방향으로 얼마나 기울거나 돌아가 있는가를 뜻합니다.
어깨·팔꿈치 쪽 관절 3개는 손의 위치를, 손목 관절은 손의 자세를 주로 바꾼다는 역할 분담을 실습으로 확인합니다.
목표 관절 각도를 받으면 그 각도로 가려고 힘을 내는 모터 모델입니다.
강성이 높고 팔이 가벼워 IK가 계산한 각도와 실제 도달 각도의 차이가 1 mm 미만이었습니다.
로봇 받침대를 원점으로 삼는 좌표계입니다. 로봇을 다른 곳으로 옮겨도 '내 앞 25 cm' 같은 표현이 그대로 유지돼 행동을 계산하기 편합니다.
이 책의 장면은 받침대가 원점에 있어 월드 좌표와 같지만, 실제 로봇에서는 거의 항상 다릅니다.
LLM이 팔이 닿지 않는 좌표를 요청하면 도구가 먼저 걸러 잘라 내는 장치입니다. 잘랐다는 사실을 숨기지 않고 결과에 알려야 LLM이 상황을 바르게 판단합니다.
이동 속도도 LLM에게 맡기지 않고 도구가 거리에 비례해 정했습니다. 1초에 30 cm를 옮기자 관성으로 블록이 빠졌기 때문입니다.
지시한 각도로 움직이고 그 위치를 유지하는 모터입니다. SO-101은 Feetech 서보 6개를 쓰며, 각각에 1~6번 ID를 붙여 구분합니다.
실물 서보는 각도를 도나 모터 틱 단위로 다뤄, 라디안을 쓰는 시뮬레이션 데이터와 합치려면 단위를 맞춰야 합니다.
로봇 손끝이 원하는 자세로 실제 도달할 수 있는 공간의 범위입니다. 바깥 경계(팔 길이)와 안쪽 경계(관절 한계)가 있습니다.
SO-101은 위치만 맞추면 39 cm까지 닿지만, 손가락을 아래로 향한 채로는 약 28 cm가 한계입니다.
손끝 등에 걸리는 힘과 비트는 힘을 재는 센서입니다.
이 책에서는 쓰지 않고 집게가 멈춘 각도로 잡았는지를 대신 판단합니다.
물체의 어느 부분을 어떻게 잡을지 정하는 일로, 로봇공학의 별도 연구 분야입니다.
상자는 벽 때문에 마스크 무게중심이 실제 중심과 달라 블록보다 오차가 컸습니다. 물체마다 잡을 지점을 정해야 하는 이유입니다.
기울기와 가속도를 재는 센서로 주로 이동 로봇에 쓰입니다.
이 책의 로봇팔 실습에서는 다루지 않습니다.
팔을 쭉 뻗은 자세처럼 자코비안의 역행렬 계산이 불안정해져 값이 폭발하는 자세입니다.
DLS의 감쇠 항은 특이점 근처에서 관절 변화가 터무니없이 커지는 것을 막습니다.
검출된 물체를 둘러싸는 사각형으로, 보통 왼쪽 위와 오른쪽 아래 픽셀 좌표로 나타냅니다. 상자 중심과 크기로 물체 위치·크기를 근사합니다.
버스 사진에서 bus 상자 (4, 229, 796, 728)처럼 출력됩니다.
이미지 전체가 무엇인지 하나의 클래스로 답하는 과제입니다.
'이 사진은 고양이'처럼 답하지만 어디에 있는지는 알려 주지 않아 로봇이 집기에는 부족합니다.
픽셀마다 카메라에서 그 지점까지의 거리(미터)를 담은 (높이, 너비) 배열입니다. RGB와 합치면 픽셀을 3차원 점으로 바꿀 수 있습니다.
top 카메라의 깊이 최댓값 0.8 m는 바닥까지 거리이고, 블록은 바닥보다 3 cm 가까운 작은 사각형으로 보입니다. 실물로는 Intel RealSense 같은 깊이 카메라가 있습니다.
이미지 안에서 무엇이 어디에 있는지를 클래스와 사각형(경계 상자)으로 여러 개 찾아내는 과제입니다. 로봇에게 필요한 최소한의 인식입니다.
검출 결과 하나는 클래스('cube'), 신뢰도(0.94), 경계 상자 좌표로 이루어집니다.
이미지와 영상을 처리하는 대표적인 컴퓨터 비전 라이브러리입니다. 4부에서 가상 카메라 이미지에서 블록을 찾는 데 씁니다.
일반판과 headless판 두 가지가 같이 설치되는데, 둘 다 cv2라는 같은 모듈 이름을 제공하므로 같은 버전으로 고정해 둡니다.
카메라 이미지처럼 해석이 필요한 센서 데이터에서 '무엇이 어디에 있다'는 쓸모 있는 정보를 뽑아내는 과정입니다.
책의 비교 실험에서는 짧은 색 검출 코드가 LLM 의 사진 판독보다 블록 위치를 더 정확하고 싸게 찾았습니다. 그래서 위치 찾기는 전용 비전이, 무엇을 할지는 LLM 이 맡는 식으로 나누는 편이 낫습니다.
해상도는 이미지의 가로·세로 픽셀 수, FPS는 1초에 찍히는 프레임(장) 수입니다.
640×480, 30 fps 영상 270장은 9초 분량이며, 배열 모양은 (세로, 가로, 채널) 순서인 (480, 640, 3)입니다.
픽셀마다 빨강·초록·파랑 세 값을 가진 보통 컬러 사진으로, (높이, 너비, 3) 배열입니다. 색과 모양은 알 수 있지만 거리는 알 수 없습니다.
사진 속 블록이 작게 보일 때 멀어서인지 원래 작아서인지 RGB만으로는 구분할 수 없습니다.
로봇이 자신과 주변 세계에 대한 정보를 얻는 장치로, 관측을 만들어 내는 통로입니다.
관절 인코더(관절 각도), RGB 카메라(색 이미지), 깊이 카메라(거리), 힘/토크 센서, IMU(기울기·가속도) 등이 있습니다.
이미지 속 물체를 빠르게 찾아내는 딥러닝 물체 인식 모델로, Ultralytics 패키지로 사용합니다. 추론은 CPU로도 가능합니다.
4부에서 가상 카메라 이미지를 그대로 넘겨 블록을 찾는 데 씁니다.
OpenCV가 색 채널을 파랑·초록·빨강 순으로 저장하는 관례입니다. 대부분의 다른 도구는 RGB 순서라 서로 넘길 때 바꿔 줘야 합니다.
순서를 안 바꾸면 빨간 블록이 파랗게 보이고 색 검출이 엉뚱한 물체를 잡습니다.
카메라 렌즈를 기준으로 한 좌표계입니다. 카메라가 찾은 점은 먼저 이 좌표로 계산된 뒤 월드·로봇 좌표로 옮겨야 합니다.
MuJoCo 카메라는 자기 -z 방향을 바라보므로, 깊이 d인 점의 카메라 z 좌표는 -d가 됩니다.
신뢰도는 모델이 검출을 얼마나 확신하는지 0~1로 나타낸 값이고, 임계값은 그보다 낮은 검출을 버리는 기준입니다. 임계값을 높이면 오검출은 줄지만 놓치는 것이 늘어납니다.
파란 상자를 0.50의 낮은 신뢰도로 'TV'라고 답했습니다. 엉뚱한 물체를 집으러 가느니 안 움직이는 편이 낫다면 임계값을 높게 잡습니다.
윤곽선은 마스크 속 흰 덩어리의 테두리이고, 무게중심은 그 덩어리 픽셀들의 평균 위치입니다.
findContours로 가장 큰 덩어리를 고르고 moments로 중심을, boundingRect로 둘러싼 사각형을 구했습니다.
카메라가 볼 수 있는 각도 범위입니다. MuJoCo의 fovy는 세로 방향 시야각입니다.
top 카메라는 시야각 45도로 80 cm 위에서 바닥 세로 약 66 cm 범위를 봅니다.
색을 색상(H)·채도(S)·명도(V)로 나눠 표현하는 방식입니다. 조명이 바뀌어도 주로 명도만 변해 색으로 물체를 찾기에 유리합니다.
OpenCV의 H는 0~179이며 빨강은 0 근처와 179 근처 두 구간에 걸쳐 있어 마스크 두 개를 합칩니다.
조건에 맞는 픽셀은 흰색(255), 나머지는 검은색(0)으로 표시한 흑백 이미지입니다.
inRange로 빨강 범위 픽셀만 남기고, 형태학적 OPEN 연산으로 한두 픽셀짜리 잡음을 지웁니다.
다른 물체가 앞을 가려 카메라가 대상을 보지 못하는 현상입니다. 카메라는 가장 가까운 표면만 봅니다.
대기 자세의 팔이 블록 위를 지나가 블록 픽셀의 깊이가 팔까지 거리로 읽혀 144 mm 오차가 났습니다.
깊이 이미지의 모든 픽셀을 3차원 점 (x, y, z)로 바꿔 모은 집합으로, 물체 모양을 3차원으로 다룰 때 씁니다.
이 책은 픽셀 몇 개만 3차원으로 바꾸므로 전체 포인트 클라우드는 만들지 않습니다.
투영은 3차원 점이 이미지의 어느 픽셀에 찍히는지 계산하는 것이고, 역투영은 픽셀과 깊이로부터 원래 3차원 점을 되찾는 것입니다. 역투영에는 깊이가 꼭 필요합니다.
블록 윗면 중심을 투영하니 (350, 240) 픽셀이었고, 그 픽셀의 깊이 0.77 m로 역투영하니 원래 좌표가 오차 0 mm로 돌아왔습니다.
가상 세계 속에 둔 카메라 시점에서 장면을 그려 이미지로 만드는 기능입니다. 결과는 실제 카메라 사진과 똑같은 숫자 배열이라 같은 비전 코드를 쓸 수 있습니다.
블록 낙하를 30fps로 찍어 영상(mp4)으로 저장하고, 4부에서는 이 이미지를 OpenCV와 YOLO에 넘깁니다.
카메라 이미지를 신경망이 쓰기 좋은 특징 지도로 바꾸는 이미지 처리 신경망입니다. ACT는 ImageNet으로 미리 학습된 것을 가져다 씁니다.
이미지를 32분의 1로 줄이면 특징 지도 한 칸이 12픽셀짜리 블록보다 커져 위치를 정밀하게 읽기 어려웠습니다.
이미지의 픽셀 하나하나가 어떤 물체에 속하는지 구분하는 과제로, 결과는 물체 모양의 마스크입니다.
색으로 만든 마스크는 사실 분할 결과이고, 거기서 중심과 사각형을 뽑아 검출 결과로 바꾼 셈입니다.
카메라 이미지를 모델이 다룰 수 있는 토큰(특징 벡터 나열)으로 바꾸는 부분입니다.
SmolVLA는 SmolVLM2의 비전 인코더를 쓰며, 이미지를 비율을 유지한 채 512×512로 맞추고 빈 곳을 채웁니다.
로봇 손목에 달려 손과 함께 움직이는 카메라로, 로봇의 눈높이에서 작업 대상을 가까이 봅니다.
위에서 보는 카메라와 손목 카메라를 함께 쓰면 손이 물체를 가리는 문제를 줄일 수 있고, 6부 데이터셋 관측에 함께 들어갑니다.
카메라 모델에서 픽셀 단위로 나타낸 렌즈의 확대 정도로, 시야각과 이미지 크기에서 계산됩니다. 카메라 내부 파라미터의 하나입니다.
세로 480 px, fovy 45도이면 f ≈ 579 px입니다. 실물 카메라는 캘리브레이션으로 이 값을 알아내야 합니다.
작은 구멍 하나로 빛이 들어와 상이 맺힌다고 보는 가장 단순한 카메라 수학 모델로, 픽셀 좌표와 3차원 점 사이의 관계를 식으로 줍니다.
픽셀 (u, v)에서 이미지 중심을 빼고 초점 거리로 나눈 뒤 깊이를 곱하면 카메라 좌표의 점이 됩니다.
적은 수의 시연만으로 정교한 작업을 배우게 하는 모방학습용 Transformer 모델로, 행동을 묶음 단위로 예측합니다.
2023년 ALOHA 연구에서 저가 로봇팔과 수십 번 시연으로 양손 작업을 배우게 했고, 책 6부에서 직접 학습시킵니다.
학습에 쓰려고 모아 둔 데이터 묶음입니다. 로봇 데이터셋은 에피소드 단위로 저장되며, 인터넷에 거의 없어 직접 만들어야 합니다.
LLM은 인터넷의 수조 개 토큰으로 배웠지만, '로봇이 컵을 집는 데이터'는 누군가 로봇을 움직여 만들어야 합니다.
로봇에게 작업 방법을 보여 주기 위해 실제로 한 번 수행해 기록한 것입니다. 모방학습의 학습 재료가 됩니다.
실물에서는 사람이 조종 장치로 시연하고, 시뮬레이션에서는 프로그램이 시연하며 실패한 시연은 버리면 됩니다.
시연하는 동안 기록한 관측과 행동을 모은 학습용 데이터 묶음입니다. 라벨을 사람이 따로 달지 않아도 시연과 동시에 자동으로 쌓입니다.
블록 위치를 무작위로 바꿔 50번 시연해 성공한 43개 Episode, 7,396 프레임을 저장했습니다.
시작부터 성공·실패·시간 초과로 끝날 때까지의 한 번의 시도입니다. 끝나면 환경을 처음 상태로 되돌려 다음 시도를 시작합니다.
블록 하나를 집어 상자에 넣는 것이 한 에피소드이고, '에피소드 50개짜리 데이터셋'은 시연을 50번 했다는 뜻입니다.
Episode 안의 한 순간을 기록한 데이터입니다. 카메라 이미지, 관절각, 행동, 시각, 작업 설명이 한 묶음으로 들어 있습니다.
20 fps로 기록하면 0.05초마다 프레임이 하나씩 생깁니다.
새 데이터가 들어오면 미리 모아 둔 예시 중 가장 가까운 k개를 찾아, 그중 많은 쪽의 이름표를 붙이는 가장 단순한 분류 방법입니다.
컬러 센서 값(R·G·B)을 색깔마다 몇 번씩 모아 두면, 새 블록의 값과 가장 비슷한 예시들의 색으로 분류합니다.
입력에 행렬 곱과 비선형 함수를 여러 번 반복해 출력을 만드는 함수입니다. 가중치(W, b)를 데이터로 조정하는 것이 학습입니다.
숫자 14개를 받는 작은 MLP(수천 개 파라미터)부터 이미지와 문장을 받는 SmolVLA(4.5억 개)까지 크기가 다양합니다.
Hugging Face가 만든 가벼운 VLA 모델입니다. 책 7부에서 자연어 명령으로 로봇을 움직이는 데 쓰입니다.
추론은 CPU로도 느리게 가능하지만, 파인튜닝에는 GPU나 Colab이 필요합니다.
여러 번 실행해 작업에 성공한 비율로, 로봇 AI 성능을 재는 가장 직접적인 지표입니다. 횟수가 적으면 우연에 따라 크게 흔들립니다.
20회 평가는 ±10%p 정도 오차가 있어서 50회로 늘려 보라고 권합니다. 성공 판정은 시뮬레이터의 실제 블록 위치로 합니다.
학습 도중이나 끝에 저장한 모델의 상태로, 가중치와 설정, 정규화 통계가 함께 들어 있습니다. 나중에 불러와 실행하거나 이어서 학습할 수 있습니다.
pretrained_model 폴더 하나가 Policy의 전부이고, Colab 세션이 끊겨도 저장된 체크포인트에서 이어 학습합니다.
사람·자동차·컵·병 등 80개 클래스의 물체에 라벨이 붙은 대표적인 이미지 데이터셋입니다.
COCO로 학습한 YOLO는 '블록'이라는 클래스를 몰라 시뮬레이션의 빨간 블록을 찾지 못했습니다.
학습 데이터가 담고 있는 상황들의 범위입니다. 모델은 이 범위 안에서는 어느 정도 맞히지만 범위 밖에서는 성능을 기대하기 어렵습니다.
무작위 위치로 배운 모델도 팔이 닿는 반경 밖의 블록은 학습한 적이 없어 다룰 수 없습니다.
모방학습용 데이터를 만들기 위해 과제를 직접 해 보이는 주체입니다. 이 책에서는 사람이 짠 상태 기계 프로그램이, 실물에서는 리더 팔을 움직이는 사람이 맡습니다.
시연자의 성공률이 80% 이상은 되어야 데이터 품질이 유지됩니다. 모델은 대개 시연자보다 낮은 성공률을 냅니다.
파인튜닝은 사전학습 모델을 자기 데이터로 추가 학습시키는 것이고, 라벨링은 그 데이터에 정답(예: 물체 상자)을 사람이 표시하는 작업입니다.
블록 이미지 수백 장에 상자를 그려 학습시키면 블록 검출기를 만들 수 있습니다. 이 책은 대신 색 기반 검출을 택했습니다.
1초에 몇 번 기록하는지를 나타내는 값입니다. fps에 따라 Episode의 프레임 수와 행동 묶음이 덮는 시간이 달라집니다.
20 fps에서 행동 50개는 2.5초 분량입니다.
학습 전에 사람이 정해 주는 설정값으로, 스텝 수, 배치 크기, 행동 묶음 크기 등이 있습니다.
ACT는 기본값으로도 대부분 동작해서 데이터셋 경로와 몇 가지 값만 정하면 됩니다.
학습이 끝난 모델에 입력을 넣어 출력(행동)을 얻는 실행 과정입니다. 모델이 클수록 한 번 추론에 시간이 더 걸립니다.
ACT는 수 ms, SmolVLA는 수십 ms가 걸려 매 스텝 추론하면 실시간을 넘기므로 행동 묶음이 더 중요해집니다.
학습이 진행되는 동안(누적 스텝) 에피소드 보상이 어떻게 변하는지 그린 그래프로, 경향을 보는 도구입니다.
점 환경에서 보상이 처음 1만 스텝 안에 급히 오르고 이후 흔들렸지만 성공률은 이미 100%였습니다. 평균 보상과 성공률은 다르므로 평가는 별도 에피소드의 성공률로 합니다.
LeRobot이 쓰는 로봇 데이터의 표준 형식으로, 시간 순서가 있고 Episode로 나뉘며 이미지·상태·행동이 같은 시각에 묶입니다. 형식이 같으면 학습 명령도 같아집니다.
폴더는 meta(구조·통계), data(숫자 표), videos(카메라 영상) 세 부분으로 나뉩니다.
데이터 자체가 아니라 데이터의 구조를 설명하는 정보로, fps, 카메라 이름, 관절 수, Episode 수 등을 담습니다. 크기가 작아 먼저 받아 볼 수 있습니다.
수 GB짜리 데이터셋도 메타데이터만 몇 초 만에 받아 내 로봇과 맞는지 확인하는 습관을 권합니다.
누군가 미리 학습해 저장해 둔 모델 파일입니다. 내려받으면 오래 걸리는 학습을 건너뛰고 바로 평가해 볼 수 있습니다.
GPU가 없는 독자는 필자가 학습해 둔 체크포인트를 받아 평가 실습부터 할 수 있습니다.
큰 데이터셋으로 미리 학습해 둔 모델입니다. 배운 클래스는 잘 찾지만 배운 적 없는 물체는 찾지 못합니다.
실제 버스 사진에서는 버스와 사람 넷을 찾았지만, 시뮬레이션 이미지에서는 블록을 찾지 못하고 상자를 TV로 오인했습니다.
같은 조건에서 다시 실행했을 때 같은 결과가 나오는 정도입니다. LLM은 시드를 고정할 방법이 없고 모델이 예고 없이 바뀌므로 반복 측정과 모델명·날짜 기록이 필요합니다.
같은 자리에서 10번 반복하니 결과가 거의 같았지만, 과제가 애매하던 시기에는 같은 위치가 성공과 실패를 오갔습니다.
배치는 한 번에 학습하는 샘플 묶음, 스텝은 배치를 한 번 학습한 횟수, 에폭은 데이터셋 전체를 한 바퀴 다 본 횟수입니다.
20,000스텝 × 배치 16 = 32만 샘플로, 7,396 프레임을 약 43번 본 셈입니다.
작업이 성공했는지를 숫자·조건으로 판정하는 함수입니다. 나중에 AI 성능을 재는 기준이 됩니다.
is_in_box는 블록 중심이 상자 가로세로 10 cm 안, 높이 5 cm 아래이면 성공으로 봅니다. 행동은 카메라로 정해도 채점은 시뮬레이터의 정답 위치로 합니다.
현대 AI 모델에서 널리 쓰이는 신경망 구조입니다. 이 책에서는 사람의 시연을 흉내 내는 정책의 형태로 등장합니다.
정책의 내용물이 if문 → 강화학습 신경망 → 시연을 흉내 내는 Transformer → VLA로 바뀌어 갑니다.
chunk_size는 한 번에 예측하는 행동 개수, n_action_steps는 그중 실제로 실행한 뒤 다시 예측하기까지의 스텝 수입니다.
이 책은 둘 다 기본값 100 대신 50으로 두어, 50스텝마다 새로 관측하고 예측합니다.
다른 조건은 모두 같고 한 가지(예: 명령 문장)만 다른 예시 쌍입니다. 모델이 그 한 가지 차이의 의미를 배우려면 이런 쌍이 필요합니다.
데이터를 두 배로 늘려도 언어를 못 배운 이유로, 같은 블록 배치에서 색만 바꾼 시연 쌍이 하나도 없었다는 점이 지목되었습니다. 데이터는 양보다 구성이 중요합니다.
한 신경망이 다른 신경망의 정보 중 필요한 부분에 주목해 가져오는 연결 방식입니다.
Action Expert가 이 방식으로 VLM 본체의 각 층에서 문맥을 읽습니다.
확산 모델 방식으로 행동을 만드는 Policy로, ACT보다 강력하지만 학습이 무겁고 조정할 것이 많다고 소개됩니다.
LeRobot은 ACT, Diffusion Policy, SmolVLA, π0를 같은 두 줄 코드로 쓰게 해 줍니다.
다층 퍼셉트론(층을 쌓은 보통의 신경망)으로 만든 정책입니다.
점 환경과 로봇팔 환경 모두 숫자 관측을 받는 MlpPolicy로 학습했습니다.
카메라 이미지를 영상으로 압축해 저장하는 형식입니다. 사진 수만 장보다 훨씬 작아지지만 꺼낼 때 디코딩이 필요합니다.
PNG로 저장하면 수 GB가 될 이미지가 MP4로는 수십 MB로 줄어듭니다.
길이가 모자란 입력 뒤를 0 같은 값으로 채워 정해진 크기로 맞추는 처리입니다. 관절 수가 다른 여러 로봇을 한 모델로 다루게 해 줍니다.
관절 6개짜리 로봇은 뒤에 0을 26개 붙여 32차원으로 맞추고, 출력도 앞 6개만 씁니다.
모델이 학습으로 값을 정해 가는 내부 숫자들입니다. 개수가 많을수록 모델이 크고 계산 자원이 많이 듭니다.
VLA는 수억~수십억 개의 파라미터를 가져 학습과 추론에 GPU가 필요합니다.
표 모양의 숫자 데이터를 효율적으로 저장하는 파일 형식입니다. LeRobot 데이터셋은 이미지를 뺀 숫자를 이 형식에 프레임당 한 행으로 담습니다.
기록을 끝낼 때 finalize를 부르지 않으면 Parquet 파일 끝부분이 쓰이지 않아 데이터셋을 열 수 없습니다.
VLA 발전 흐름의 대표 모델들입니다. RT-2는 행동을 텍스트 토큰처럼 낸 초기 사례, OpenVLA는 공개 VLA, π0는 Flow Matching 기반, GR00T N1은 휴머노이드를 겨냥한 대형 모델입니다.
흐름은 '더 큰 모델, 더 많은 데이터'였다가 SmolVLA에서 '작아도 실용적으로'라는 갈래가 생겼습니다.
데이터셋의 각 항목별 평균, 표준편차, 최솟값, 최댓값을 적어 둔 파일입니다. 학습과 실행 때 같은 정규화를 적용하는 데 쓰입니다.
학습이 끝나면 이 통계가 체크포인트 안의 전처리기·후처리기로 함께 저장되어 데이터셋 없이도 실행할 수 있습니다.
인터넷의 방대한 텍스트로 학습해 다음 단어를 이어서 만들어 내는 큰 언어 모델입니다. 세계를 읽고 쓰지만 스스로 물리 세계를 바꾸지는 못합니다.
ChatGPT에게 컵을 집어 달라고 하면 손이 없어 정중하게 거절한다는 이야기로 소개합니다.
언어 이해는 LLM이 맡아 할 일(목표)을 고르고, 실제 움직임은 규칙 코드나 학습된 정책이 실행하도록 층을 나누는 구조입니다. 학습 데이터 없이 문장으로 새 작업을 추가할 수 있지만 판단이 느립니다.
'파란 블록을 상자에 넣어'를 LLM이 '집기(파란 블록)'으로 바꾸면 아래층 정책이 행동으로 옮깁니다.
LLM이 글로 답하는 대신 미리 정의된 함수 중 하나를 골라 인자와 함께 부르겠다고 요청하는 기능입니다. 실제 실행은 우리 프로그램이 하고 결과를 다시 LLM에게 돌려줍니다.
장면 상태 읽기, 집게를 좌표로 옮기기, 집게 열고 닫기, 완료 보고 네 개의 도구만으로 집기 과제를 수행했습니다.
이미지와 텍스트를 함께 이해하는 모델입니다. 인터넷 자료로 미리 배워 '빨간 컵', '선반 위' 같은 말이 무엇을 가리키는지 이미 압니다.
VLM 위에 행동 출력을 덧붙이면 VLA가 됩니다.
VLM이 만든 문맥 특징을 읽어 실제 행동 묶음을 생성하는 별도의 작은 Transformer입니다. 파인튜닝 때 주로 학습되는 부분입니다.
SmolVLA의 Action Expert는 VLM 각 층과 교차 주의로 연결되어 문맥을 읽습니다.
입력 문장의 내용에 따라 모델의 행동이 실제로 달라지는 성질입니다. 같은 장면에서 문장만 바꿨을 때 행동이 바뀌는지로 확인합니다.
세 색 블록 실험에서 SmolVLA는 20개 배치 중 1개에서만 문장에 따라 다른 블록으로 갔습니다. 사실상 문장을 무시했습니다.
집기, 옮기기, 열기, 닦기처럼 아래층이 실행할 수 있는 기본 동작 묶음입니다. 윗층 계획자는 이 목록에서 골라 순서를 정합니다.
'식탁을 치워 줘' 같은 지시를 LLM 계획자가 스킬 순서로 쪼개면, 학습된 정책이나 고전 제어가 실제 손놀림을 맡습니다.
대화 시작 전에 LLM에게 주는 배경 지시문입니다. 모델이 스스로 알 수 없는 작업 요령을 여기에 적어 줍니다.
블록을 몇 cm 높이에서 잡고, 옆으로 옮기기 전에 얼마나 들어 올릴지 같은 요령은 사람이 프롬프트로 알려 주었습니다. LLM은 그 요령을 언제 어떤 순서로 쓸지만 정했습니다.
데이터셋의 프레임마다 함께 저장되는, 무슨 일을 하는지 적은 자연어 문장입니다. ACT는 이 문장을 무시하지만 VLA는 입력으로 사용합니다.
'Pick up the red cube and put it in the blue box.'라는 문장이 처음부터 데이터셋에 들어 있어서 같은 데이터로 SmolVLA도 학습할 수 있었습니다.
LLM이 글을 처리하는 단위로, API 요금이 토큰 수로 매겨집니다. 대화 기록을 매번 통째로 다시 보내기 때문에 호출이 늘수록 토큰이 빠르게 쌓입니다.
한 에피소드에 1만 토큰이 넘었고 입력이 출력보다 40배 이상 많았습니다. 도구 결과를 짧게 하고 사진은 필요할 때만 찍는 것이 비용 절감입니다.
토큰은 모델이 처리하는 입력의 작은 단위이고, 토크나이저는 문장을 토큰으로 쪼개 주는 도구입니다. 이미지와 로봇 상태도 토큰으로 바꿔 한 줄로 잇습니다.
SmolVLA는 지시문을 최대 48 토큰까지 받는데, 책의 지시문은 12 토큰 남짓입니다.
LLM이 부를 수 있도록 이름, 설명, 인자 형식을 적어 둔 함수입니다. 모델은 설명만 보고 언제 무엇을 부를지 정하므로 설명을 잘 쓰는 것이 곧 프로그래밍입니다.
도구 결과에 위치 오차와 기울어짐을 나눠 알려 주고 프롬프트 지침을 고치자 성공률이 40%에서 90%로 올랐습니다. 모델은 그대로였습니다.
관절 목표 같은 연속된 숫자를 잘게 나눠 단어처럼 만든 것으로, 초기 VLA는 언어 모델이 단어를 내듯 이것을 출력했습니다.
RT-2는 행동을 텍스트 토큰처럼 내놓았지만, SmolVLA와 π0는 연속값을 바로 출력해 정밀도와 속도에서 유리합니다.
이미지·언어·상태 토큰을 함께 받아 서로의 관계를 짓고, 행동을 만들 재료가 되는 문맥 특징을 내놓는 VLA의 중심부입니다.
'빨간'이라는 단어 토큰이 이미지의 빨간 영역에 주목하는 식으로 연결합니다. SmolVLA는 32층 중 앞 16층만 써 속도를 높였습니다.
센서나 모터의 읽은 값과 실제 각도·위치의 대응을 맞추는 작업입니다. 로봇은 각 관절을 양 끝까지 움직여 범위를 기록하고, 카메라는 위치·초점·렌즈 왜곡을 잽니다.
시뮬레이터는 관절 범위가 미리 정해져 있지만 실물에서는 캘리브레이션이 그 범위를 만듭니다. 리더와 팔로워를 각각 보정합니다.
시뮬레이터의 물리 값(중력·마찰 등)을 여러 가지로 바꿔 가며 학습시켜, 현실과의 차이에 덜 흔들리게 만드는 방법입니다.
같은 코드라도 중력·마찰 값이 다르면 결과가 달라진다는 관찰이 이 방법의 필요성으로 이어집니다(8부에서 다룸).
로봇이 이상하게 움직일 때 즉시 멈추는 수단입니다. 시뮬레이션에는 없던 실물 안전 수칙의 핵심입니다.
처음에는 속도와 토크를 낮추고, 키보드 중단이나 전원 스위치를 손 닿는 곳에 두며, 팔 반경 안의 사람과 깨지기 쉬운 물건을 치웁니다.
사람이 손으로 움직여 실물 로봇을 따라 움직이게 하는 조종용 팔입니다. 실물 로봇으로 시연 데이터를 모을 때 씁니다.
실물 모방학습에서는 Leader Arm으로 시연해야 하지만, 시뮬레이션에서는 프로그램이 그 역할을 대신합니다.
시뮬레이션과 실제 세계 사이의 차이 때문에 가상에서 잘 되던 AI가 현실에서 실패하는 문제입니다.
공 낙하 실험에서 공식값과 2mm 차이가 나는 것처럼, 시뮬레이션은 현실을 근사할 뿐이라는 점에서 출발합니다.
시뮬레이션에서 만든 파이프라인과 정책을 실제 로봇으로 옮기는 과정입니다. 코드와 절차는 대부분 그대로 가져가고, 데이터와 보정 값은 새로 맞춥니다.
실물에서는 관절 단위(라디안 대 도), 카메라 시점, 겉모습, 지연, 안전 다섯 가지를 새로 신경 써야 합니다.
실물 로봇 학습의 표준 4단계로, 조종해 시연하고, 관측과 행동을 기록하고, 모방학습으로 훈련한 뒤, 로봇에서 실행합니다.
이 책은 앞의 두 단계를 시뮬레이션 프로그램으로 대신하고, 학습 명령은 실물과 똑같이 씁니다.
사람이 조종 장치를 움직여 로봇을 직접 조작하며 시연하는 방법입니다. 실물 로봇 연구의 첫 단계로 쓰입니다.
사람이 Leader Arm을 잡고 움직이면 Follower Arm이 똑같이 따라 움직이고, 그 동작이 기록됩니다.
2023년에 저비용 양팔 로봇으로 적은 시연만으로 정교한 작업을 학습시킨 연구로, ACT가 여기서 제안되었습니다. 모방학습이 주류가 되는 전환점으로 소개됩니다.
2만 달러 미만 장비에 시연 50번으로 지퍼백 열기, 배터리 끼우기 등을 배우게 했습니다.
시뮬레이션에서 학습·검증한 것을 실제 로봇으로 옮길 때 생기는 차이와 그로 인한 문제입니다.
실물 로봇으로 10만 번 시도하면 며칠이 걸리고 망가질 수 있어 강화학습은 시뮬레이션에서 하지만, 그 결과를 현실로 옮기는 문제가 뒤따른다(8부).
실물 카메라의 초점 거리 같은 내부 파라미터와 렌즈 특성을 측정해 알아내는 작업입니다.
가상 카메라는 이 값을 정확히 알지만, 실물에서는 캘리브레이션 오차와 렌즈 왜곡이 더해져 위치 오차가 5~10 mm 수준이 됩니다.
카메라가 로봇 기준으로 어디에, 어떤 방향으로 있는지를 재는 작업입니다. 이것이 있어야 카메라가 본 픽셀을 로봇이 쓸 수 있는 좌표로 바꿀 수 있습니다.
실물 로봇에서 가장 시간이 많이 드는 준비 작업으로 꼽힙니다.
브라우저에서 무료 GPU(T4 등)로 파이썬 노트북을 실행할 수 있는 클라우드 서비스입니다. 개인 GPU가 없을 때 학습 단계에 씁니다.
책의 노트북 하나로 데이터셋 만들기부터 ACT 학습, 평가, SmolVLA 파인튜닝까지 진행합니다. 세션이 끊기면 파일이 지워지므로 체크포인트와 데이터셋을 드라이브에 백업합니다.
많은 계산을 동시에 처리해 신경망 학습을 크게 빠르게 해 주는 장치입니다. 이 책에서는 6~7부의 모델 학습에 주로 필요합니다.
1~4부(시뮬레이션·운동학·비전 추론)는 CPU로 충분하고, 실측에는 RTX 3060 12GB를 썼습니다.
신경망 학습을 빠르게 해 주는 연산 장치와 그 전용 메모리입니다. 메모리가 모자라면 'out of memory' 오류가 납니다.
시뮬레이션·데이터셋·평가는 CPU로도 되지만 ACT 학습과 SmolVLA 파인튜닝은 GPU가 필요합니다. 메모리가 부족하면 배치 크기를 줄입니다.
AI 모델과 데이터셋을 공유하는 플랫폼과 오픈소스 라이브러리를 만드는 회사입니다. LeRobot과 SmolVLA를 공개했습니다.
언어 모델 분야의 Transformers 라이브러리처럼, 로봇 학습 분야의 표준 도구로 LeRobot을 내놓았습니다.
Hugging Face가 공개한 오픈소스 로봇 학습 도구로, 데이터 기록·학습·배포를 한 흐름으로 묶어 줍니다. 로봇 없이 공개 데이터셋으로 학습하고 시뮬레이션에서 평가하는 길도 지원합니다.
조종→기록→학습→배포라는 LeRobot의 흐름이 곧 모방학습 파이프라인이며, 6부 전체에서 씁니다.
관절 로봇과 접촉 계산에 강한 무료 오픈소스 물리 시뮬레이터입니다(Multi-Joint dynamics with Contact). pip로 쉽게 설치되고 GPU 없이도 돌아갑니다.
2022년 Google DeepMind가 공개했고, 화면 없이도 실행되어 원격 서버나 Colab에서도 쓸 수 있습니다.
NVIDIA GPU에서 계산을 돌리기 위한 소프트웨어 기반입니다. PyTorch가 CUDA 런타임을 함께 설치하므로 따로 깔 필요는 없고, 드라이버만 충분히 새것이면 됩니다.
nvidia-smi로 드라이버를 확인하고, 파이썬에서 torch.cuda.is_available()이 True면 GPU를 쓸 수 있습니다.
강화학습용 환경을 표준 형식으로 만들고 쓰게 해 주는 파이썬 라이브러리로, 예제 환경에 함께 설치됩니다.
uv sync로 설치되는 핵심 패키지 목록에 포함되어 있습니다.
AI 모델과 데이터셋을 공유하는 온라인 저장소입니다. 공개 로봇 데이터셋이 이곳에 쌓이고 있습니다.
로봇이 없어도 다른 사람이 올린 시연 데이터를 내려받아 정책을 학습해 볼 수 있습니다.
Google DeepMind가 관리하는 검증된 MuJoCo용 로봇 모델 모음집입니다. 로봇을 직접 모델링하지 않고 가져다 쓸 수 있습니다.
전체는 2GB가 넘지만 예제 코드는 SO-101 폴더(약 27MB)만 골라 내려받습니다.
환경이 주는 관측과 받을 수 있는 행동의 모양(개수)과 값 범위를 미리 선언해 둔 것입니다.
점 환경은 관측 4개(-1~1), 행동 2개, 로봇팔 환경은 관측 14개, 행동 5개로 선언합니다.
신경망을 만들고 학습시키는 데 쓰는 대표적인 딥러닝 라이브러리입니다. 이 책에서는 5부(강화학습)부터 사용합니다.
설치 용량의 대부분을 차지하므로 디스크가 부족하면 2~4부 동안은 잠시 빼고 설치해도 됩니다.
여러 프로그램과 장치를 연결해 데이터를 주고받게 하는 로봇용 통신 기반입니다. 인식·학습 자체와는 별개라, 장치가 많아지거나 남의 패키지를 써야 할 때 배웁니다.
팔 하나와 카메라 두 대를 한 컴퓨터에서 쓰는 규모에서는 파이썬 스크립트가 더 단순해서 본편에서 뺐습니다.
검증된 강화학습 알고리즘을 모아 둔 파이썬 라이브러리로, 예제 환경에 함께 설치됩니다.
uv sync로 설치되는 핵심 패키지 목록에 들어 있으며 5부 강화학습에 대비한 것입니다.
step()이 돌려주는 두 가지 끝남 신호입니다. terminated는 과제 자체가 끝난 것(목표 도달), truncated는 시간 한도가 다 된 것입니다.
점 환경에서는 목표 반경 0.05 안에 들어오면 terminated, 100스텝을 넘기면 truncated입니다.
Astral이 만든 빠른 파이썬 패키지·프로젝트 관리자로, 가상환경 생성, 정확한 버전의 패키지 설치, 필요한 파이썬 버전 내려받기를 한 번에 처리합니다.
예제 저장소에서 uv sync 한 줄이면 필자와 똑같은 버전의 환경이 만들어집니다.
프로젝트마다 따로 분리된 파이썬 실행 공간으로, 패키지 설치가 시스템이나 다른 프로젝트와 섞이지 않게 해 줍니다.
설치가 꼬였을 때는 프로젝트의 .venv 폴더만 삭제하고 uv sync 로 다시 깔면 깨끗하게 복구됩니다. 가상 환경을 끄면 그 안에만 설치한 MuJoCo 를 찾지 못하는 것도 확인할 수 있습니다.
GPU에 달린 메모리로, 모델 학습에 얼마나 큰 GPU가 필요한지 가늠하는 기준이 됩니다.
ACT 학습은 약 2 GB, SmolVLA 파인튜닝은 약 2.9 GB를 써서 RTX 3060에서도 돌아갔습니다.
로봇에 달린 작은 컴퓨터(임베디드 GPU 등)에서 직접 모델을 돌리는 분야입니다. 추론 지연, 양자화, 실시간 제약을 다룹니다.
이 책이 다루지 않은 분야로, 현장 배포를 원하면 Edge AI와 제어를 공부하라고 권합니다.
모니터 창을 띄우지 않고 가상 카메라 이미지를 계산해 파일로 저장하는 방식입니다. 원격 서버나 Colab에서도 같은 코드로 돌릴 수 있습니다.
Linux+NVIDIA GPU에서는 MUJOCO_GL=egl, GPU 없는 Linux에서는 osmesa를 지정합니다. 결과는 (높이, 너비, 3) 크기의 RGB 배열입니다.
ROS 2에서 하나의 프로그램 단위입니다. 카메라, 정책, 로봇 드라이버가 각각 노드가 됩니다.
카메라 노드가 이미지를 보내고, 정책 노드가 받아 관절 명령을 로봇 드라이버 노드로 보냅니다.
토픽에 데이터를 내보내는 쪽과 받아 쓰는 쪽입니다. 서로를 직접 알 필요 없이 토픽 이름만으로 연결됩니다.
웹캠 이미지를 발행하는 노드와 그것을 구독해 색 검출을 하는 노드를 만들어 보는 연습이 권장됩니다.
OpenAI의 API 방식 중 도구 호출과 이미지 같은 여러 입력을 다루도록 정리된 인터페이스입니다. 이 책의 9부 실습이 이것을 씁니다.
도구 실행 결과를 같은 호출 번호에 붙여 다시 보내는 왕복으로 루프를 돌립니다. 이미지는 base64 데이터 URL로 넣습니다.
여러 좌표계 사이의 변환 관계를 시스템 전체에서 관리하는 ROS의 기능입니다. 한 번 등록하면 어느 노드에서든 좌표를 바꿔 물어볼 수 있습니다.
카메라가 로봇 기준 어디 있는지 등록해 두면 '카메라 좌표의 이 점이 로봇 좌표로 어디인가'를 바로 얻습니다.
노드 사이에 데이터가 흐르는 이름 붙은 채널입니다. 보내는 쪽(Publisher)과 받는 쪽(Subscriber)이 같은 토픽 이름으로 연결됩니다.
카메라가 이미지를 publish하고 정책이 subscribe합니다. 빠른 제어는 토픽으로, 느린 판단은 Action으로 내려보냅니다.
설치할 모든 패키지의 정확한 버전(과 파일 해시)을 적어 두어, 누가 설치해도 같은 환경이 재현되게 하는 파일입니다.
LeRobot처럼 API가 자주 바뀌는 도구를 쓰기 때문에 버전을 고정합니다. 결과가 다르면 먼저 버전부터 비교해 보라고 권합니다.
윈도우 안에서 리눅스(Ubuntu)를 실행하게 해 주는 기능으로, NVIDIA 드라이버를 통해 GPU도 쓸 수 있습니다.
책은 윈도우 사용자에게 WSL2에 Ubuntu를 설치해 실습하도록 권합니다.
공간 속 위치를 숫자로 말하기 위해 정해 둔 기준점(원점)과 X·Y·Z 축의 약속입니다. 같은 물체도 어떤 좌표계에서 보느냐에 따라 숫자가 달라집니다.
이 책의 장면은 로봇 받침대를 원점으로, 팔을 뻗는 쪽을 +X, 로봇 왼쪽을 +Y, 위쪽을 +Z로 잡고 단위는 미터를 씁니다.
X축(Roll), Y축(Pitch), Z축(Yaw)을 중심으로 각각 얼마나 회전했는지로 자세를 적는 방식입니다.
비행기로 치면 날개 기울이기·기수 올리고 내리기·좌우로 방향 틀기이고, 로봇팔에서는 손목 비틀기·손목 위아래·팔 전체 회전에 해당합니다.
각도와 길이를 이어 주는 함수(cos, sin)입니다. 관절 각도로 손끝 위치를 계산하는 순기구학의 기초입니다.
길이 l인 링크가 θ만큼 돌면 끝점은 (l·cosθ, l·sinθ)이고, 관절이 둘이면 두 번째 링크 각도가 두 각의 합으로 누적됩니다.
크기와 방향을 함께 가진 양입니다. 위치, 속도, 손가락 방향, 관절각 묶음이 모두 벡터로 표현됩니다.
목표 위치에서 현재 위치를 빼면 가야 할 방향과 거리가 나오고, 벡터의 길이(norm)로 거리를 잽니다. 내적은 두 방향이 얼마나 비슷한지, 외적은 두 방향에 모두 수직인 축을 줍니다.
한 좌표계에서 표현된 점을 다른 좌표계의 숫자로 바꾸는 계산입니다. 회전행렬과 위치(이동) 벡터로 나타냅니다.
월드 좌표에서 받침대 위치를 빼고 받침대 회전행렬의 전치를 곱하면 로봇 기준 좌표가 됩니다. 카메라 좌표를 월드로 옮길 때도 같은 원리를 씁니다.
물체의 자세를 세 축(roll, pitch, yaw)으로 얼마나 돌렸는지 각도 세 개로 나타내는 방법입니다.
블록에 euler 값을 주어 기울어진 채 떨어뜨리면 구르며 자리 잡는 모습을 볼 수 있습니다.
세 축에 대한 회전 각도 세 개를 묶어 자세를 표현한 것입니다. 읽기는 쉽지만 회전 순서에 따라 결과가 달라지고, 같은 자세를 여러 값으로 쓸 수 있습니다.
그리퍼의 자세가 (178, -33, -177)도로 나왔는데, 이는 Pitch -147도와 사실상 같은 자세를 다르게 쓴 것입니다.
파라미터를 조금 바꿀 때 손실이 얼마나 변하는지(Gradient)를 구해, 손실이 줄어드는 방향으로 조금씩 옮기는 학습 방법입니다.
PPO, ACT, SmolVLA 모두 이렇게 학습되며, 계산은 PyTorch가 자동으로 해 줍니다. IK도 오차가 줄어드는 쪽으로 관절을 조금씩 옮긴다는 점에서 같은 생각입니다.
모델 예측이 정답과 얼마나 다른지 나타내는 값으로 학습은 이것을 줄이는 과정입니다. ACT의 손실은 행동 차이(L1)와 CVAE 정규화 항(KL)의 합입니다.
loss가 작아도 성공률이 높다는 뜻은 아니다. 5 mm만 어긋나도 블록을 못 집기 때문에 성공률은 따로 재야 합니다.
무작위 잡음을 만드는 출발값으로, 고정하면 같은 실행을 똑같이 재현할 수 있습니다. 확률적으로 행동을 만드는 모델을 비교할 때 반드시 통제해야 합니다.
문장만 바꾼 차이(22.8 cm)가 seed만 바꾼 차이(26.3 cm)보다 크지 않아, 언어의 효과라고 말할 수 없었습니다. seed만 바꿔도 성공률이 5~35%를 오갔습니다.
값의 범위가 제각각인 입력을 평균과 표준편차로 바꿔 0 근처의 비슷한 크기로 맞추는 처리입니다. 신경망은 이렇게 맞춘 입력에서 잘 학습됩니다.
공개 데이터셋 관절각은 도 단위로 -99~99, 우리 데이터는 라디안으로 -1.6~1.7이라 정규화가 꼭 필요합니다.
평균·표준편차, 무작위 표본, 기댓값처럼 불확실한 데이터를 다루는 수학입니다. 데이터 정규화, 무작위 배치, 성공률 평가에 쓰입니다.
관측과 행동 값에서 평균을 빼고 표준편차로 나누어 정규화하고, 강화학습은 평균적으로 보상이 큰 행동을 찾습니다.
숫자 네 개 (w, x, y, z)로 회전을 나타내는 방법입니다. 사람이 읽기는 어렵지만 순서 문제·짐벌 락이 없고 회전을 합치거나 부드럽게 잇기 쉽습니다.
돌리지 않은 상태는 (1,0,0,0), Z축 45도 회전은 약 (0.924, 0, 0, 0.383)입니다. MuJoCo는 (w,x,y,z), SciPy 등은 (x,y,z,w) 순서라 주의해야 합니다.
각도를 나타내는 단위로, 로봇 관절의 가동 범위와 명령은 라디안으로 표시됩니다.
1.92 rad은 약 110도라서 shoulder_pan은 좌우로 약 110도씩 돌 수 있습니다.
좌표계가 얼마나 돌아가 있는지를 3×3 행렬로 담은 것으로, 벡터에 곱하면 회전이 적용됩니다.
pixel_to_world 함수의 마지막 줄은 카메라 회전행렬 R과 위치 t로 카메라 좌표를 월드 좌표로 바꿉니다.
측정한 비율이 실제로 있을 법한 범위를 나타낸 것입니다. 표본이 적으면 넓어지고, 이 범위가 우연 수준을 포함하면 효과가 있다고 말하기 어렵습니다.
명령한 색과 일치한 비율 33%의 95% 신뢰구간이 23~46%라, 셋 중 하나를 아무렇게나 고른 경우와 구별되지 않았습니다.
자코비안으로 IK를 반복해서 풀 때 작은 감쇠 항을 더해 계산이 폭주하지 않게 하는 방법입니다. 감쇠가 크면 안정적이지만 느리고, 작으면 빠르지만 불안정합니다.
FK 계산 → 오차 측정 → 자코비안 계산 → 관절각 조금 갱신을 오차가 충분히 작아질 때까지 되풀이한다(예제는 λ=0.01).
특정 자세에서 두 회전축이 겹쳐 회전 자유도 하나를 잃어버리는 현상으로, 오일러 각 표현의 약점입니다.
이 문제 때문에 컴퓨터 내부에서는 오일러 각 대신 쿼터니언을 씁니다.
관절을 아주 조금 움직였을 때 손끝이 어느 방향으로 얼마나 움직이는지를 모아 놓은 행렬입니다. FK를 미분하면 얻어지며 현재 자세 근처에서만 맞는 근사입니다.
각 관절을 0.01 rad씩 움직여 손끝 변화를 재면 수치적으로 구할 수 있고, MuJoCo는 mj_jacSite 함수로 바로 계산해 줍니다.
데이터에 직접 보이지 않는 특성을 담도록 모델 안에 두는 숨은 변수입니다.
ACT의 z는 '이 시연이 어떤 스타일이었는가'를 담습니다.
시간을 아주 잘게 나누어 조금씩 계산을 쌓아 가며 운동을 근사하는 방법입니다. 그래서 시뮬레이션 결과는 정확한 공식값과 약간 다를 수 있습니다.
자유 낙하 공식으로 0.2초 뒤 높이는 0.8038m인데 시뮬레이션은 0.8058m를 내놓아 2mm 차이가 납니다.
찾는 용어가 없습니다.
용어의 갈래와 학습 순서는 「로봇 없이 시작하는 Physical AI 따라하기」(이창근, 위키독스, CC BY-NC-ND 4.0)를 길잡이로 삼았습니다. 정의와 예시는 엔스크린이 우리 말로 새로 썼으며, 원문은 각 용어의 「책에서 읽기」로 이어집니다. 코드와 실습은 책에서 직접 따라 해 보세요.