패키지는 ROS 2 코드의 컨테이너의 일종이라 볼 수 있다. 코드를 설치하고 싶거나 공유하고 싶을 때, 하나의 패키지로 구성해야 할 것이다.
이 때 ROS 2의 패키지를 사용하면 쉽게 배포, 사용할 수 있다.
ROS 2의 Python, CMake 패키지는 각각 최소 요구 콘텐츠가 있다.
CMake | Python |
---|---|
- 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
워크스페이스 내에서 원하는 만큼 패키지를 추가할 수 있다. 또한 서로 다른 빌드 방식을 가지는 패키지를 가질 수 있다.
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/package_2
...
package_n/
CMakeLists.txt
package.xml
이전에 설정한 워크스페이스를 계속 사용하자.
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
워크스페이스의 루트 디렉터리로 이동하자.
cd ~/dev_ws/
colcon build
이전에 ros_tutorial
리포지토리를 내려받아 colcon build
를 수행하면 turtlesim
패키지까지 빌드 된다. 패키지가 적을 경우에는 상관없겠지만, 많아질수록 빌드 하는데 점점 오랜 시간이 걸린다는 것을 유념하자.
my_package
만 빌드 하고 싶다면 다음을 수행한다.
colcon build --packages-select my_package
새 터미널을 열고 dev_ws
로 이동한 다음 명령을 수행하자.
. install/setup.bash
--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.cpp
는 src
디렉터리에서 확인할 수 있다.
CMakeLists.txt package.xml
include src
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
이 찾을 수 있도록 모든 의존성을 나열해 놓은 곳이다.