Ubuntu ROS 실습(27)

zeusqoi·2일 전

개인공부 - ubuntu

목록 보기
46/56

ROS 2에서 패키지는 단순히 소스 코드만 포함하는 것이 아니라 패키지의 정보와 의존성, 빌드 방법, 라이선스, 변경 이력 등을 관리하기 위한 다양한 파일로 구성된다.

이번 실습에서는 C++과 Python 패키지를 직접 생성한 뒤 package.xml, CMakeLists.txt, setup.py, setup.cfg 등의 설정 파일을 확인하고, RQt 플러그인 설정 파일인 plugin.xml, 패키지 변경로그 파일인 CHANGELOG.rst, 라이선스 파일인 LICENSE도 직접 확인해보았다.


1. ROS 2 패키지의 구성

ROS 2 패키지는 사용하는 빌드 타입에 따라 파일 구성이 달라진다.

대표적으로 다음과 같은 빌드 타입이 있다.

  • ament_cmake
  • ament_python

이번 실습에서는 C++ 패키지와 Python 패키지를 각각 생성하여 두 패키지의 구조를 비교했다.


2. C++ 패키지

먼저 ament_cmake를 사용하는 C++ 패키지인 my_first_ros_rclcpp_pkg를 확인했다.

cd ~/robot_ws/src/my_first_ros_rclcpp_pkg
ls

결과는 다음과 같았다.

CMakeLists.txt
include
package.xml
src

전체 구조도 확인했다.

ls -R my_first_ros_rclcpp_pkg

결과:

my_first_ros_rclcpp_pkg:
CMakeLists.txt  include  package.xml  src

my_first_ros_rclcpp_pkg/include:
my_first_ros_rclcpp_pkg

my_first_ros_rclcpp_pkg/include/my_first_ros_rclcpp_pkg:

my_first_ros_rclcpp_pkg/src:

C++ 패키지는 src에 소스 코드를 작성하고 include에 헤더 파일을 구성할 수 있으며, CMakeLists.txt에서 빌드 설정을 관리한다.


3. package.xml

C++ 패키지의 package.xml을 확인했다.

cat package.xml

주요 내용은 다음과 같다.

<name>my_first_ros_rclcpp_pkg</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="namseungjoo@todo.todo">namseungjoo</maintainer>
<license>TODO: License declaration</license>

<buildtool_depend>ament_cmake</buildtool_depend>

<depend>rclcpp</depend>
<depend>std_msgs</depend>

package.xml에서는 패키지 이름과 버전, 설명, 관리자 정보, 라이선스, 빌드 도구 및 의존성 등을 설정한다.

또한 다음과 같이 패키지의 빌드 타입을 지정한다.

<export>
  <build_type>ament_cmake</build_type>
</export>

Python 패키지에서는 이 부분이 ament_python으로 설정된다.


4. CMakeLists.txt

C++ 패키지의 빌드 설정 파일인 CMakeLists.txt도 확인했다.

cat CMakeLists.txt

주요 부분은 다음과 같다.

cmake_minimum_required(VERSION 3.8)
project(my_first_ros_rclcpp_pkg)

ROS 2 패키지에서 필요한 의존성도 설정되어 있다.

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

마지막에는 다음과 같이 작성되어 있다.

ament_package()

따라서 C++ 패키지는 CMakeLists.txt를 통해 필요한 패키지와 빌드 과정을 설정한다.


5. Python 패키지

다음으로 ament_python을 사용하는 Python 패키지인 my_first_ros_rclpy_pkg를 확인했다.

cd ~/robot_ws/src/my_first_ros_rclpy_pkg
ls

결과:

my_first_ros_rclpy_pkg
package.xml
resource
setup.cfg
setup.py
test

전체 구조는 다음과 같았다.

my_first_ros_rclpy_pkg:
my_first_ros_rclpy_pkg
package.xml
resource
setup.cfg
setup.py
test

my_first_ros_rclpy_pkg/my_first_ros_rclpy_pkg:
__init__.py

my_first_ros_rclpy_pkg/resource:
my_first_ros_rclpy_pkg

my_first_ros_rclpy_pkg/test:
test_copyright.py
test_flake8.py
test_pep257.py

C++ 패키지와 달리 Python 패키지는 setup.py와 setup.cfg를 이용해 패키지 설치와 빌드를 관리한다.


6. setup.py

Python 패키지의 setup.py를 확인했다.

cat setup.py

패키지 이름은 다음과 같이 설정되어 있다.

package_name = 'my_first_ros_rclpy_pkg'

그리고 Python 패키지를 찾기 위해 다음과 같이 설정되어 있다.

packages=find_packages(exclude=['test'])

또한 ROS 2 Python 패키지에서 사용할 실행 파일은 console_scripts를 통해 등록할 수 있다.

현재 실습에서 생성된 패키지는 다음과 같이 비어 있었다.

entry_points={
    'console_scripts': [
    ],
},

따라서 아직 별도의 실행 노드는 등록하지 않은 상태이다.


7. setup.cfg

다음으로 setup.cfg를 확인했다.

cat setup.cfg

내용은 다음과 같았다.

[develop]
script_dir=$base/lib/my_first_ros_rclpy_pkg

[install]
install_scripts=$base/lib/my_first_ros_rclpy_pkg

Python 패키지의 실행 스크립트가 ROS 2 패키지의 lib 디렉터리 아래에 설치되도록 설정되어 있다.


8. Python package.xml

Python 패키지의 package.xml도 확인했다.

cat package.xml

주요 의존성은 다음과 같이 설정되어 있었다.

<depend>rclpy</depend>
<depend>std_msgs</depend>

그리고 빌드 타입은 다음과 같이 지정되어 있다.

<export>
  <build_type>ament_python</build_type>
</export>

C++ 패키지의 ament_cmake와 달리 Python 패키지는 ament_python을 사용하는 것을 확인할 수 있었다.


9. C++ 패키지와 Python 패키지 비교

두 패키지의 구조를 직접 확인하면서 다음과 같은 차이를 확인했다.

구분C++ 패키지Python 패키지
빌드 타입ament_cmakeament_python
주요 빌드 설정CMakeLists.txtsetup.py
추가 설정package.xmlsetup.cfg, package.xml
소스 구조src, includePython 패키지 디렉터리
Python 모듈-__init__.py
테스트CMake 설정에 따라 구성test 디렉터리

같은 ROS 2 패키지라도 사용하는 언어와 빌드 타입에 따라 패키지 파일의 구성이 달라지는 것을 확인할 수 있었다.


10. RQt 플러그인 설정 파일 - plugin.xml

다음으로 RQt 플러그인에서 사용하는 plugin.xml을 확인했다.

실습에서는 별도의 예제 디렉터리를 생성하고 파일을 만들어보았다.

cd ~/robot_ws/src
mkdir -p rqt_plugin_example
cd rqt_plugin_example
touch plugin.xml

파일이 생성되었는지 확인했다.

ls -l plugin.xml

plugin.xml은 RQt 플러그인의 정보를 등록하기 위한 설정 파일이다.

RQt 플러그인을 개발할 경우 플러그인의 이름이나 클래스, 라이브러리 등의 정보를 설정하는 데 사용된다.

이번 실습에서는 실제 RQt 플러그인을 개발하기보다는 plugin.xml 파일을 생성하고 그 역할을 확인하는 방식으로 진행했다.


11. 패키지 변경로그 파일 - CHANGELOG.rst

패키지의 변경 이력을 기록하기 위한 CHANGELOG.rst 파일도 생성했다.

cd ~/robot_ws/src/my_first_ros_rclpy_pkg
touch CHANGELOG.rst

그리고 다음과 같이 작성했다.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Changelog for package my_first_ros_rclpy_pkg
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.0.0 (2026-10-06)
------------------
* Initial package creation

CHANGELOG.rst는 패키지의 버전별 변경 사항을 기록하는 파일이다.

패키지가 업데이트될 때 어떤 변경이 있었는지 기록하여 버전 관리와 변경 이력을 확인하는 데 활용할 수 있다.


12. 라이선스 파일 - LICENSE

마지막으로 패키지의 라이선스를 명시하기 위한 LICENSE 파일도 생성했다.

touch LICENSE

LICENSE 파일은 패키지의 소스 코드와 관련된 사용 및 배포 조건을 명시하기 위해 사용된다.

또한 package.xml의 다음 항목과 실제 라이선스 정보를 일치시키는 것이 중요하다.

<license>TODO: License declaration</license>

현재 생성된 패키지에는 기본값인 TODO: License declaration이 들어 있으므로 실제 프로젝트에서는 사용할 라이선스를 결정한 후 해당 내용을 수정해야 한다.


13. 최종 빌드 확인

모든 설정 파일을 확인한 후 작업공간 전체를 다시 빌드했다.

cd ~/robot_ws
colcon build --symlink-install

앞에서 생성한 패키지들이 정상적으로 빌드되는 것을 확인했다.

Starting >>> my_first_ros_rclcpp_pkg
Starting >>> my_first_ros_rclpy_pkg
Starting >>> teleop_twist_joy

Finished <<< teleop_twist_joy
Finished <<< my_first_ros_rclcpp_pkg
Finished <<< my_first_ros_rclpy_pkg

Summary: 3 packages finished

이를 통해 패키지의 환경 설정과 빌드 설정이 정상적으로 적용되는 것을 확인할 수 있었다.


마무리

이번 실습에서는 ROS 2 패키지를 구성하는 다양한 파일의 역할을 확인했다.

C++ 패키지에서는 package.xml과 CMakeLists.txt를 통해 패키지 정보와 CMake 기반의 빌드 설정을 확인했고, Python 패키지에서는 package.xml, setup.py, setup.cfg를 통해 Python 기반의 패키지 설정 방법을 확인했다.

또한 plugin.xml을 통해 RQt 플러그인 설정 파일의 역할을 알아보고, CHANGELOG.rst와 LICENSE 파일을 직접 생성하여 패키지의 변경 이력과 라이선스 정보를 관리하는 방법도 확인했다.

ROS 2 패키지는 소스 코드뿐만 아니라 이러한 설정 파일들을 함께 구성하여 패키지의 의존성, 빌드 방법, 설치 방식 및 관리 정보를 체계적으로 관리한다는 점을 확인할 수 있었다.

0개의 댓글