25.1 ROS2 패키지 매니페스트(package.xml) 메타데이터 아키텍처론
ROS 2의 분산 아키텍처에서 개별 패키지가 자율적으로 컴파일되고 시스템 레벨에 통합되기 위해서는, 각 패키지가 지닌 정체성과 자원 요구 조건을 기계가 판독(Machine-readable)할 수 있는 표준 규격으로 명세해야 한다. 이 역할을 수행하는 핵심 요소가 바로 package.xml로 명명된 패키지 매니페스트(Package Manifest) 파일이다. 이 파일 구조는 REP-149(ROS Enhancement Proposal) 규격인 “Package Format 3“를 준수하며, 메타 빌드 시스템인 Colcon 및 의존성 해결 도구인 rosdep이 소스 트리를 해석하는 최우선 진입점(Entry point)이 된다.
1. 메타데이터 아키텍처의 논리적 계층 구조
package.xml은 크게 패키지 식별 영역, 라이선스 및 형상 관리 영역, 자원 스태킹(Stacking)을 위한 의존성 선언 영역, 그리고 ament 인덱싱 노출을 위한 익스포트(Export) 영역 등 4가지 논리적 계층으로 나눌 수 있다. 파일의 최상단은 <package format="3"> 태그로 래핑되어 파서(Parser)의 호환성을 보장한다.
-
식별(Identification) 계층:
패키지의 유일성(Uniqueness)을 시스템에 등록한다. 시스템 내에서 충돌 없는 네임스페이스를 점유하기 위한<name>태그, 의미론적 버전 관리(Semantic Versioning) 원칙에 기반한<version>태그, 그리고 패키지의 기술적 목적을 명시하는<description>태그로 구성된다. 유지보수 책임을 명시하는<maintainer>는 패키지 관리 정책 이행의 주체가 된다. -
형상 및 법적 권리 계층:
다중 시스템 배포 및 엔터프라이즈 환경 통합을 위한 법적 라이선스를 선언한다.<license>(예: Apache-2.0, MIT)가 필수 요소이며, 오픈소스 생태계 생체 주기를 관리하는 데 있어 필수적이다. -
시스템/컴파일 의존 관계(Dependency relations) 계층:
본 패키지가 시스템 내에 성공적으로 컴파일(Compile), 링크(Link), 실행(Execute)되기 위해 타 패키지나 운영체제 레벨의 라이브러리에 요구되는 종속성을 명세한다. 이 종속성은 런타임 단계에 따라 세분화된다.
<buildtool_depend>: 호스트 머신에서 빌드 파이프라인을 기동시키기 위한 프레임워크(예: ament_cmake, ament_python).<build_depend>: C++ 전처리 및 링킹 과정에서 필요한 타 패키지(예: rclcpp, 헤더 파일) 종속성.<exec_depend>: 컴파일 후 바이너리가 실행될 때 동적 링킹되거나 런타임에 참조되어야 하는 라이브러리 및 패키지.<test_depend>: 빌드 검증(Verification) 목적의 정적 및 동적 테스트 프레임워크(예: ament_lint_auto, gtest)에 대한 의존성.<depend>: 빌드, 런타임, 익스포트 등 사실상 생명 주기 전반에 필요한 의존성을 포괄적으로 묶는 태그.
- 자원 익스포트(Export) 계층:
패키지가 보유한 ament 특성이나 컴파일 구조적 특전을 ament 리소스 인덱스(ament resource index)에 등재하기 위해 사용된다. 하위 태그인<build_type>을 통해 시스템은 본 패키지가 ament_cmake 기반인지, ament_python 기반인지 도출하여 상응하는 컴파일 파이프라인을 연결한다.
2. 시스템 패키지 매핑 및 rosdep 통합 연계 메커니즘
package.xml의 의존성 식별자들은 단순한 문자열이 아니라 글로벌 rosdep 운영 체제 매핑 데이터베이스의 키스톤(Keystone) 역할을 담당한다.
rosdep 유틸리티는 작업 디렉터리 내의 모든 package.xml을 파싱하여 의존성 키(예: python3-numpy 또는 rclcpp)를 수집한다. 이후 중앙 관리형 YAML 레지스트리(예: rosdep 규칙 셋)와 운영 체제(예: Ubuntu Linux)의 패키지 관리 시스템(APT) 간의 매핑 테이블을 조회한다.
키가 매핑된 운영체제 의존성이 로컬 호스트에 부재할 경우, rosdep은 apt install 등의 네이티브 커맨드를 트리거(Trigger)하여 누락된 C++ 라이브러리, Python 모듈 등을 사전에 설치함으로써 Colcon이 안전하게 목적 파일(Object file)을 컴파일할 수 있는 환경(Environment)을 동기화시킨다. (참고 버전: ROS 2 Humble/Jazzy, REP-149 규격)