ROS - package.xml, CMakeLists.txt

남생이·2024년 10월 17일

ROS

목록 보기
28/28

package.xml

1.1 package.xml의 기능

  • 패키지에 대한 메타 정보를 포함하는 파일 -> 이름, 버전, 저작자, 라이센스 등의 정보 정의, 패키지의 의존성, 인터페이스 정보 포함(메시지, 서비스, 액션 등)

  • 사용 목적

    • 소스 코드를 실제 가능한 프로그램이나 라이브러리로 변환하기 위해 colocn build를 수행 시 package.xml을 참조하여, 빌드할 패키지들 사이의 의존성을 해석 및 적절한 빌드 순서를 결정
    • 패키지의 의존성을 설치하기 위해 rosdep과 함께 사용될 때 이 파일의 정보를 기반으로 진행

1.2 package.xml code 분석

<?xml version="1.0"?>  "버전 1.0"
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  
  <name>ros_test_py</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="namsang@todo.todo">namsang</maintainer>
  <license>TODO: License declaration</license>

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>
  • <license>
    :라이센스를 기재한다. BSC, MIT,Apache, GPLv3, LGPLv3등을 기재하면 된다.

  • <description>
    : 패키지에 대한 설명을 문자열로 표기(패키지의 목적과 기능에 대한 내용)

  • <test_depend>
    : 테스트 시 필요한 의존성 지정

  • <export>
    : 패키지에서 외부로 내보낼 항목 정의, 빌드 유형(ament_python, ament_cmake) 명시

1.3 추가 기능

  • <depend>
    : 패키지 빌드 및 실행 시 필요한 의존성 정의,
<depend>rcply</depend>
  • 클라이언트 라이브러리(rclpy, rclcpp), 메시지타입(std_msg), 노드 및 메시지 타입을 정의한 인터페이스 등


  • <build_depend>
    : 패키지 빌드 시 필요한 의존성 정의,
<build_depend>ament_cmake</build_depend>`

  • <exec_depend>: 패키지 실행 시 필요한 의존성 정의
<exec_depend>rclcpp</exec_depend>

  • <buildtool_depend>
    : 빌드 도구에 대한 의존성 정의

  • <author>
    : 패키지의 작성자 추가

  • <extend>
    : 다른 패키지로부터 이 패키지가 확장되었음을 명시, 즉 특정 패키지를 상속하여 기능을 추가하거나 수정함
<extend>base_package_name</extend>

2. CMakeLists.txt

2.1 CMakeLists.txt

  • 패키지 내 코드를 빌드하는 방법을 기술하는 파일

  • 빌드에 필요한 컴파일러, 라이브러리, 소스 파일 등을 명시하고, 실행 파일, 라이브러리, 메시지, 서비스 등의 빌드 대상 및 의존성 관리를 설정

  • 빌드 프로세스를 자동화하기 위한 CMake 빌드 시스템에 의해 사용

  • 사용 목적
    - ros2에서 패키지의 빌드 규칙 정의
    - cmake가 각 패키지를 어떻게 컴파일하고 링크할지 지시하는 지침을 포함

CMakeLists.txt의 역할
1. 패키지에 필요한 최소 CMake 버전 지정
2. 프로젝트 이름과 버전 설정
3. 빌드해야 할 타겟 정의 --> executables, libraries
4. 필요한 종속성 패키지를 찾고 링크
5. 특정 빌드 옵션을 설정하거나 사용자 정의 빌드 규칙
6. 테스트 실행 및 설치 규칙을 정의

2.2 CMakeLists.txt 코드 분석

# 최소 CMake 버전을 설정합니다.
cmake_minimum_required(VERSION 3.8)

# ROS 2 패키지 이름을 설정합니다.
project(ros_study_msgs)

# 컴파일러가 GCC 또는 Clang인 경우 추가 컴파일 옵션을 설정합니다.
# -Wall: 모든 경고를 출력
# -Wextra: 추가 경고를 출력
# -Wpedantic: 표준에 엄격한 코드를 작성하기 위한 경고를 출력
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 필요한 ROS 2 의존성을 찾습니다.
# ament_cmake: ROS 2 빌드를 위한 CMake 기반 빌드 시스템
# builtin_interfaces: 기본 메시지 타입 (예: Time, Duration 등)
# rosidl_default_generators: ROS 인터페이스 파일(msg, srv, action)을 코드로 생성하는 데 사용
find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)

# 메시지 파일을 설정합니다.
# "MyMsg.msg"와 "ArithmeticArgument.msg"라는 사용자 정의 메시지를 정의합니다.
set(msg_files
  "msg/MyMsg.msg"
  "msg/ArithmeticArgument.msg"
)

# 서비스 파일을 설정합니다.
# "MySrv.srv"와 "ArithmeticOperator.srv"라는 사용자 정의 서비스를 정의합니다.
set(srv_files
  "srv/MySrv.srv"
  "srv/ArithmeticOperator.srv"
)

# 액션 파일을 설정합니다.
# "MyAction.action"와 "ArithmeticChecker.action"라는 사용자 정의 액션을 정의합니다.
set(action_files
  "action/MyAction.action"
  "action/ArithmeticChecker.action"
)

# 인터페이스 파일들(msg, srv, action)을 기반으로 ROS 메시지, 서비스, 액션을 생성합니다.
# ${PROJECT_NAME}: 프로젝트 이름을 사용하여 인터페이스를 생성
# DEPENDENCIES: 생성된 인터페이스가 필요한 의존성들을 명시합니다. 여기서는 'builtin_interfaces'를 사용.
rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  ${srv_files}
  ${action_files}
  DEPENDENCIES builtin_interfaces
)

# 테스트를 빌드할 때 필요한 의존성을 설정합니다.
if(BUILD_TESTING)
  # 자동으로 린트(lint) 테스트 의존성을 찾습니다.
  find_package(ament_lint_auto REQUIRED)

  # 다음 라인은 저작권 확인을 건너뜁니다.
  # 모든 소스 파일에 저작권과 라이선스가 추가되면 이 줄을 주석 처리합니다.
  set(ament_cmake_copyright_FOUND TRUE)
  
  # 다음 라인은 cpplint 확인을 건너뜁니다(이는 git 저장소에서만 작동).
  # 패키지가 git 저장소에 추가되었고, 모든 소스 파일에 저작권과 라이선스가 추가되면 이 줄을 주석 처리합니다.
  set(ament_cmake_cpplint_FOUND TRUE)
  
  # 자동으로 테스트에 필요한 의존성을 찾습니다.
  ament_lint_auto_find_test_dependencies()
endif()

# 패키지를 ament 빌드 시스템으로 설정합니다.
ament_package()
profile
공부하는 거북이

0개의 댓글