로봇을 CAD로 그린 다음 시뮬레이터에서 움직이려면 파일 형식을 여러 번 갈아타요. 그 사슬을 따라가 봤는데, 각 단계가 형식만 바꾸는 게 아니라 표현할 수 없는 정보를 버리고 있었어요.
시뮬레이터는 저마다 자기 형식을 써요
URDF는 로봇을 링크와 조인트의 트리로 적는 XML 형식이에요. 링크마다 시각용 메시, 충돌용 메시, 그리고 질량과 관성텐서가 붙어요. URDF는 ROS 표준이지 시뮬레이터 표준이 아니에요. 물리 엔진마다 필요한 정보가 달라서 각자 자기 형식을 갖고 있어요.
| 형식 | 시뮬레이터 | URDF에 없는 표현 |
|---|---|---|
| SDF | Gazebo | 조명·지형까지 포함한 장면 전체 |
| MJCF | MuJoCo | 힘줄 · 등식 구속(닫힌 사슬) · 액추에이터 동역학 · 센서 |
| USD | Isaac Sim | 재질 · 조명 · 렌더링 |
CAD에서 URDF를 뽑는 경로는 지금 두 갈래예요. 하나는 CAD 자체 기능이고(Onshape가 올해 3월 업데이트로 URDF 내보내기를 정식 메뉴에 넣었어요), 다른 하나는 변환 라이브러리예요. Rhoban의 onshape-to-robot은 URDF뿐 아니라 SDF와 MJCF까지 한 번에 뽑아줘서 시뮬레이터를 여러 개 쓸 계획이면 이쪽이 편해요. SolidWorks는 sw2urdf, Fusion 360은 fusion2urdf를 써요.
URDF가 아예 담지 못하는 것
형식 변환에서 빠지는 것들은 그래도 다시 적어 넣을 수 있어요. 그런데 URDF가 구조적으로 표현하지 못하는 정보가 하나 있어요. 변형이에요.
URDF에서 링크 하나는 강체 하나예요. 강체는 정의상 어떤 힘을 받아도 모양이 변하지 않아요. 실제 팔은 끝에 물건을 들면 휘고, 감속기도 토크를 받으면 비틀려요. 그 변형이 말단 위치 오차로 나타나요.
강체 동역학 시뮬레이터에서는 관절각을 명령대로 만들면 말단이 순기구학이 예측한 자리에 정확히 와요. 실물에서는 같은 관절각이라도 하중에 따라 말단이 다른 자리에 오는데도요.
버린 정보는 차이로 돌아와요
시뮬과 실물의 차이를 숫자 하나로 재면 원인을 알 수 없어요. 성분으로 갈라야 어디를 고칠지 정해져요.
| 오차 성분 | 뿌리 | 대응 |
|---|---|---|
| 반복정밀도 | 기체 자체 | 하드웨어 |
| 인지 오차 | 센서·판단 | 검출·추정 쪽 |
| 모델링 오차 | 강체 가정 등 버린 정보 | 시뮬 모델에 유연성을 넣거나 보정으로 흡수 |
어느 쪽이든 무엇이 몇 밀리미터를 만들고 있는지 먼저 알아야 시작돼요. 형식을 옮길 때 무엇을 버렸는지 아는 만큼만 시뮬 결과를 믿을 수 있다는 이야기이기도 해요.
트라이메시 충돌 모델과 스톨 판정 — 시뮬 파지가 실패하는 이유에서 충돌 모델이 파지를 좌우하는 걸 봤는데, 이 글은 그 모델이 어디서 만들어져 오는지의 앞단이에요. 정본이 실행 중에 어디로 흘러가는지는 joint_states와 robot_description, 그리고 서보 두 점 캘리브레이션에 적어뒀어요. 같은 URDF가 시뮬레이터로는 변환돼 들어가고, 실행 중인 ROS 시스템으로는 토픽을 타고 퍼져요.