파일을 실행 책임에 연결해서 읽는다
로봇 예제를 이해하려면 파일을 위에서 아래로 읽는 것만으로 부족하다. 어떤 파일이 모델을 정의하고, 어떤 프로그램이 읽으며, 어느 이름/단위의 메시지가 어디로 이동하는지 그려야 한다. 패키지는 의존성/설치·실행 자산을 묶는 단위이고 폴더 이름 하나가 실제 동작을 보장하지 않는다. package.xml, CMakeLists.txt 또는 해당 build 방식의 설치 규칙과 launch/config의 관계를 확인한다.
Gazebo 공식 project template guide는 description, Gazebo 전용 코드, ROS application과 bringup의 역할을 나눈다. 공식 template의 정확한 패키지 이름/버전과 이 단위의 가상 이름은 다르다. template를 읽는 원칙을 적용할 뿐 현재 저장소를 복제/빌드하거나 실행했다고 쓰지 않는다. Jazzy/Harmonic 조합과 선택한 template revision·의존성을 별도로 고정한다.
가상 예의 mobile_description은 모델/메시·재질을, mobile_sim은 월드와 Gazebo system 구성을, mobile_bringup은 시작 절차/bridge·공통 인수를, mobile_navigation은 주행 application의 map/위치·계획/제어 설정을 가진다. 반드시 네 패키지로 나눠야 한다는 규칙은 아니다. 실제 패키지 구조와 책임을 명확히 설명하는 것이 목적이다.
description과 world·시작 절차를 구별한다
description에는 링크/관절과 visual/collision/inertial·센서 장착이 들어간다. world에는 중력/물리 step, 바닥/환경·모델 배치와 필요한 system이 들어간다. bringup은 필요한 실행과 인수/설정 경로를 연결한다. 파일에 써 있다는 것, 설치/검색할 수 있다는 것, 해당 실행이 실제로 읽었다는 것을 다른 관문으로 본다.
예를 들어 worlds/demo.sdf라는 파일 안에 <world name="lab">가 있어도 모순은 아니다. 파일명과 런타임 world 이름은 다른 식별자다. Transport clock/control의 world 경로를 파일명 demo로 추정하면 틀릴 수 있다. model 파일/생성 요청과 실제 entity 이름도 구분하고 rename/중복·reset의 세대와 연결한다.
joint 참조도 문자열의 정확한 대응이 필요하다. 모델이 wheel_left_joint를 정의했는데 DiffDrive의 left_joint가 left_wheel_joint를 가리키면 같은 의미처럼 보여도 실제 식별자가 다르다. system 로드/모델 연결·자산/축과 실제 상태를 확인한다. 단순 검색/문자열 검사 통과는 물리·제어 성능 검증과 별도다.
source의 파일과 실행이 찾는 설치 자산을 대조한다
source는 개발 원본이고 install은 build/설치 절차가 만든 실행/검색 대상이다. 원본 메시 파일이 있어도 설치 대상/검색 경로에서 빠지면 다른 위치에서 실행할 때 찾지 못할 수 있다. Jazzy ament_cmake 공식 문서의 패키지 등록/설치와 실제 자산 규칙을 확인한다. build가 성공했다고 필요한 비코드 자산이 전부 설치되었다고 결론내리지 않는다.
Gazebo의 자산 검색/URI와 ROS의 패키지 검색도 동일한 규칙이라고 가정하지 않는다. 공식 guide는 GZ_SIM_RESOURCE_PATH와 모델 설치/환경 hook 등 자산 접근을 설명한다. package:///model://와 변환/검색 지원은 사용하는 loader/버전의 계약으로 확인한다. 실행 환경에 우연히 남아 있는 개발 경로 덕분에 보이는 자산과 독립 환경에서 재현 가능한 설치를 나눈다.
launch 인수로 world/robot 이름과 config 경로를 바꾸면 bridge/TF·센서 topic도 같은 대상을 가리키는지 대조한다. 전역 절대 토픽과 상대/namespace 토픽, frame 문자열은 다른 층이다. 하드코딩된 다른 로봇 이름을 놓치면 정상처럼 보이는 잘못된 대상의 상태를 구독할 수 있다.
Navigation은 환경/위치·계획/제어의 연결이다
Navigation은 목적지로 가기 위한 위치/지도·경로 계획과 현재 상태에 맞는 제어/결과 판단을 연결하는 application이다. map은 전역 공간 기준, odom은 연속 로컬 운동, base_link는 로봇 강체 기준이다. map 파일을 읽는 노드와 현재 로봇 위치를 지도에 연결하는 추정기는 다른 책임이다. planner의 경로와 controller의 속도 명령·실제 도착도 나누어 본다.
이 단위는 구체적인 탐색/SLAM·Nav2 알고리즘을 실행하지 않는다. 주어진 frame/topic·clock/상태가 다음 단계의 입력을 제공하는지 분석한다. 지도/전역 추정이 없는 구성에서 map→odom이 미상이면 global_frame=map이라고 적는 것만으로 준비가 완료되지 않는다. lifecycle/서비스 수락과 현재 입력·계산/실제 실행 결과도 구분한다. 상세 알고리즘은 후속 단원의 역할이며 여기서는 필요한 전제를 표로 제공한다.
완전한 가상 manifest에서 여섯 참조를 검사한다
다음은 교육용 파일/관측 표다. 나열한 내용 외에 숨겨진 경로/발행자는 없다고 가정한다. 실제 파일이 저장되어 있거나 프로그램이 실행된 결과는 아니다. 자산 검색은 주어진 install 경로만 사용한다.
| ID | 요구/실제 정의 | 설정/관찰 기록 |
|---|---|---|
| F1 | demo.sdf 안의 world=lab, 관측 clock=/world/lab/clock | bridge는 /world/demo/clock을 구독 |
| F2 | 실제 왼쪽 joint=wheel_left_joint | DiffDrive left_joint=left_wheel_joint |
| F3 | 설치 모델 mobile_demo/model.sdf가 검색 경로에 존재 | 생성 요청은 그 모델을 참조 |
| F4 | mesh base.dae는 source에만 있고 install에는 없음 | 실행 loader는 install 자산 경로만 검색 |
| F5 | Navigation global_frame=map/base=base_link | map→odom과 전역 위치 상태는 아직 없음 |
| F6 | Transport cmd=/model/mobile_demo/cmd_vel, 형식 gz.msgs.Twist | bridge는 ROS /cmd_vel의 Twist를 해당 이름으로 ROS_TO_GZ 연결 |
이번 검사 범위를 정한다. F1은 clock 이름 대응, F2는 joint 이름 대응, F3/F4는 주어진 자산 참조 가능성, F5는 전역 주행 frame 준비, F6은 명령 토픽의 이름/지원 형식/방향 대응이다. 각각의 정적 계약을 확인하는 것이며 실제 메시지 수신/이동을 이미 확인했다고 하지 않는다.
F1은 world 이름이 lab이라 demo 경로가 틀렸고, F2는 joint 식별자가 틀렸으며, F4는 설치 검색에서 자산을 찾을 수 없어 실패다. F3의 모델 참조와 F6의 이름/형식/방향은 주어진 범위에서 통과한다. F5는 전역 상태/TF 입력이 없어 준비 보류다. 합은 통과 2·실패 3·보류 1이다. 이 개수는 구성 참조 검사 결과이며 주행 성공률이 아니다.
준비 순서와 실패 근거를 따라간다
준비 표는 자산/모델·월드/system 확인→실제 world/entity/초기 상태→clock/노드 시간→sensor/TF/odom·bridge→위치/지도와 application 입력→명령/제한·결과의 관문으로 구성할 수 있다. 파일이 로드되는 순서와 준비된 순서는 같지 않다. 단순히 몇 초 기다리거나 모든 process가 떴다는 사실로 다음 관문을 통과시키지 않는다. 필요한 후속 관측/유효 시각과 오류/미상을 확인한다.
F1을 고치면 clock source/수신·use_sim_time을, F2는 모델의 축/구동 mode와 joint 상태를, F4는 설치/검색·실제 loader의 자산 경로를 재검증한다. F5에는 유효한 map/위치·frame 소유/시각과 준비 절차가 필요하다. F6이 정적으로 맞아도 실제 전달/물리·제어·제동을 별도 확인한다. 수정한 파일과 실제로 읽힌 config·버전/원본을 연결한다.
Classic 예제를 이식할 때는 package/launch·system library와 SDF/센서 지원, Transport/ROS 형식·토픽/시각·TF·자산 검색을 기능별로 대조한다. 이름을 일괄 바꾼 뒤 같은 동작을 보장하지 않는다. 원본/대상 버전·기능 차이·미지원/대체와 정상/오류 사례를 기록한다. 기존 기준 실습 환경과 6.7 트러블슈팅을 연결해 원인 가설과 확인된 사실을 나누자. 분석 과제의 완료는 실제 모바일 로봇/Navigation 실증의 완료가 아니다.