1317.47 PlanSys2의 빌드 시스템과 의존성 관리
1. 빌드 시스템의 개요
PlanSys2는 ROS2의 표준 빌드 도구인 colcon과 ament 빌드 시스템을 사용한다. 각 PlanSys2 패키지는 독립적인 CMakeLists.txt와 package.xml을 가지며, colcon build 명령을 통해 빌드된다. 이 빌드 시스템은 패키지 간의 의존성을 자동으로 해결하고, 올바른 빌드 순서를 결정하며, 병렬 빌드를 지원하여 빌드 효율성을 극대화한다(Martín et al., 2021).
2. ament 빌드 시스템
2.1 ament_cmake의 역할
PlanSys2의 모든 C++ 패키지는 ament_cmake 빌드 타입을 사용한다. ament_cmake는 CMake 위에 구축된 ROS2의 빌드 시스템으로, 패키지의 빌드, 설치, 테스트를 표준화된 방식으로 관리한다.
각 패키지의 CMakeLists.txt는 다음과 같은 구조를 가진다.
cmake_minimum_required(VERSION 3.16)
project(plansys2_domain_expert)
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_lifecycle REQUIRED)
find_package(plansys2_core REQUIRED)
find_package(plansys2_msgs REQUIRED)
# 라이브러리 및 실행 파일 빌드
add_library(domain_expert_lib SHARED src/DomainExpertNode.cpp)
ament_target_dependencies(domain_expert_lib
rclcpp rclcpp_lifecycle plansys2_core plansys2_msgs)
add_executable(domain_expert_node src/domain_expert_node.cpp)
target_link_libraries(domain_expert_node domain_expert_lib)
# 설치
install(TARGETS domain_expert_lib domain_expert_node
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib/${PROJECT_NAME})
ament_package()
2.2 package.xml의 의존성 선언
각 패키지의 package.xml 파일은 빌드 의존성, 실행 의존성, 테스트 의존성을 XML 형식으로 선언한다.
<package format="3">
<name>plansys2_domain_expert</name>
<version>2.0.0</version>
<description>PlanSys2 Domain Expert Node</description>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>rclcpp_lifecycle</depend>
<depend>plansys2_core</depend>
<depend>plansys2_msgs</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_cmake_gtest</test_depend>
</package>
<depend> 태그는 빌드 시점과 실행 시점 모두에서 필요한 의존성을 선언한다.
3. 패키지 간 의존성 구조
PlanSys2의 패키지 간 의존성 구조는 다음과 같은 계층을 형성한다.
plansys2_msgs (메시지 정의)
↑
plansys2_core (핵심 인터페이스)
↑
plansys2_domain_expert, plansys2_problem_expert,
plansys2_planner, plansys2_executor (핵심 노드)
↑
plansys2_popf_plan_solver (플래너 플러그인)
↑
plansys2_bringup (런치 및 구성)
plansys2_terminal (터미널 인터페이스)
화살표는 의존 방향을 나타내며, 하위 패키지가 상위 패키지에 의존한다. 이 계층 구조는 순환 의존성(circular dependency)을 방지하고, 최소 의존성 원칙을 준수한다.
4. 의존성 관리
4.1 rosdep을 통한 시스템 의존성 관리
PlanSys2의 외부 시스템 의존성(Boost, Coin-OR CLP 등)은 rosdep을 통해 관리된다. rosdep은 package.xml에 선언된 의존성을 시스템 패키지 관리자(apt)의 패키지 이름으로 변환하여 설치한다.
rosdep install --from-paths src --ignore-src -r -y
4.2 ROS2 패키지 의존성
PlanSys2가 의존하는 주요 ROS2 패키지는 다음과 같다.
| 패키지 | 용도 |
|---|---|
rclcpp | ROS2 C++ 클라이언트 라이브러리 |
rclcpp_lifecycle | 관리형 노드 라이프사이클 지원 |
rclcpp_action | ROS2 액션 클라이언트/서버 |
pluginlib | 플러그인 동적 로딩 |
behaviortree_cpp_v3 | 행동 트리 엔진 |
lifecycle_msgs | 라이프사이클 메시지 정의 |
5. colcon 빌드 도구
5.1 빌드 명령
colcon은 ROS2의 표준 빌드 도구로, 워크스페이스 내의 모든 패키지를 의존성 순서에 따라 빌드한다.
colcon build # 전체 빌드
colcon build --packages-select plansys2_planner # 특정 패키지만 빌드
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug # 디버그 빌드
5.2 병렬 빌드
colcon은 의존성이 없는 패키지들을 자동으로 병렬 빌드한다. --parallel-workers 옵션을 통해 병렬 작업 수를 제어할 수 있으며, 기본값은 시스템의 CPU 코어 수이다.
5.3 테스트 실행
PlanSys2의 단위 테스트와 통합 테스트는 colcon test 명령으로 실행된다.
colcon test
colcon test-result --verbose
6. 지속적 통합(CI)
PlanSys2 프로젝트는 GitHub Actions를 통한 지속적 통합(Continuous Integration, CI) 파이프라인을 운용한다. 매 커밋과 풀 리퀘스트에 대해 빌드, 테스트, 정적 분석이 자동으로 수행되어, 코드 품질과 빌드 안정성이 지속적으로 검증된다. CI 환경에서는 지원되는 모든 ROS2 배포판에 대해 빌드와 테스트가 병렬로 실행된다(Martín et al., 2021).
참고 문헌
- Martín, F., Cañas, J. M., Ginés, J., & Fuentetaja, R. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
- Macenski, S., Foote, T., Gerkey, B., Lalancette, C., & Woodall, W. (2022). “Robot Operating System 2: Design, Architecture, and Uses in the Wild.” Science Robotics, 7(66), eabm6074.
버전: v1.0