1317.47 PlanSys2의 빌드 시스템과 의존성 관리

1317.47 PlanSys2의 빌드 시스템과 의존성 관리

1. 빌드 시스템의 개요

PlanSys2는 ROS2의 표준 빌드 도구인 colconament 빌드 시스템을 사용한다. 각 PlanSys2 패키지는 독립적인 CMakeLists.txtpackage.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을 통해 관리된다. rosdeppackage.xml에 선언된 의존성을 시스템 패키지 관리자(apt)의 패키지 이름으로 변환하여 설치한다.

rosdep install --from-paths src --ignore-src -r -y

4.2 ROS2 패키지 의존성

PlanSys2가 의존하는 주요 ROS2 패키지는 다음과 같다.

패키지용도
rclcppROS2 C++ 클라이언트 라이브러리
rclcpp_lifecycle관리형 노드 라이프사이클 지원
rclcpp_actionROS2 액션 클라이언트/서버
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