CMakeLists.txt의 역할

CMakeLists.txt는 ROS2 패키지를 빌드하기 위한 설정 파일로, ROS2의 빌드 시스템인 colcon을 사용하여 CMake 기반의 프로젝트를 관리하고 빌드하는 데 사용된다. CMakeLists.txt 파일은 ROS2 패키지가 종속된 라이브러리와 빌드 옵션을 지정하고, ROS2에서 제공하는 노드, 메시지, 서비스 등을 컴파일하고 연결하는 과정을 정의한다.

주요 구성 요소

  1. 프로젝트 정의

    • CMakeLists.txt 파일은 cmake_minimum_requiredproject() 명령어로 시작한다. 이 두 명령어는 최소 CMake 버전을 지정하고, 프로젝트 이름과 속성을 정의한다.

    cmake cmake_minimum_required(VERSION 3.5) project(my_ros2_package)

  2. 패키지 의존성 설정

    • ROS2 패키지는 여러 다른 패키지나 라이브러리에 의존한다. 이러한 의존성을 관리하기 위해 find_package() 명령어를 사용한다. 예를 들어, ROS2의 핵심 패키지인 rclcppsensor_msgs를 포함할 수 있다.

    cmake find_package(rclcpp REQUIRED) find_package(sensor_msgs REQUIRED)

  3. 실행 파일 및 라이브러리 추가

    • 패키지에서 제공하는 실행 파일이나 라이브러리를 정의하고, 이를 빌드하는 방법을 설정한다. add_executable() 명령어로 실행 파일을 추가하고, target_link_libraries() 명령어로 해당 실행 파일이 종속된 라이브러리를 연결한다.

    cmake add_executable(my_node src/my_node.cpp) target_link_libraries(my_node rclcpp)

  4. 설치 설정

    • 빌드된 결과물을 설치하기 위한 경로와 설정을 지정한다. ROS2 패키지를 시스템 경로에 배포하기 위해 install() 명령어를 사용하여 실행 파일과 라이브러리를 설치할 수 있다.

    cmake install(TARGETS my_node DESTINATION lib/${PROJECT_NAME})

package.xml의 역할

package.xml 파일은 ROS2 패키지의 메타데이터를 정의하는 파일로, 패키지의 이름, 버전, 유지보수자 정보, 라이선스 정보 등을 포함한다. 또한 패키지 간의 의존성을 관리하며, 패키지를 배포하고 다른 패키지와 상호작용하는 데 필요한 정보를 제공한다.

주요 구성 요소

  1. 패키지 메타데이터

    • 패키지 이름, 버전, 유지보수자, 라이선스 등의 기본 정보를 정의한다.

    xml <package format="3"> <name>my_ros2_package</name> <version>0.1.0</version> <description>My ROS2 Package</description> <maintainer email="developer@example.com">Developer</maintainer> <license>Apache-2.0</license> </package>

  2. 빌드 및 실행 의존성

    • 패키지가 의존하는 다른 ROS2 패키지나 라이브러리를 정의한다. build_depend는 빌드 시 필요한 패키지, exec_depend는 실행 시 필요한 패키지를 나타낸다.

    xml <build_depend>rclcpp</build_depend> <exec_depend>sensor_msgs</exec_depend>

  3. 테스트 의존성

    • 패키지 테스트를 수행할 때 필요한 의존성을 정의할 수 있다. 테스트 시 필요한 ROS2 패키지나 툴을 정의하는 부분이다.

    xml <test_depend>ament_lint_auto</test_depend> <test_depend>ament_cmake_pytest</test_depend>

  4. 빌드 도구 의존성

    • 패키지를 빌드하기 위해 필요한 도구를 정의한다. 예를 들어, ROS2 패키지를 빌드하는 데 사용하는 ament_cmake는 필수적인 빌드 도구 의존성이다.

    xml <buildtool_depend>ament_cmake</buildtool_depend>

  5. 기타 의존성

  6. package.xml 파일에는 build_export_dependexec_depend 등의 의존성도 정의할 수 있다. 이러한 의존성들은 패키지가 빌드될 때뿐만 아니라 다른 패키지에서 이 패키지를 사용할 때도 필요한 의존성을 관리한다.

  7. 예를 들어, build_export_depend는 빌드된 패키지가 다른 패키지에서 사용될 때 필요한 의존성을 정의하고, exec_depend는 패키지를 실행할 때 요구되는 의존성을 정의한다.

xml <build_export_depend>std_msgs</build_export_depend> <exec_depend>geometry_msgs</exec_depend>

  1. 파이썬 패키지 관리
  2. 만약 패키지에 파이썬 스크립트나 라이브러리가 포함된 경우, ament_python과 같은 의존성을 정의해야 한다. 이를 통해 파이썬 기반의 ROS2 노드를 관리할 수 있다.

xml <buildtool_depend>ament_python</buildtool_depend>

CMakeLists.txt와 package.xml의 상호작용

패키지 관리 예시

  1. 패키지 생성 및 의존성 설정
  2. ROS2 패키지를 생성할 때 ros2 pkg create 명령어를 사용하면, 기본적인 CMakeLists.txtpackage.xml이 자동으로 생성된다. 사용자는 이후 필요한 의존성을 package.xml에 추가하고, CMakeLists.txt에 필요한 라이브러리와 파일을 설정한다.

  3. 예를 들어, 패키지를 생성할 때 rclcppsensor_msgs와 같은 의존성을 추가했다면, 해당 의존성은 package.xml 파일에 포함되며, CMakeLists.txt에서는 이를 find_package()를 통해 참조하게 된다.

bash ros2 pkg create my_ros2_package --build-type ament_cmake --dependencies rclcpp sensor_msgs

  1. 빌드 및 설치
  2. 패키지를 빌드하기 위해서는 colcon build 명령어를 사용하여 빌드 프로세스를 시작한다. 이 과정에서 CMakeLists.txt에 정의된 빌드 규칙이 적용되며, 종속성 확인과 컴파일이 진행된다.

  3. 빌드 후, 패키지는 시스템 경로에 설치되며, 설치 과정은 CMakeLists.txt에 정의된 install() 명령어에 따라 실행된다.

bash colcon build

  1. ROS2 실행 시 package.xml의 역할
  2. 패키지를 실행할 때, ROS2는 package.xml 파일을 참조하여 패키지 간의 의존성을 확인하고, 실행 환경을 설정한다. 예를 들어, rclcppsensor_msgs 같은 패키지가 설치되지 않은 상태에서 패키지를 실행하려고 하면 의존성 오류가 발생할 수 있다.