hello, robot

로봇을 CAD로 그린 다음 시뮬레이터에서 움직이려면 파일 형식을 여러 번 갈아타요. 그 사슬을 따라가 봤는데, 각 단계가 형식만 바꾸는 게 아니라 표현할 수 없는 정보를 버리고 있었어요.

정본URDF (또는 Xacro) 파생SDF · MJCF · USD CAD 경로Onshape 내보내기 · onshape-to-robot 못 담는 것변형 — 링크가 강체라서

시뮬레이터는 저마다 자기 형식을 써요

URDF는 로봇을 링크와 조인트의 트리로 적는 XML 형식이에요. 링크마다 시각용 메시, 충돌용 메시, 그리고 질량과 관성텐서가 붙어요. URDF는 ROS 표준이지 시뮬레이터 표준이 아니에요. 물리 엔진마다 필요한 정보가 달라서 각자 자기 형식을 갖고 있어요.

변환 사슬과 사람이 채우는 자리
자동 변환은 대체로 8할쯤 해주고 나머지는 사람이 채워야 해요.
CAD재질 · 형상 · 구속URDF (정본)링크·조인트 트리 · 질량 · 관성내보내기SDFGazebo · 장면 전체 표현사람이 채울 것MJCFMuJoCo · 힘줄 · 등식 구속 · 센서사람이 채울 것USDIsaac Sim · 재질 · 조명 · 렌더링사람이 채울 것관성 재유도 · 접촉 · 액추에이터재질 · 센서 · 루트 명시되돌리는 표준 도구가 없어요 — MJCF 고유 표현은 사라져요자동 변환은 대체로 8할쯤 해주고 나머지는 사람이 채워요. 그래서 URDF를 정본으로 두고 파생시켜요.변환 결과물을 직접 고치면 정본이 둘이 되고, 다음에 다시 변환할 때 그 수정이 통째로 날아가요.닫힌 기구학 사슬은 URDF가 트리만 표현하니 아예 옮길 수가 없어요.
형식시뮬레이터URDF에 없는 표현
SDFGazebo조명·지형까지 포함한 장면 전체
MJCFMuJoCo힘줄 · 등식 구속(닫힌 사슬) · 액추에이터 동역학 · 센서
USDIsaac Sim재질 · 조명 · 렌더링

CAD에서 URDF를 뽑는 경로는 지금 두 갈래예요. 하나는 CAD 자체 기능이고(Onshape가 올해 3월 업데이트로 URDF 내보내기를 정식 메뉴에 넣었어요), 다른 하나는 변환 라이브러리예요. Rhoban의 onshape-to-robot은 URDF뿐 아니라 SDF와 MJCF까지 한 번에 뽑아줘서 시뮬레이터를 여러 개 쓸 계획이면 이쪽이 편해요. SolidWorks는 sw2urdf, Fusion 360은 fusion2urdf를 써요.

정본을 둘로 만들지 않기
변환된 결과물을 직접 고치기 시작하면 정본이 둘이 되고, 다음에 다시 변환할 때 그 수정이 통째로 날아가요. 정본 쪽은 URDF를 그대로 쓰기보다 매크로를 쓸 수 있는 Xacro로 두는 경우가 많아요. 바퀴 네 개처럼 반복되는 구조를 한 번만 적고 펼쳐 쓰는 방식이라, 손으로 고칠 자리 자체가 줄어들어요.

URDF가 아예 담지 못하는 것

형식 변환에서 빠지는 것들은 그래도 다시 적어 넣을 수 있어요. 그런데 URDF가 구조적으로 표현하지 못하는 정보가 하나 있어요. 변형이에요.

URDF에서 링크 하나는 강체 하나예요. 강체는 정의상 어떤 힘을 받아도 모양이 변하지 않아요. 실제 팔은 끝에 물건을 들면 휘고, 감속기도 토크를 받으면 비틀려요. 그 변형이 말단 위치 오차로 나타나요.

길이가 세제곱으로 들어가요
정밀도가 필요한 긴 팔에서 강체 가정이 위험해지는 이유가 이 세제곱이에요.
끝에 하중이 걸린 외팔보의 처짐은 길이의 세제곱에 비례해요길이 L처짐 ×1길이 2L처짐 ×8URDF에서 링크 하나는 강체예요.강체는 정의상 어떤 힘을 받아도모양이 변하지 않아요.그래서 강체 동역학 시뮬레이터는이 변형을 못 봐요.팔이 두 배 길어지면처짐은 여덟 배가 돼요.CAD에는 재질과 형상이 있어 응력을 계산할 수 있는데, URDF로 내보내는 순간 재질은 질량과 관성텐서 몇 개로 압축되고형상은 강체 메시로만 남아요. 응력을 계산할 근거가 사라지는 거예요.

강체 동역학 시뮬레이터에서는 관절각을 명령대로 만들면 말단이 순기구학이 예측한 자리에 정확히 와요. 실물에서는 같은 관절각이라도 하중에 따라 말단이 다른 자리에 오는데도요.

버린 정보는 차이로 돌아와요

시뮬과 실물의 차이를 숫자 하나로 재면 원인을 알 수 없어요. 성분으로 갈라야 어디를 고칠지 정해져요.

오차 성분뿌리대응
반복정밀도기체 자체하드웨어
인지 오차센서·판단검출·추정 쪽
모델링 오차강체 가정 등 버린 정보시뮬 모델에 유연성을 넣거나 보정으로 흡수

어느 쪽이든 무엇이 몇 밀리미터를 만들고 있는지 먼저 알아야 시작돼요. 형식을 옮길 때 무엇을 버렸는지 아는 만큼만 시뮬 결과를 믿을 수 있다는 이야기이기도 해요.

트라이메시 충돌 모델과 스톨 판정 — 시뮬 파지가 실패하는 이유에서 충돌 모델이 파지를 좌우하는 걸 봤는데, 이 글은 그 모델이 어디서 만들어져 오는지의 앞단이에요. 정본이 실행 중에 어디로 흘러가는지는 joint_states와 robot_description, 그리고 서보 두 점 캘리브레이션에 적어뒀어요. 같은 URDF가 시뮬레이터로는 변환돼 들어가고, 실행 중인 ROS 시스템으로는 토픽을 타고 퍼져요.