부록 부록
A.6 역할별 학습 로드맵
A.6.1 이 부록의 사용법
133개 장을 순서대로 읽는 것은 대부분의 독자에게 최선이 아니다. 역할과 당면 과제에 따라 필요한 부분이 다르고, 지금 필요 없는 것을 읽으면 남지 않는다.
이 부록은 역할별·상황별 경로를 제안한다. 각 경로는 "이것만은"(핵심) → "다음에"(확장) → "필요할 때"(참조) 로 구성된다.
정직: 이 로드맵은 제안이며, 자신의 상황에 맞게 조정해야 한다. 순서가 절대적이지 않고, 건너뛰어도 된다. 각 장의
-01절에 선수 지식이 적혀 있으므로 그것을 참고하라.
A.6.2 모든 역할의 공통 기반
어떤 역할이든 이것부터 시작한다.
| 장 | 왜 필수인가 |
|---|---|
| 0.1~0.3 | 전체 그림·환경 |
| 1.1 | 이름·네임스페이스·리매핑 — 모든 문제의 기초 |
| 1.4 | 데이터가 어떻게 흐르는가 |
| 1.6 | QoS — 실무 사고 1위 |
| 5.1·5.2 | 좌표 — 로봇의 언어 |
| 4.9 | 시스템을 기동하는 법 |
| 11.1 | 문제를 만났을 때의 지도 |
| A.4 | 모르는 약어가 나올 때 펼치는 용어집 |
견해: 1.6(QoS)과 5.1·5.2(좌표)를 초기에 읽는 것을 강하게 권한다. 이 둘이 초보자가 가장 오래 시행착오를 겪는 영역이고, 모르면 증상이 이해되지 않는다. "데이터가 안 온다"와 "위치가 이상하다"의 대부분이 여기서 나온다.
견해: 11.1을 일찍 읽는 것이 의외로 효율적이다. 아직 모르는 장을 참조하지만, "문제가 생기면 어디를 보는가"의 지도를 먼저 갖는 것이 학습 속도를 높인다. 전부 이해할 필요 없이 구조만 봐 두면 된다.
A.6.3 입문자 — ROS 2를 처음 쓴다
| 단계 | 장 | 목표 |
|---|---|---|
| 1 | 0.1~0.7 | 개념·설치·CLI |
| 2 | 0.6 | 첫 패키지 작성 |
| 3 | 1.1~1.4 | 노드·토픽·메시지 |
| 4 | 1.5·1.6 | QoS(디스커버리는 3.3) |
| 5 | 1.7·1.8·1.9 | 서비스·액션·파라미터 |
| 6 | 1.11 | 로깅 |
| 7 | 4.1~4.3·4.5 | 패키지·빌드 |
| 8 | 14.3 | launch |
| 9 | 5.1·5.2 | 좌표 |
| 10 | 11.4·A.1 | RViz2·CLI |
그다음 필요해질 때 펼칠 것:
| 상황 | 장 |
|---|---|
| Python으로 본격적으로 작성한다 | 2.8(rclpy 심층 — GIL·executor) |
| 두 언어를 오간다 · 예제를 C++↔Python으로 옮긴다 | 2.8.12(비대칭 열 축 — 로깅·인자 평가·예외·executor·타이머·메시지 비용·QoS·액션 피드백을 한자리에) |
| 의존성·매니페스트에서 막힌다 | 4.4(package.xml)·4.6(rosdep) |
| ROS 1 코드·장비와 섞어 쓴다 | 15.3(ros1_bridge) |
| 용어가 낯설다 | A.4(용어집·약어) |
견해: 0.6(첫 패키지)을 일찍 하라. 읽기만 하면 안 남는다. 작은 노드를 만들어 실행해 보면 이후의 개념이 이해될 자리가 생긴다.
견해: 2.2~2.6(실행 모델)은 처음에는 건너뛰어도 된다. 중요하지만 깊고, 콜백이 실행되지 않거나 느린 문제를 실제로 만난 뒤에 읽으면 훨씬 잘 이해된다.
A.6.4 제어·하드웨어 담당
| 우선 | 장 |
|---|---|
| 핵심 | 6.1·6.2·6.3·6.5·6.6 |
| 다음 | 6.4·6.7(드라이버)·6.8(micro-ROS)·6.9·12.1·12.2·12.3 |
| 확장 | 5.3~5.5(URDF)·5.7(모델 품질 검증)·4.8(arm64 크로스 컴파일)·10.4(시뮬)·12.4·12.5 |
| 참조 | 12.6·A.2 |
견해: 6.2(하드웨어 컴포넌트)가 이 역할의 중심이다. 이것 하나를 제대로 만들면 컨트롤러·MoveIt·Nav2가 전부 연결된다(15.4.4).
mock백엔드(6.2.8)로 시작하면 하드웨어 없이도 진행할 수 있다.
견해: 2.2~2.6(실행 모델)이 이 역할에는 필수다. 제어 주기가 깨지는 원인의 대부분이 실행기·콜백 그룹에 있다(2.3·2.4). 공통 기반 다음으로 읽을 것을 권한다.
A.6.5 인지·센서 담당
| 우선 | 장 |
|---|---|
| 핵심 | 7.1·7.2·7.3·7.4·7.7 |
| 다음 | 7.5·7.6·7.8·11.2·11.3 |
| 확장 | 10.3(센서 시뮬)·10.6(Sim2Real)·11.7 |
| 참조 | A.3(REP)·12.6 |
견해: 7.1(센서 규약)이 이 역할의 첫 장이어야 한다. 단위·프레임·범위 밖 표현 규약을 모르면, 드라이버가 어긴 것을 발견하지 못하고 이후 모든 것이 조용히 틀린다(7.1.8).
견해: 11.3.8(회귀 데이터셋)과 14.6.5(bag 회귀)를 일찍 읽으라. 인지 개발은 데이터셋 기반 반복 개선이 핵심 방법론인데, 이 인프라 없이 시작하면 나중에 만들기 어렵다.
견해: 7.7(시간 정합)이 과소평가된다. 여러 센서를 융합하는 순간 시각 문제가 지배적이 되며, 스탬프를 덮어쓰는 실수(7.7.4) 하나가 전체를 무너뜨린다.
A.6.6 항법 담당
| 우선 | 장 |
|---|---|
| 핵심 | 8.1·8.2·8.3·8.4·8.5 |
| 다음 | 8.6·8.7·8.8·7.6 |
| 확장 | 10.1~10.6(시뮬)·14.9(플릿) |
| 참조 | 5.1·5.2(좌표)·11.5(분석) |
Nav2의 서버는 전부 라이프사이클 노드다(8.1.4). "실행했는데 아무 반응이 없다"의 절반이 여기서 나오므로 1.12(라이프사이클 노드)를 함께 읽으라.
견해: 5.1·5.2를 확실히 이해하지 않고 Nav2를 시작하면 시행착오를 겪는다.
map·odom·base_link의 관계(5.1.7)를 모르면 측위 문제와 오도메트리 문제를 구분할 수 없다.
견해: 8.3(코스트맵)이 항법 문제의 최다 원인 지점이다. "왜 못 가는가"의 답이 대개 코스트맵 설정에 있다(8.3.8). 튜닝 전에 코스트맵을 시각화해 보는 습관(8.8)이 시간을 크게 아낀다.
견해: 8.7(안전)을 기능 개발과 함께 읽으라. 항법은 로봇을 움직이므로, 안전 고려가 나중이 되면 위험하다.
A.6.7 매니퓰레이션 담당
| 우선 | 장 |
|---|---|
| 핵심 | 9.1·9.2·9.3·9.4 |
| 다음 | 9.5·9.6·5.3~5.5(URDF)·6.3 |
| 확장 | 10.4(시뮬)·7.4(점군) |
| 참조 | 6.2(하드웨어)·12.6 |
견해: URDF·SRDF(5.3~5.5·9.1)가 매니퓰레이션의 기초 공사다. 모델이 부정확하면 계획도 제어도 맞지 않는다. 관성·충돌 형상·조인트 한계를 제대로 넣는 것이 먼저다(5.3.5).
견해: 9.6(정확도·캘리브레이션)을 초기에 읽으라. "계획은 되는데 실제로 안 맞는다"의 원인이 여기 있고, 캘리브레이션 없이 정밀 작업은 불가능하다(9.6.4).
A.6.8 시스템 아키텍트·리드
| 우선 | 장 |
|---|---|
| 핵심 | 2.1·14.1·14.2·12.4·14.7·14.10 |
| 다음 | 2.2~2.7·1.12(라이프사이클)·1.13(컴포지션)·12.5·14.8·14.9·13.1 |
| 확장 | 3.1~3.10(미들웨어)·2.9(스레드 안전성)·13.2·13.3(보안 구현)·15.1·15.2·15.3(ros1_bridge) |
| 참조 | 12.6(안티패턴)·11.1 |
견해: 14.1(경계 긋기)과 12.4(지연 예산)가 아키텍트의 두 축이다. 하나는 어디에 선을 긋는가, 다른 하나는 시간을 어떻게 배분하는가다. 이 둘이 시스템의 성질을 대부분 결정한다.
견해: 14.10(안전의 위치)를 프로젝트 초기에 읽으라. 안전 요구가 있다면 아키텍처가 그것을 전제로 설계되어야 하고, 나중에 붙이는 것은 어렵다(13.1.10과 같은 논리).
견해: 12.6(성능 안티패턴)을 팀 공유 자료로 쓰라. 리뷰에서 반복 지적하는 것들이 대부분 여기 있으므로, 목록을 공유하면 지적 자체가 줄어든다.
A.6.9 DevOps·플랫폼 담당
| 우선 | 장 |
|---|---|
| 핵심 | 4.5·4.7·4.10·14.8·4.6(rosdep) |
| 다음 | 14.7·14.9·13.4·15.1 |
| 확장 | 14.5·14.6(시험)·11.3(데이터)·4.4(package.xml)·4.8(arm64)·13.2(SROS 2 키스토어)·1.12(라이프사이클 — 부팅 순서) |
| 참조 | A.2·A.1 |
견해: 14.8(배포)과 13.4(운영 보안)이 이 역할의 중심이다. "전원을 켜면 기동되는가", "업데이트하고 되돌릴 수 있는가", "누가 접근할 수 있는가" — 이 셋이 운영의 핵심 질문이다.
견해: 4.10(CI)과 14.6(통합 시험)을 함께 읽으라. 로봇 CI는 일반 소프트웨어 CI와 다른 제약(하드웨어·시뮬·시간)이 있어서, 무엇을 어디서 실행할지 설계해야 한다.
A.6.13 ROS 2 위에 만드는 개발자 — 미들웨어·드라이버·프레임워크
BK-02가 말한 2차 독자 중 "ROS 2 위에 무언가를 만드는" 쪽이다. 남이 쓸 드라이버·RMW·확장을 구현하는 사람은 쓰는 사람과 읽는 순서가 다르다 — 계층의 경계와 계약을 먼저 봐야 한다.
| 우선 | 장 |
|---|---|
| 핵심 | 2.1(계층)·3.5(rmw API)·15.4(확장 포인트)·1.2·1.3(인터페이스·타입) |
| 다음 | 2.10(NodeOptions)·6.7(드라이버 원칙)·6.2(하드웨어 컴포넌트)·14.7(품질 수준) |
| 확장 | 3.1~3.4(DDS·RTPS·디스커버리)·2.2~2.7(실행 모델 내부)·15.5(기여) |
| 참조 | 14.5·14.6(테스트)·4.9(릴리스)·15.2(배포판 주기) |
견해: 3.5(rmw 계층)를 가장 먼저 읽으라. 무엇을 만들든 "내가 어느 계층에 위치하는가"가 첫 질문이고, 그 답이 API 형태·성능 한계·이식성을 전부 결정한다. RMW를 직접 만들지 않더라도 그 경계를 알아야 위쪽 계층의 제약이 왜 그런지 이해된다.
견해: 만드는 쪽에는 14.7(품질 수준·REP 2004)가 쓰는 쪽보다 훨씬 중요하다. 남이 의존할 패키지라면 문서·테스트·유지보수 약속이 곧 인터페이스의 일부다. 코드가 동작하는 것과 남이 믿고 쓸 수 있는 것은 다르다.
함정: 확장 포인트를 쓰기 전에 "이미 있는 것"을 찾으라.
pluginlib·ros2cli확장·rmw구현·컨트롤러 인터페이스처럼 이 책이 다룬 확장 지점만 여럿이다(15.4). 새 메커니즘을 만들기 전에 그중 하나로 되는지 보는 편이 대개 빠르다.
A.6.14 연구실·대학원생 — 연구 코드를 시스템으로 발전시킬 때
BK-02가 말한 "연구 코드를 시스템으로 발전시키는" 경로다. 알고리즘은 이미 동작하는데 로봇에 탑재하면 무너지는 상황이 전형이다 — 원인은 대개 알고리즘이 아니라 시간·경계·재현성에 있다.
| 우선 | 장 |
|---|---|
| 핵심 | 1.10(시간)·7.7(센서 동기)·11.3(기록 전략)·1.6(QoS 실전)·14.1(노드 경계) |
| 다음 | 2.4(콜백 그룹)·12.5(결정성)·11.2(rosbag2)·14.5(테스트) |
| 확장 | 11.6(트레이싱)·11.7(성능 측정)·14.7(품질 수준)·12.6(안티패턴) |
| 참조 | 7.1(센서 규약)·7.6(융합)·11.1(디버깅 플레이북) |
연구 코드는 대개 Python으로 시작한다 — 2.8(rclpy 심층)을 일찍 읽으면 "왜 느린가"·"왜 콜백이 실행되지 않는가"를 스스로 설명할 수 있다. C++ 예제를 Python으로 옮겨 쓸 때는 2.8.12(비대칭 열 축)를 옆에 펴 두라 — 논문 코드를 포팅하다 겪는 함정이 거기 모여 있다.
견해: 11.3(기록 전략)을 가장 먼저 읽으라. 연구에서 가장 비용이 큰 자산은 다시 만들 수 없는 데이터다. 실험을 bag으로 남겨 두면 알고리즘을 바꿔 가며 같은 입력으로 비교할 수 있고, 이것이 "논문 그림을 다시 그릴 수 있는가"를 가른다(11.2.13.3의 복구 수단도 함께 알아 두라).
견해: "시뮬에선 되는데 실기에선 안 된다"의 대부분은 시간 문제다. 스탬프를 언제 기록하는가(1.10.6), 여러 센서를 어떻게 맞추는가(7.7), 시뮬 시간을 쓰는가(1.10.3) — 알고리즘을 의심하기 전에 이 셋을 확인하라.
함정: 연구 코드는 대개 노드 하나에 전부 들어 있다. 그대로도 실행되지만 문제가 생겼을 때 어디가 느린지 알 수 없다. 14.1(경계 긋기)을 읽고 측정 지점이 생기도록 나누는 것이 첫 리팩터링이다 — 성능을 위해서가 아니라 관측을 위해서다.
견해: 품질 수준(14.7)은 졸업 후를 위한 것이 아니다. 연구실을 떠날 때 코드가 남에게 넘어가는지 버려지는지가 여기서 갈린다.
package.xml·README·테스트 하나만 있어도 다음 사람이 이어받을 수 있다.
A.6.10 상황별 진입점
지금 문제가 있어서 왔다면.
| 상황 | 시작점 |
|---|---|
| 데이터가 안 온다 | 11.1.4 → 1.5·1.6 |
| 위치가 이상하다 | 5.2.5 → 5.1·8.4 |
| 콜백이 실행되지 않는다 | 2.2~2.4 |
| 느리다·주기가 불규칙해진다 | 11.7 → 12.6 → 2.5 |
| 로봇이 안 움직인다 | 11.1.4 → 6.3·8.8 |
| 빌드가 안 된다 | 4.5 → 4.3 |
| 파라미터가 적용되지 않는다 | 1.9.7 → 14.3.8 |
| 시뮬은 되는데 실기가 안 된다 | 10.6 → 10.1.3 |
| 실험을 다시 실행할 수 없다 | 11.3 → 11.2.13 (기록·복구) |
| 남이 쓸 패키지를 만든다 | 14.7 → 15.4 → 15.5 |
| 항법이 실패한다 | 8.8.8 → 8.3.8 |
| 배포하면 기동되지 않는다 | 14.8.4 → 14.8.3 |
| 실시간이 필요하다 | 12.1 → 12.2·12.3 |
| 보안 요구가 생겼다 | 13.1 → 13.5 |
| 안전 인증 이야기가 나왔다 | 14.10 |
| 배포판을 옮겨야 한다 | 15.1 |
| 여러 대로 늘린다 | 14.9 |
A.6.11 학습 방법에 관한 견해
견해: 읽기와 실행을 번갈아 하라. 이 책은 실행 검증 없이 쓰였으므로(A.5.1), 독자가 실행해 보며 읽는 것이 이 책의 한계를 넘는 방법이다. 차이를 발견하면 그것이 여러분 환경의 진실이다.
견해: "함정 카탈로그"를 먼저 읽는 것도 좋은 전략이다. 각 장 뒤에서 두 번째 절에 있으며, 증상 중심으로 정리되어 있어 "이런 문제가 있구나"를 먼저 알면 본문이 잘 읽힌다.
견해: 모르는 것을 표시하며 읽으라.
(확인 필요)표기가 있는 곳은 여러분의 환경에서 확인해야 하는 지점이므로, 확인 결과를 적어 두면 팀의 문서가 된다.
견해: 한 번에 이해하려 하지 말라. 특히 실행 모델(2.2~2.6), QoS(1.6), 실시간(12.1~12.3)은 실제 문제를 만난 뒤에 다시 읽으면 훨씬 잘 이해된다. 처음에는 "이런 것이 있다"만 남겨도 충분하다.
견해: 가장 빠른 학습은 "고장 난 시스템을 고쳐 보는 것"이다. 잘 동작하는 튜토리얼보다, 문제가 있는 상태에서 원인을 좁혀 가는 경험이 훨씬 많이 남는다. 11.1의 절차를 따라 해 보는 것이 좋은 연습이다.
A.6.12 마치며
이 책은 0.1에서 "ROS 2가 무엇인가"로 시작해 133개 장을 지나왔다. 통신과 실행, 좌표와 하드웨어, 센서와 인지, 항법과 조작, 시뮬레이션과 도구, 실시간과 보안, 설계와 운영과 이행.
이 책이 반복한 것을 마지막으로 정리한다.
| 원칙 | 나타난 곳 |
|---|---|
| 규약을 지키라 | REP·단위·프레임·이름(7.1·5.1·1.1) |
| 경계를 명확히 하라 | 노드·인터페이스·안전과 기능(14.1·14.10) |
| 측정하고 판단하라 | 성능·지연·회귀(11.7·12.4) |
| 관측 가능하게 만들라 | 진단·로그·기록(6.9·1.11·11.3) |
| 단일 출처를 유지하라 | URDF·설정·모델(5.6·10.4·14.4) |
| 한계를 명시하라 | 검증 범위·수용 위험·안전(14.6·13.5·14.10) |
| 자동화하라 | 시험·배포·점검(4.10·14.8·13.4) |
| 평균이 아니라 꼬리를 보라 | 지연·지터·성공률(11.7·2.5) |
견해: 이 원칙들은 ROS 2에만 해당하지 않는다. 로봇 시스템을 만드는 일 전반에 적용되며, 도구가 바뀌어도 남는 부분이다. 이 책의 API·명령 서술은 낡겠지만(A.5.7), 이 원칙들은 오래 유효할 것이다.
정직: 이 책은 실행 검증 없이 쓰였고, 틀린 부분이 있을 수 있다(A.5.8). 여러분이 실제로 실행해 확인한 것이 이 책보다 정확하다. 이 책은 시작점이지 종착점이 아니다.
여러분의 로봇이 잘 동작하기를 바란다.