CMakeLists.txt의 역할
CMakeLists.txt
는 ROS2 패키지를 빌드하기 위한 설정 파일로, ROS2의 빌드 시스템인 colcon
을 사용하여 CMake 기반의 프로젝트를 관리하고 빌드하는 데 사용된다. CMakeLists.txt
파일은 ROS2 패키지가 종속된 라이브러리와 빌드 옵션을 지정하고, ROS2에서 제공하는 노드, 메시지, 서비스 등을 컴파일하고 연결하는 과정을 정의한다.
주요 구성 요소
-
프로젝트 정의
CMakeLists.txt
파일은cmake_minimum_required
와project()
명령어로 시작한다. 이 두 명령어는 최소 CMake 버전을 지정하고, 프로젝트 이름과 속성을 정의한다.
cmake cmake_minimum_required(VERSION 3.5) project(my_ros2_package)
-
패키지 의존성 설정
- ROS2 패키지는 여러 다른 패키지나 라이브러리에 의존한다. 이러한 의존성을 관리하기 위해
find_package()
명령어를 사용한다. 예를 들어, ROS2의 핵심 패키지인rclcpp
와sensor_msgs
를 포함할 수 있다.
cmake find_package(rclcpp REQUIRED) find_package(sensor_msgs REQUIRED)
- ROS2 패키지는 여러 다른 패키지나 라이브러리에 의존한다. 이러한 의존성을 관리하기 위해
-
실행 파일 및 라이브러리 추가
- 패키지에서 제공하는 실행 파일이나 라이브러리를 정의하고, 이를 빌드하는 방법을 설정한다.
add_executable()
명령어로 실행 파일을 추가하고,target_link_libraries()
명령어로 해당 실행 파일이 종속된 라이브러리를 연결한다.
cmake add_executable(my_node src/my_node.cpp) target_link_libraries(my_node rclcpp)
- 패키지에서 제공하는 실행 파일이나 라이브러리를 정의하고, 이를 빌드하는 방법을 설정한다.
-
설치 설정
- 빌드된 결과물을 설치하기 위한 경로와 설정을 지정한다. ROS2 패키지를 시스템 경로에 배포하기 위해
install()
명령어를 사용하여 실행 파일과 라이브러리를 설치할 수 있다.
cmake install(TARGETS my_node DESTINATION lib/${PROJECT_NAME})
- 빌드된 결과물을 설치하기 위한 경로와 설정을 지정한다. ROS2 패키지를 시스템 경로에 배포하기 위해
package.xml의 역할
package.xml
파일은 ROS2 패키지의 메타데이터를 정의하는 파일로, 패키지의 이름, 버전, 유지보수자 정보, 라이선스 정보 등을 포함한다. 또한 패키지 간의 의존성을 관리하며, 패키지를 배포하고 다른 패키지와 상호작용하는 데 필요한 정보를 제공한다.
주요 구성 요소
-
패키지 메타데이터
- 패키지 이름, 버전, 유지보수자, 라이선스 등의 기본 정보를 정의한다.
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>
-
빌드 및 실행 의존성
- 패키지가 의존하는 다른 ROS2 패키지나 라이브러리를 정의한다.
build_depend
는 빌드 시 필요한 패키지,exec_depend
는 실행 시 필요한 패키지를 나타낸다.
xml <build_depend>rclcpp</build_depend> <exec_depend>sensor_msgs</exec_depend>
- 패키지가 의존하는 다른 ROS2 패키지나 라이브러리를 정의한다.
-
테스트 의존성
- 패키지 테스트를 수행할 때 필요한 의존성을 정의할 수 있다. 테스트 시 필요한 ROS2 패키지나 툴을 정의하는 부분이다.
xml <test_depend>ament_lint_auto</test_depend> <test_depend>ament_cmake_pytest</test_depend>
-
빌드 도구 의존성
- 패키지를 빌드하기 위해 필요한 도구를 정의한다. 예를 들어, ROS2 패키지를 빌드하는 데 사용하는
ament_cmake
는 필수적인 빌드 도구 의존성이다.
xml <buildtool_depend>ament_cmake</buildtool_depend>
- 패키지를 빌드하기 위해 필요한 도구를 정의한다. 예를 들어, ROS2 패키지를 빌드하는 데 사용하는
-
기타 의존성
-
package.xml
파일에는build_export_depend
와exec_depend
등의 의존성도 정의할 수 있다. 이러한 의존성들은 패키지가 빌드될 때뿐만 아니라 다른 패키지에서 이 패키지를 사용할 때도 필요한 의존성을 관리한다. -
예를 들어,
build_export_depend
는 빌드된 패키지가 다른 패키지에서 사용될 때 필요한 의존성을 정의하고,exec_depend
는 패키지를 실행할 때 요구되는 의존성을 정의한다.
xml
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>
- 파이썬 패키지 관리
- 만약 패키지에 파이썬 스크립트나 라이브러리가 포함된 경우,
ament_python
과 같은 의존성을 정의해야 한다. 이를 통해 파이썬 기반의 ROS2 노드를 관리할 수 있다.
xml
<buildtool_depend>ament_python</buildtool_depend>
CMakeLists.txt와 package.xml의 상호작용
-
CMakeLists.txt
와package.xml
은 상호 보완적인 역할을 하며,CMakeLists.txt
가 실제 빌드 프로세스를 담당하고,package.xml
은 패키지의 메타데이터 및 의존성 관리를 담당한다. -
예를 들어,
package.xml
에서 의존성을 정의한 패키지나 라이브러리는CMakeLists.txt
에서find_package()
명령어를 통해 실제로 빌드할 때 찾아 사용하게 된다. -
또한
ament_cmake
와 같은 빌드 도구는package.xml
에서 정의한 빌드 도구 의존성에 기반하여 CMake 프로세스를 실행한다. 이처럼 두 파일은 긴밀히 연결되어 있어, ROS2 패키지의 정상적인 빌드와 실행을 위해서는 두 파일이 일관되게 작성되어야 한다.
패키지 관리 예시
- 패키지 생성 및 의존성 설정
-
ROS2 패키지를 생성할 때
ros2 pkg create
명령어를 사용하면, 기본적인CMakeLists.txt
와package.xml
이 자동으로 생성된다. 사용자는 이후 필요한 의존성을package.xml
에 추가하고,CMakeLists.txt
에 필요한 라이브러리와 파일을 설정한다. -
예를 들어, 패키지를 생성할 때
rclcpp
와sensor_msgs
와 같은 의존성을 추가했다면, 해당 의존성은package.xml
파일에 포함되며,CMakeLists.txt
에서는 이를find_package()
를 통해 참조하게 된다.
bash
ros2 pkg create my_ros2_package --build-type ament_cmake --dependencies rclcpp sensor_msgs
- 빌드 및 설치
-
패키지를 빌드하기 위해서는
colcon build
명령어를 사용하여 빌드 프로세스를 시작한다. 이 과정에서CMakeLists.txt
에 정의된 빌드 규칙이 적용되며, 종속성 확인과 컴파일이 진행된다. -
빌드 후, 패키지는 시스템 경로에 설치되며, 설치 과정은
CMakeLists.txt
에 정의된install()
명령어에 따라 실행된다.
bash
colcon build
- ROS2 실행 시 package.xml의 역할
- 패키지를 실행할 때, ROS2는
package.xml
파일을 참조하여 패키지 간의 의존성을 확인하고, 실행 환경을 설정한다. 예를 들어,rclcpp
와sensor_msgs
같은 패키지가 설치되지 않은 상태에서 패키지를 실행하려고 하면 의존성 오류가 발생할 수 있다.