Part 4. ROS2 워크스페이스 구조 및 빌드 시스템
ROS2(Robot Operating System 2)의 개발 환경은 워크스페이스(Workspace)라는 명확히 정의된 디렉터리 계층 구조를 기반으로 구성된다. 워크스페이스는 개발자가 패키지를 생성, 수정, 빌드 및 배포하는 독립적인 작업 공간을 제공하며, 시스템 전체에 설치된 기본 ROS2 환경(Underlay)과 사용자 정의 환경(Overlay)을 논리적으로 분리하는 역할을 수행한다. 이러한 구조적 분리는 의존성 충돌을 방지하고 복수의 프로젝트를 동일한 시스템 시스템 내에서 안정적으로 병행 개발할 수 있는 기반을 제공한다.
1. ROS2 워크스페이스의 계층적 디렉터리 구조
ROS2 워크스페이스는 기본적으로 소스 코드를 관리하는 공간과 빌드 시스템에 의해 자동 생성되는 공간으로 엄격히 구분된다. 표준적인 워크스페이스는 다음과 같은 하위 디렉터리를 포함한다.
src/디렉터리 (Source Space): 개발자가 직접 작성하거나 외부 저장소에서 복제한(clone) 원시 패키지(source package)들이 위치하는 공간이다. 각 패키지는 고유의CMakeLists.txt파일(C++ 기반의 경우) 또는setup.py파일(Python 기반의 경우)과 메타데이터를 포함하는package.xml파일을 포괄한다.build/디렉터리 (Build Space): 빌드 도구가 소스 코드를 컴파일하는 과정에서 발생하는 중간 파일(intermediate files)과 캐시(cache) 데이터가 저장되는 공간이다. 패키지별로 분리된 하위 디렉터리가 생성되어 독립적인 빌드 환경을 보장한다.install/디렉터리 (Install Space): 컴파일이 완료된 실행 파일(executable), 라이브러리 파일(library), 환경 설정 스크립트(setup scripts) 및 정적 리소스 파일이 최종적으로 복사되어 배치되는 공간이다. 시스템은 이 디렉터리를 참조하여 런타임 환경을 구성한다.log/디렉터리 (Log Space): 패키지 빌드 과정에서 발생하는 각종 컴파일 및 링커 로그(log), 경고, 에러 메시지가 기록되는 공간이다. 빌드 실패 시 디버깅을 위한 핵심 데이터를 제공한다.
2. Ament 빌드 시스템과 Colcon의 역할
ROS2는 기존 ROS1의 catkin 빌드 시스템을 대체하기 위해 패키지 컴파일 및 의존성 관리 목적으로 ament 빌드 시스템 라우팅과 colcon (collective construction) 메타 빌드 도구(meta-build tool)를 도입하였다.
2.1 Colcon 메타 빌드 도구
colcon은 다수의 패키지를 포함하는 워크스페이스 전체를 일괄적으로 빌드할 수 있도록 설계된 도구이다. 각 패키지의 package.xml에 명시된 의존성 그래프(dependency graph)를 위상 정렬(topological sorting) 알고리즘을 통해 분석하고, 빌드 순서를 자동으로 결정한다. 상호 의존성이 없는 패키지들은 병렬적으로 빌드되어 전체 컴파일 시간을 단축한다. 명령어 colcon build를 실행하면 워크스페이스 내의 모든 패키지가 빌드 프로세스에 진입한다. 특정 패키지만을 빌드하기 위해 --packages-select 인자를 활용할 수 있다.
2.2 패키지 포맷과 빌드 시스템
ROS2 패키지는 구현 언어 및 목적에 따라 각기 다른 빌드 시스템을 채택한다.
- ament_cmake: C/C++ 기반의 패키지 빌드를 통제한다. CMake(Cross Platform Make)의 확장된 형태로서, 헤더 파일 탐색, 라이브러리 링킹, 패키지 간 인터페이스 연결을 위한 표준화된 매크로(macro)와 함수를 제공한다.
- ament_python: 순수 Python으로 작성된 패키지를 배포하고 설치하는 역할을 수행한다. Python 표준 패키징 도구인
setuptools기반으로 작동하며,setup.py와setup.cfg파일을 통해 패키지 메타데이터와 진입점(entry points)을 정의한다.
3. 환경 설정(Sourcing)과 Overlay 논리 구조
소스 코드가 컴파일된 이후, 생성된 실행 파일 및 자원을 운영체제 시스템이 인식하도록 런타임 환경 변수(Environment Variables)를 설정하는 과정을 소싱(Sourcing)이라고 명명한다.
- Underlay 환경: 시스템 전역(글로벌)에 설치된 ROS2 베이스 환경(예:
/opt/ros/${ROS_DISTRO}/setup.bash)을 의미한다. 기본 라이브러리와 핵심 컴포넌트를 제공한다. - Overlay 환경: 개발자가 구성한 특정 워크스페이스 환경(예:
~/ros2_ws/install/setup.bash)을 지칭한다.
Underlay가 소싱된 상태에서 특정 워크스페이스의 Overlay를 소싱하면, 환경 변수의 경로(path) 확장이 우선순위에 따라 덮어 쓰여진다(overlaying). 이를 통해 개발 패키지가 시스템 전역 패키지보다 우선적으로 탐색 및 실행되도록 강제할 수 있으며, 기존 설치 환경의 훼손 없이 독립적인 테스트 및 적용이 가능하다.