패키지

평범한컴공생·2022년 8월 8일
0

[ROS2]

목록 보기
14/19
post-thumbnail

배경

1. ROS 2 패키지

패키지는 ROS 2 코드의 컨테이너의 일종이라 볼 수 있다. 코드를 설치하고 싶거나 공유하고 싶을 때, 하나의 패키지로 구성해야 할 것이다.

이 때 ROS 2의 패키지를 사용하면 쉽게 배포, 사용할 수 있다.

2. 패키지 구성 요소

ROS 2의 Python, CMake 패키지는 각각 최소 요구 콘텐츠가 있다.

CMakePython
- package.xml은 패키지의 메타 데이터가 들어있다.

- CMakeList.txt는 패키지의 코드를 빌드 하는 방식이 들어있다.
- package.xml은 패키지의 메타 데이터가 들어있다.

- setup.py는 패키지를 설치하는 명령들이 포함되어 있다.

- setup.cfg는 패키지에 실행 가능한 파일이 있는 경우 ros2 run 명령을 수행하기 위해 필요한 파일이다.

- /<package_name>는 ROS 2 툴이 패키지를 찾는데 사용되는 패키지와 같은 이름을 가진 디렉터리로 __init__.py을 포함한다.
-CMake-
my_packages/
		CMakeLists.txt
		package.xml
-Python-
my_packages/
		setup.py
		package.xml
		resource/my_package

3. 워크스페이스 내 패키지

워크스페이스 내에서 원하는 만큼 패키지를 추가할 수 있다. 또한 서로 다른 빌드 방식을 가지는 패키지를 가질 수 있다.

workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/package_2
      ...
      package_n/
          CMakeLists.txt
          package.xml

작업

1. 패키지 생성하기

이전에 설정한 워크스페이스를 계속 사용하자.

cd ~/dev_ws/src	

새 패키지를 생성하는 명령어는 다음과 같다.

ros2 pkg create --build-type ament_cmake <package_name> # CMake 
ros2 pkg create --build-type ament_python <package_name> # Python

필자는 CMake를 사용하였다.
여기서는 간단한 Hello World격의 실행 파일을 만들어주는 인자 --node-name을 추가하였다.

ros2 pkg create --build-type ament_cmake my_package --node-name my_node

터미널에 다음과 같은 메시지가 출력되었다.

 --node-name my_node
going to create a new package
package name: my_package
destination directory: /home/jyp/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['jyp <jyp@todo.todo>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp

2. 패키지 빌드

워크스페이스의 루트 디렉터리로 이동하자.

cd ~/dev_ws/
colcon build

이전에 ros_tutorial 리포지토리를 내려받아 colcon build를 수행하면 turtlesim 패키지까지 빌드 된다. 패키지가 적을 경우에는 상관없겠지만, 많아질수록 빌드 하는데 점점 오랜 시간이 걸린다는 것을 유념하자.

my_package만 빌드 하고 싶다면 다음을 수행한다.

colcon build --packages-select my_package

3. 설정

새 터미널을 열고 dev_ws로 이동한 다음 명령을 수행하자.

. install/setup.bash

4. 패키지 사용하기

--node-name으로 생성한 노드를 실행해 보자.

ros2 run my_package my_node

터미널에 다음과 같은 메시지가 출력되었다.

필자는 CMake를 사용했기 때문에 Python을 사용한다면 출력이 달라질 수 있다.

hello world my_package package

dev_ws/src/my_pacakge를 확인해 보면, 다음과 같이 ros2 pkg create명령어를 통해 생성된 파일과 폴더를 볼 수 있다.

my_node.cppsrc디렉터리에서 확인할 수 있다.

CMakeLists.txt  package.xml
include         src

5. 사용자 정의 package.xml

패키지를 만드는 과정에서 description필드와 license필드 내에 TODO키워드가 있음을 파악했을 수 있다. 이는 description필드와 license필드가 자동으로 설정되는 것이 아니라 패키지를 배포하려면 필요한 것이기 때문이다.

maintainer필드도 마찬가지이다.

dev_ws/src/my_package안에 있는 package.xml을 열어 수정해 보자.

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

  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

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

maintainer에 필자의 이름과 메일 주소를 넣었고, description필드는 다음과 같이 수정하였다.

<description>Beginner client libraries tutorials practice package</description>

license에는 Apache License 2.0을 입력하였다.

<license>Apache License 2.0</license>
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>my_package</name>
  <version>0.0.0</version>
  <description>Beginner client libraries tutorials practice package</description>
  <maintainer email="mcleroysane19@inha.edu">mcleroysane19</maintainer>
  <license>Apache License 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

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

license밑에 존재하는 _depend로 끝나는 태그들은 colcon이 찾을 수 있도록 모든 의존성을 나열해 놓은 곳이다.

참고

ROS 2 Documentation: Foxy

profile
학부 연구생(220627~)

0개의 댓글