궤도형 로봇 시뮬레이션: 트랙을 지우고 가상 바퀴 12개를 다는 이유
시뮬레이션에서 궤도형 로봇이 지령 요레이트의 100%로 정확하게 회전한다면, 모델이 잘 만들어진 걸까요?
저희는 그 100%가 버그였다는 것을 실측으로 확인했습니다. 실제 궤도 차량은 회전할 때 트랙이 옆으로 갈리며(스크럽) 큰 손실을 냅니다. 완벽하게 도는 모델은 궤도 차량이 아니라 잘 만든 차동구동 로봇이었습니다.
이 글은 궤도형 스키드스티어 플랫폼(TR600, 80kg급)을 Isaac Sim에서 모델링하면서 시도한 네 가지 접근과, 각 접근을 채택하거나 버린 실측 근거를 공유합니다.
왜 시뮬레이션하는가
이 로봇의 자율주행 스택은 두 대의 머신에 나뉘어 있습니다. x86 워크스테이션의 Isaac Sim이 ROS 2 토픽을 발행하고, NVIDIA Jetson AGX Orin이 그 토픽을 구독해 cuVSLAM(카메라 기반 위치추정)과 Nav2(경로계획)를 돌립니다. 시뮬레이터의 역할은 Orin 쪽 스택을 하드웨어 없이 개발·테스트할 수 있게 하는 것입니다.
경계는 코드가 아니라 토픽 계약(topic contract) 입니다. 토픽 이름, 프레임, 메시지 타입, QoS가 실기와 동일하므로, Orin 쪽 스택은 상대가 시뮬레이터인지 실제 섀시 드라이버인지 구분할 수 없습니다.
이 관점이 서면 중요한 결론이 하나 나옵니다. 시뮬레이션이 충실해야 하는 것과 대충이어도 되는 것이 갈립니다.
| 충실해야 한다 | 근사해도 된다 |
|---|---|
| 카메라 영상 (위치추정의 유일한 입력) | 정밀한 접촉 역학 |
| 토픽 이름·프레임·타입·QoS | 모터 열특성 |
| 센서 타이밍과 노이즈 특성 | 배터리·전력 모델 |
| 차량의 거시적 운동과 오도메트리 오차 | 외관 |
물리 엔진에는 '트랙'이 없다
주류 물리 엔진 중 무한궤도를 네이티브로 시뮬레이션하는 것은 없습니다. 실제 트랙은 장력이 걸린 유연한 고무 벨트가 구동 스프로킷과 아이들러를 감고, 서스펜션이 달린 로드휠들이 벨트를 지면에 누르며, 그라우저가 지면을 방향에 따라 다르게 무는 구조입니다. PhysX, ODE, Bullet, DART 어디에도 이것을 표현하는 프리미티브가 없습니다.
따라서 모든 궤도 시뮬레이션은 근사이고, 엔지니어링 질문은 "어떤 근사가 내가 신경 쓰는 거동을 보존하는가"가 됩니다.
시작은 실물 측정: 스프로킷은 땅에 닿지 않는다
모델링에 앞서 제조사 CAD에서 트랙 바닥면을 측정했습니다(15mm 구간별 1퍼센타일 z — 이상 정점에 강건한 방법). 결과는 다음과 같습니다.
- 로드휠은 한쪽에 6개, 약 113mm 등간격. 스펙시트의 "독립 서스펜션 12세트"와 독립적으로 일치합니다.
- 접지면 길이는 600mm, 중심은 차량 기준 프레임에서 22mm 이내. 즉 실제 차량은 거의 자기 중심에서 제자리 회전합니다.
- 구동 스프로킷과 아이들러는 지면에서 68~154mm 떠 있습니다. 벨트를 구동하고 장력을 걸 뿐, 바닥에 닿지 않습니다.
이것이 이 프로젝트에서 가장 중요한 발견이었습니다. 첫 시뮬레이션 모델은 모든 견인력을 구동 스프로킷 위치에서 얻고 있었는데, 실물에서 그 부품은 지면에 닿지도 않는 부품이었기 때문입니다.
방법 1 — 기구학 이동: 로봇이 미끄러지듯 다닌다
cmd_vel을 받아 섀시 속도를 직접 지정하는 방식입니다. 접촉도 마찰도 바퀴도 없습니다.
- 장점: 사소한 구현, 빠르고, 완벽하게 예측 가능하며, 절대 끼이지 않습니다.
- 단점: 슬립도 스크럽도 지형 반응도 오도메트리 오차도 없습니다. 로봇이 얼음 위처럼 미끄러져 다닙니다.
- 용도: 월드 안에서 센서를 움직이는 것이 목적일 때 — 예를 들어 cuVSLAM 초기 브링업.
방법 2 — 멀티링크 트랙: 46개 링크의 유혹과 포기
벨트를 N개의 강체 링크 체인으로 잇는 방식입니다. 이렇게 만들어진 서드파티 에셋을 평가했습니다. 한쪽 트랙에만 강체 체인 링크 46개, 구동 스프로킷 1개, 캐리어 롤러 3개, 트랙 롤러 7개, 프런트 아이들러 1개가 들어 있었습니다.
포기했습니다. 확인된 사실 순서대로:
- 차량이 아니라 한쪽 트랙 하부구조였습니다 — 섀시도, 반대쪽 트랙도, 관절 루트도 없어
cmd_vel브리지를 붙일 수 없었습니다. - 비표준 솔버 설정을 요구했습니다: 120Hz 타임스텝, position iteration 30회, 인스턴스 프림 470개, PhysX Fabric + Scene Graph Instancing.
- Fabric을 켜자 계측이 조용히 깨졌습니다. 트랙이 눈에 보이게 움직이는데 USD 트랜스폼 읽기 값은 비트 단위로 동일했습니다.
- 관절 약 21개가 "disjointed body transforms"를 보고하며 Play 시점에 격렬하게 튀었습니다.
일반화하면: 한쪽당 46개 이상의 바디와 제약이 들어가는 연산 비용, 깨지기 쉬운 솔버, 그리고 내비게이션 개발에는 필요 없는 수준의 사실성입니다. Gazebo 메인테이너들이 멀티링크 트랙 지원을 거부한 것도 같은 이유였고, 상용 궤도형 UGV 벤더들이 공식 Gazebo 모델을 바퀴 기반으로 배포하는 것도 같은 맥락입니다. 가상 바퀴는 꼼수가 아니라 업계 표준입니다.
방법 3 — 가상 바퀴 4개: 완벽해 보이는 실패
트랙을 지우고, 트랙의 유효 반경(스프로킷 반경 + 트랙 두께)을 갖는 보이지 않는 충돌 바퀴 몇 개로 대체하는 방식입니다.
첫 모델은 구동 스프로킷 위치(차량 중심에서 342mm 뒤)에 구동·마찰 바퀴 2개, 앞쪽에 피치 지지용 무마찰 접점 2개를 뒀습니다.
실측 결과는 이렇습니다.
- 요레이트 캡처 99.5~102.8% — 지령대로 완벽하게 돕니다.
- 제자리 회전 반경 342.3mm, 예측치 342mm와 1mm 이내 일치, 양방향 동일.
숫자만 보면 승리 같지만, 이것이 바로 실패의 형태입니다. 마찰 접점이 한 스테이션뿐이면 횡력 평형에 의해 순간회전중심이 구동축 위로 가고, 두 접점 모두 갈리는(스크럽) 대신 구르기만 합니다. 어떤 마찰 값에서도 회전이 무손실이 됩니다. 실제 궤도 차량은 회전할 때 강하게 갈립니다. 이 모델은 얌전한 차동구동 로봇이 되어 버렸고, 자기 중심에서 342mm 떨어진 지점을 축으로 돌고 있었습니다.
방법 4 — 분산 가상 바퀴 12개 (현재 채택)
실물의 로드휠 스테이션 전부에 구동 접점을 부여합니다. 한쪽 6개, 총 12개 접점을 모두 벨트 속도로 구동하고, 스프로킷과 아이들러는 지면 충돌을 끕니다.
근거는 실물의 동작 방식 그대로입니다. 실제 트랙에서는 한쪽의 모든 접지점이 벨트 속도로 움직입니다. 접점 반경이 동일하면 한쪽당 동일한 속도 지령 하나로 표현되므로, 바퀴들끼리 싸울 일이 없습니다.
실측 비교:
| 4접점 | 12접점 | |
|---|---|---|
| 제자리 회전 축 위치 | 중심에서 342mm 뒤 | 중심 45~105mm 이내 |
| 제자리 회전 캡처 | ~100% | 29~32% |
| 직진 효율 | ~100% | 90~92% |
| 전진 + 회전 동시 | ~100% | ~0% |
회전축이 차량 중심으로 오고 요레이트 캡처가 30% 수준으로 떨어진 것은 모두 의도된 결과입니다. 그것이 실제 스키드스티어의 스크럽 손실입니다. 왜 마찰을 아무리 조정해도 이 숫자가 변하지 않는지는 다음 글에서 수식으로 유도합니다.
반면 전진하면서 도는 동작이 ~0%로 붕괴하는 것은 의도가 아니며, 현재 미해결 문제입니다. 강체 쿨롱 접촉이 고무의 점진적 슬립 특성을 표현하지 못해 경계가 급격해진다는 가설을 갖고 있지만, 아직 측정으로 확인된 사실은 아닙니다.
오도메트리는 일부러 틀리게 만든다
센서 쪽에서 가장 중요한 결정 하나를 공유합니다. 휠 오도메트리를 시뮬레이터의 ground truth에서 가져오지 않습니다. 별도의 ROS 2 노드가 실물 MCU와 동일한 방식으로 바퀴 관절 속도에서 오도메트리를 계산합니다. 실기의 인코더는 구동 모터에만 2개 있어 트랙이 미끄러져도 그 사실을 모르는데, 시뮬레이션도 똑같이 슬립에 눈이 먼 오도메트리를 재현합니다. Ground truth 포즈는 검증 전용 토픽으로만 발행하고, Nav2와 EKF는 절대 소비하지 않습니다.
완벽한 오도메트리를 주는 시뮬레이터는, 그 오도메트리 오차를 다루라고 존재하는 위치추정 스택을 시험할 수 없기 때문입니다.
12접점 모델의 한계 (정직하게)
- 실물 로드휠은 독립 서스펜션인데 모델은 강체입니다. 강체 섀시에 동일 평면 강체 접점 12개는 과잉구속이라, 하중 분배를 물리가 아니라 솔버가 고릅니다. 실측한 초과분은 이상적 스크럽 모멘트의 1.27배(이론적 최악은 2배)로, 접촉 모델은 건전하지만 근사임은 분명합니다.
- 쿨롱 마찰은 stick-slide 두 상태뿐이라, 고무가 슬립에 비례해 횡력을 쌓는 점진적 특성이 없습니다.
- 벨트 장력·유연성이 없으므로 트랙 이탈이나 지형 순응은 표현하지 못합니다.
정리
| 방법 | 비용 | 슬립/스크럽 | 지형 | 평가 |
|---|---|---|---|---|
| 기구학 이동 | 극소 | 없음 | 없음 | 센서 운반용 |
| 멀티링크 트랙 | 매우 큼 | 완전 | 완전 | 깨지기 쉬움, 업계에서도 기각 |
| 가상 바퀴 ×4 | 낮음 | 비현실적으로 낮음 | 됨 | 회전축 오류, 스크럽 없음 |
| 가상 바퀴 ×12 | 중간 | 현실적 크기 | 됨 | 현재 채택 |
두 가지를 남기고 싶습니다.
시뮬레이션 충실도의 기준은 "진짜 같아 보이는가"가 아니라 "테스트 대상이 실기에서 겪을 오차를 재현하는가"입니다. 그래서 오도메트리는 일부러 틀리게 만들고, 요레이트는 30%만 나오는 것이 정답입니다.
너무 깨끗한 결과는 축하할 일이 아니라 의심할 일입니다. 4접점 모델의 100% 요 캡처는 3주짜리 우회로의 입구였습니다.