제10부 시뮬레이션
10.1 시뮬레이션 전략 — 무엇을 검증하는가
10.1.1 이 장에서 배우는 것 / 선수 지식
시뮬레이션은 로봇 개발에서 당연한 도구처럼 이야기되지만, 실무에서 가장 자주 잘못 쓰이는 도구이기도 하다. 두 가지 반대 방향의 오용이 있다.
과신 — "시뮬에서 되니까 실기에서도 될 것이다." 그리고 실기에서 처음 문제를 만난다.
과투자 — 사실적인 시뮬을 만드는 데 몇 달을 쓰고, 정작 그것으로 답할 수 있는 질문이 적다는 것을 뒤늦게 안다.
이 장은 그 사이의 균형을 다룬다. 무엇을 검증하려는가에서 출발해 필요한 충실도를 정하고, 시뮬을 개발 흐름의 어디에 놓을지 결정한다.
배우는 것:
- 시뮬이 주는 것 — 안전·속도·반복·비용.
- 검증 가능과 불가능 — 경계를 명확히.
- 충실도 단계 — 기구학부터 사실적 렌더링까지.
- 목적별 충실도 선택 — 얼마나 정교해야 하는가.
- 개발 흐름에서의 위치 — 언제 쓰는가.
- 회귀 시험 — CI에서의 시뮬.
- 무엇을 모델링할 것인가 — 결정 기준.
선수 지식: 8.8.7(Nav2 시뮬 평가), 5.6(SDF·URDF), 5.7(모델 검증), 6.2.8(mock 하드웨어), 4.10(CI).
정직: 이 장은 전략과 판단을 다루며 특정 시뮬레이터에 종속되지 않는다. 구체 도구는 10.2(Gazebo)·10.5(대안)에서 다룬다. 시뮬 성능·정확도 수치는 하드웨어·모델 의존이므로 제시하지 않는다(3.6.1 방침). 이 환경에서 검증하지 않았다(목차 3).(→ 198차 확인: 10.1.7의 "시뮬 테스트는 불안정하기 쉽다" 주장을 TurtleBot3+Gazebo+Nav2로 실제로 재현했다 — 동일 명령을 반복 실행해 부트업 자체가 실패하는 사례(RViz2 크래시로 인한 연쇄 실패)와, 부트업이 성공한 뒤에도 내비게이션 결과가 갈리는 사례(5회 중 1회만 성공)를 둘 다 실측했다. 아래 실행 확인(198차) 참고.)
10.1.2 시뮬이 주는 것
| 이득 | 설명 |
|---|---|
| 안전 | 충돌해도 아무도 안 다치고 아무것도 안 부서진다 |
| 속도 | 하드웨어 준비·이동·재설정 없이 즉시 |
| 반복성 | 똑같은 조건을 100번 — 실기로는 불가능 |
| 비용 | 하드웨어 없이 개발·여러 대 동시 |
| 병렬성 | 여러 시나리오를 동시에 |
| 관측성 | 모든 상태를 볼 수 있다(실기에서는 센서만) |
| 극한 조건 | 위험한 상황을 안전하게 |
| CI 통합 | 자동 회귀 시험(4.10) |
견해: "반복성"이 시뮬의 가장 큰 가치다(8.8.7의 반복). 같은 시나리오를 100번 실행해 성공률을 측정하는 것은 실기로는 며칠이 걸리고, 조건을 동일하게 유지하기도 어렵다. 통계적 비교가 필요한 모든 작업에서 시뮬이 대체 불가능하다.
견해: "모든 상태를 볼 수 있다"도 과소평가된다. 실기에서는 로봇의 실제 위치를 모르지만(그래서 측위를 하는 것이다 — 8.3), 시뮬에서는 안다. 추정 알고리즘의 오차를 직접 측정할 수 있으며, 이것은 실기에서 매우 어렵다.
10.1.3 검증 가능과 불가능
이 표가 이 장의 핵심이다.
| 검증 가능 | 검증 불가능·불충분 |
|---|---|
| 소프트웨어 로직·상태 전이 | 실제 센서 노이즈 특성 |
| 인터페이스·배선(토픽·액션) | 바닥 마찰·미끄러짐 |
| 알고리즘의 기본 동작 | 실제 조명·반사·재질 |
| 기하학적 도달성·충돌 | 기계적 유격·마모 |
| 회귀(기능이 깨졌나) | 통신·무선 문제(3.9) |
| 경로·계획 품질 | 실시간 타이밍·지터(6.6) |
| 실패·복구 흐름 | 하드웨어 고장 양상 |
| 대략적 성능 경향 | 절대 성능 수치 |
| 대량 반복 통계 | 사람의 실제 행동 |
| 극한 시나리오 | 전기 노이즈·EMI |
핵심 구분: "논리"는 검증되고 "물리"는 근사된다.
견해: 시뮬은 "무엇을 하는가"를 검증하고 "얼마나 잘하는가"는 근사한다. 로봇이 목표에 도달하는 로직이 맞는지는 확실히 알 수 있지만, 실제로 3.2초가 걸릴지 4.1초가 걸릴지는 모른다. 이 구분을 명확히 하면 시뮬 결과를 어디까지 믿을지 정해진다.
특히 위험한 오해:
| 오해 | 현실 |
|---|---|
| "시뮬에서 안 부딪혔으니 안전" | 센서 모델·물리가 근사 |
| "시뮬 성공률 95%니 실기도" | 조건이 다르다 |
| "시뮬에서 튜닝한 게인이 최적" | 동역학이 다르다(10.6.2) |
| "시뮬이 되니 하드웨어만 연결하면 됨" | 통합에서 대부분의 문제 발생 |
10.1.4 충실도 단계
시뮬은 하나가 아니다. 목적에 따라 필요한 정교함이 다르다.
| 단계 | 모델링 | 답할 수 있는 질문 | 비용 |
|---|---|---|---|
| ① 기구학 | 관절·형상만 | 도달 가능한가·충돌하는가 | 매우 낮음 |
| ② 동역학 | 질량·관성·마찰 | 넘어지는가·힘이 충분한가 | 중간 |
| ③ 센서 모델 | 라이다·카메라·노이즈 | 인지가 동작하는가 | 중간~높음 |
| ④ 렌더링 | 조명·재질·텍스처 | 비전 알고리즘이 되는가 | 높음 |
| ⑤ HIL | 실제 하드웨어 일부 | 타이밍·통신이 되는가 | 높음 |
단계별 도구:
| 단계 | 예 |
|---|---|
| ① | joint_state_publisher_gui + RViz2(5.5.7), mock 하드웨어(6.2.8) |
| ② | Gazebo·MuJoCo(10.2·10.5) |
| ③ | Gazebo 센서 플러그인(10.3) |
| ④ | Isaac Sim·Unity 계열(10.5) |
| ⑤ | 실제 컨트롤러 + 시뮬 로봇(10.5) |
견해: ①단계가 과소평가된다. RViz2에서 URDF를 표시하고 관절을 움직여 보는 것만으로 도달성·충돌·프레임 문제의 상당수가 검출된다(5.7.7). 물리 시뮬을 켜기 전에 이것부터 하는 것이 빠르고 확실하다.
견해: ④단계는 비용이 매우 높고, 필요한 경우가 제한적이다. 비전 알고리즘을 시뮬 데이터로 학습·검증하려는 것이 아니라면 대개 불필요하다. "예쁜 시뮬"에 시간을 쓰는 것이 대표적 과투자다.
10.1.5 목적별 충실도 선택
"무엇을 검증하려는가"에서 역산한다.
| 검증 목적 | 필요 충실도 | 이유 |
|---|---|---|
| launch·배선이 맞나 | ① | 로직만 |
| 도달성·작업 공간(9.6.3) | ① | 기하만 |
| MoveIt 설정·계획(9.1.9) | ① 또는 ② | 충돌·계획 |
| 항법 로직·복구(8.6) | ② | 이동·장애물 |
| 제어 게인 튜닝 | ②(정확한 동역학) | 관성·마찰 |
| SLAM·측위 알고리즘 | ③ | 센서 필요 |
| 코스트맵·회피 | ③ | 센서 필요 |
| 비전 인식 | ④ | 외관 필요 |
| 실시간·통신 | ⑤ 또는 실기 | 시뮬로 부정확 |
견해: 필요한 최소 충실도를 쓰라. 높은 충실도는 느리고(RTF 저하 — 10.2.8), 만들기 어렵고, 유지보수 부담이 크다. "기구학으로 답할 수 있는 질문을 동역학 시뮬로 답하는 것"은 낭비다.
견해: 여러 충실도를 병행하는 것이 실용적이다. CI에는 ①·② 수준의 빠른 시뮬을, 주간 검증에는 ③을, 특정 연구에만 ④를 쓴다. 하나의 시뮬로 모든 것을 하려 하면 어느 쪽에도 최적이 아니다.
10.1.6 개발 흐름에서의 위치
각 시점의 역할:
| 시점 | 시뮬의 역할 |
|---|---|
| 설계 | 배치·도달성 검토(9.6.3) — 하드웨어 구매 전 |
| 구현 | mock으로 로직 개발(6.2.8) |
| 통합 | 전체 스택 동작 확인 |
| 회귀 | CI에서 자동 시험(10.1.7) |
| 문제 재현 | 실기 문제를 시뮬에서 재현 시도 |
| 훈련·데모 | 하드웨어 없이 |
견해: "설계 단계의 시뮬"이 가장 비용이 낮고 효과가 크다. 로봇을 사고 설치한 뒤 도달성 문제를 발견하면 비용이 크지만, URDF와 작업점 좌표만으로 미리 확인하면 몇 시간이면 된다(9.6.3).
견해: "문제 재현"은 기대만큼 잘 되지 않는다. 실기 문제의 원인이 대개 시뮬이 모델링하지 않는 것(마찰·노이즈·타이밍)이기 때문이다. 재현되면 좋지만, 안 된다고 시뮬을 정교하게 만드는 데 시간을 쓰기보다 실기에서 계측하는 편이 빠른 경우가 많다.
10.1.7 회귀 시험
시뮬의 가장 지속적인 가치는 CI에서 나온다(4.10.5).
| 시험 층 | 빈도 | 내용 |
|---|---|---|
| mock 기반 | 매 커밋 | 로직·인터페이스(6.2.8) |
| 경량 물리 | PR·머지 | 기본 동작 |
| 전체 시나리오 | 야간 | 성공률·지표 |
시나리오 정의:
# 개념: 시나리오 명세
scenarios:
- name: "복도 주행"
world: worlds/corridor.sdf
start: {x: 0, y: 0, yaw: 0}
goals: [{x: 10, y: 0}, {x: 10, y: 5}]
timeout: 60
success_criteria:
goal_reached: true
max_recoveries: 3
- name: "장애물 회피"
world: worlds/obstacles.sdf
# ...
함정: 시뮬 테스트는 불안정하기 쉽다(4.10.5). 물리 엔진의 미세한 차이, 타이밍, 난수가 결과를 바꾼다. 통과 기준을 통계적으로 설정하고(예: 10회 중 8회 성공), 단일 실행으로 판정하지 않는 것이 좋다.
실행 확인(198차) — 이 함정을 TurtleBot3+Gazebo+Nav2(
tb3_simulation_launch.py)로 실제로 재현했다, 그것도 두 층위에서. ① 부트업 자체가 무너지는 사례. 소스(tb3_simulation_launch.py)를 직접 읽어보니headless:=True는 Gazebo GUI(gzclient)만 끄고, RViz2는 완전히 별도의use_rviz인자(기본값True)로 제어돼headless와 무관하게 항상 뜨려 한다. 디스플레이 없는 컨테이너에서headless:=True만 주고 4회 연속 실행하니 4/4 모두 RViz2가 크래시(SIGABRT)했고, 그 직후 매번nav2_container가RCLError(맥락이 조금씩 다른 문구)로 종료돼 60초 안에 부트업을 못 마쳤다.use_rviz:=False를 추가하자 5/5 모두 8~11초 만에 깔끔히 성공 — 명확한 A/B 대조로 원인을 좁혔다. ② 부트업이 안정된 뒤에도 결과가 갈리는 사례.use_rviz:=False로 고정한 뒤 동일한 시작 포즈(-2.0,-0.5)·목표(0.0,0.5)로 5회 반복하니 1회만SUCCEEDED(13.2초, 무복구), 나머지 4회는 전부ABORTED(1회는 1.6초 만에, 나머지는 즉시) — 로그를 보니 실패한 경우마다amcl이"Failed to transform initial pose in time"을 반복해, 5 Hz 반복 발행한/initialpose의 타이밍이 tf 버퍼 성장과 경쟁하는 것으로 보인다. 정직한 교란 변수: 실패한 두 트라이얼(10건·15건)에는 성공한 트라이얼(0건)에 없던 FastRTPS 공유메모리 포트 에러가 있었다 — 같은 컨테이너를 짧은 간격으로 재기동해 DDS 포트가 완전히 반납되기 전에 다음 시도가 시작됐을 가능성이 있다. 그래서 이번에 관측한 "5회 중 1회 성공"이라는 수치 자체는 일반화하지 않는다 — Nav2+Gazebo의 본질적 신뢰도가 아니라 이 시험 하네스(짧은 재기동 간격)가 만든 교란이 섞여 있을 수 있기 때문이다. 이것이 바로 이 절의 "통과 기준을 통계적으로 설정하라"는 조언, 그리고 단일 실행으로 판정하지 말라는 조언이 필요한 이유를 스스로 증명한 셈이다 — 트라이얼 하나만 봤다면 정반대의 결론을 냈을 것이다. 원본:tools/gap_harness/gap197/sim_flakiness/(run_trial.sh,logs/trial_logs/,findings_summary.txt).
함정: 시뮬 CI가 느리면 아무도 안 본다. 야간 빌드가 4시간 걸리면 결과를 보기까지 하루가 지난다. 시나리오를 병렬화하거나 개수를 줄여 결과가 아침에 나오게 하라.
견해: 회귀 시험의 목적은 "성능 측정"이 아니라 "깨진 것 감지"다. 시뮬 성공률이 실기와 다르다는 것은 이미 안다(10.1.3). 어제 90%였는데 오늘 40%면 무언가 깨진 것이며, 그것을 검출하는 것이 가치다.
10.1.8 무엇을 모델링할 것인가
모든 것을 모델링할 수는 없다. 무엇을 넣고 무엇을 뺄 것인가.
| 판단 | 기준 |
|---|---|
| 검증 대상에 영향을 주나 | 아니면 뺀다 |
| 모델링 비용 | 시간·성능 |
| 불확실성 | 실제 값을 모르면 모델이 무의미 |
| 유지보수 | 실물이 바뀌면 함께 바꿔야 |
흔한 판단:
| 대상 | 대개의 판단 |
|---|---|
| 로봇 기구·질량 | 필수(5.3.5) |
| 주요 장애물·벽 | 필수 |
| 바닥 마찰 | 필요하나 값을 모름 → 근사 |
| 세부 가구·장식 | 대개 불필요 |
| 사람 | 시나리오에 따라 |
| 케이블·호스 | 대개 불필요(모델링 어려움) |
| 조명 | ④단계에서만 |
| 센서 노이즈 | ③단계에서 필수(10.3.4) |
견해: "실제 값을 모르는 것을 정교하게 모델링하는 것"이 흔한 낭비다. 바닥 마찰 계수를 소수점 셋째 자리까지 넣어도 실제 값을 모르면 의미가 없다. 모르는 파라미터는 대략적 값으로 두고, 그것이 결과에 미치는 영향을 민감도로 확인하는 편이 낫다(10.6.4).
견해: 시뮬 월드를 단순하게 유지하라. 복잡한 월드는 느리고(RTF — 10.2.8), 만들기 어렵고, 실제 환경과 다르면 어차피 소용없다. 검증에 필요한 구조만 넣는다.
10.1.9 흔한 오용
| 오용 | 증상 | 대처 |
|---|---|---|
| 과신 | "시뮬에서 됐는데 실기에서 안 된다" | 검증 경계 인식(10.1.3) |
| 과투자 | 몇 달째 시뮬 만들기 | 목적에서 역산(10.1.5) |
| 충실도 오판 | 낮아서 무의미·높아서 느림 | 단계 선택 |
| 실기 회피 | 시뮬만으로 개발 | 조기·정기 실기 검증 |
| 시뮬 전용 코드 | 실기에서 다른 경로 | 단일 출처(5.6.5) |
| 결과 오독 | 절대 수치를 믿음 | 경향만 신뢰 |
| 유지보수 방치 | 실물과 시뮬이 달라짐 | 동기화 절차 |
견해: "실기 회피"가 가장 위험한 오용이다. 시뮬이 편해서 실기 검증을 미루면, 통합 문제가 뒤로 몰려 프로젝트 후반에 드러난다. 초기에 그리고 정기적으로 실기에서 확인하는 것이 리스크를 앞으로 당긴다.
견해: 시뮬과 실물의 동기화가 유지보수 부담이다. 로봇에 센서를 추가하거나 그리퍼를 바꾸면 시뮬도 바꿔야 한다. 단일 xacro로 시뮬·실기를 분기하면(5.6.6) 이 부담이 크게 준다 — 제5부의 단일 출처 원칙이 여기서 값을 한다.
10.1.10 전략 수립 절차
1단계가 핵심이다. 검증하려는 질문을 구체적으로 적는다.
- 로봇이 좁은 통로를 통과할 수 있는가? (① 기구학)
- 코스트맵 설정이 장애물을 제대로 인식하는가? (③ 센서)
- 복구 동작이 갇힘 상황에서 작동하는가? (② 동역학)
- 팔이 모든 작업점에 도달하는가? (① 기구학)
- Nav2 파라미터 변경이 성공률을 떨어뜨렸는가? (② + 반복)
견해: 질문 목록이 없으면 시뮬이 "단순히 로봇이 움직이는 것"이 된다. 무엇을 확인하려는지 모르면 결과를 어떻게 해석할지도 모르고, 어디까지 정교하게 만들지도 정할 수 없다. 7.8.2의 예산표, 6.6.8의 요구 정의와 같은 논리 — 목적을 먼저 적는다.
7단계 비교 검증이 신뢰의 근거다(10.6). 시뮬과 실기에서 같은 시험을 수행하고 결과를 비교해, 어느 지표가 얼마나 일치하는지 안다. 그래야 "이 시뮬은 이 질문에 대해 믿을 만하다"고 말할 수 있다.
10.1.11 함정 카탈로그
| # | 함정 | 증상 | 대처 |
|---|---|---|---|
| 1 | 검증 질문 없이 시작 | 결과 해석 불가 | 목록부터(10.1.10) |
| 2 | 과도한 충실도 | 느림·유지보수 부담 | 최소 충실도 |
| 3 | 부족한 충실도 | 답할 수 없는 질문 | 목적별 선택 |
| 4 | 시뮬 결과를 절대 수치로 | 실기와 불일치 | 경향만 신뢰 |
| 5 | 실기 검증 회피 | 후반 통합 문제 | 조기·정기 실기 |
| 6 | 시뮬 전용 코드 경로 | 실기에서 다름 | 단일 xacro(5.6.6) |
| 7 | 모르는 값을 정교하게 | 무의미한 노력 | 근사 + 민감도 |
| 8 | 복잡한 월드 | RTF 저하 | 필요한 구조만 |
| 9 | 시뮬 CI가 느림 | 아무도 안 봄 | 병렬화·축소 |
| 10 | 불안정 테스트 방치 | CI 신뢰 붕괴 | 통계적 기준(4.10.5) |
| 11 | 시뮬·실물 미동기화 | 검증이 무의미해짐 | 동기화 절차 |
| 12 | "예쁜 시뮬"에 투자 | 검증 가치 없음 | ④는 정말 필요할 때만 |
10.1.12 체크포인트
- 시뮬이 주는 이득 여덟 가지를 말할 수 있는가. 가장 큰 가치 둘은 무엇이며 왜인가.
- 검증 가능한 것과 불가능한 것을 각각 다섯 가지 들 수 있는가. "논리와 물리"의 구분은 무엇을 의미하는가.
- 특히 위험한 오해 네 가지를 말할 수 있는가.
- 충실도 다섯 단계와 각각이 답할 수 있는 질문을 말할 수 있는가. ①단계가 과소평가되는 이유는?
- 목적별 충실도 선택 흐름을 그릴 수 있는가. "필요한 최소 충실도"를 쓰라는 조언의 근거는?
- 개발 흐름에서 시뮬의 여섯 가지 역할과, 가장 비용이 낮고 효과 큰 시점은?
- "문제 재현"이 기대만큼 잘 안 되는 이유는?
- 회귀 시험의 세 층과 각각의 빈도는? 시뮬 CI의 목적이 "성능 측정"이 아닌 이유는?
- 모델링 범위를 정하는 기준 네 가지와, "모르는 값을 정교하게"가 낭비인 이유는?
- 흔한 오용 일곱 가지 중 가장 위험한 것은 무엇이며 왜인가.
- 전략 수립 절차 여덟 단계에서 1단계와 7단계가 왜 중요한가.
다음 장 10.2은 ROS 2 생태계의 표준 시뮬레이터 — Gazebo Harmonic과 ros_gz를 다룬다. 세대 구분, 브리지 설정, 성능.