패키지 만들기
목표: CMake 또는 Python을 사용하여 새로운 패키지를 만들고 해당 실행 파일을 실행합니다.
배경 지식
1 ROS 2 패키지란 무엇인가요?
패키지는 ROS 2 코드의 구성 단위입니다. 코드를 설치하거나 다른 사람과 공유하려면 패키지에 코드를 구성해야 합니다. 패키지를 사용하면 ROS 2 작업을 배포하고 다른 사람이 쉽게 빌드하고 사용할 수 있게 됩니다.
ROS 2의 패키지 생성은 빌드 시스템으로 ament를 사용하고 빌드 도구로 colcon을 사용합니다. 공식으로 지원되는 CMake 또는 Python을 사용하여 패키지를 만들 수 있으며 다른 빌드 유형도 존재합니다.
2 ROS 2 패키지는 무엇으로 이루어져 있나요?
ROS 2 Python 및 CMake 패키지는 각각 자체 최소 요구 사항을 갖습니다.
패키지 내의 코드를 빌드하는 방법을 설명하는
CMakeLists.txt파일패키지의 공개 헤더를 포함하는
include/<패키지 이름>디렉터리패키지에 대한 메타 정보를 포함하는
package.xml파일패키지의 소스 코드를 포함하는
src디렉터리
패키지에 대한 메타 정보를 포함하는
package.xml파일패키지를 나타내는
resource/<패키지 이름>마커 파일패키지에 실행 파일이 있는 경우
ros2 run에서 실행 파일을 찾을 수 있도록 필요한setup.cfg패키지를 설치하는 방법을 설명하는
setup.py파일패키지를 찾기 위해 ROS 2 도구에서 사용하는 패키지 이름과 동일한 이름의 디렉터리 (
<패키지 이름>)로 사용되며,__init__.py를 포함합니다.
가장 간단한 패키지는 다음과 같은 파일 구조를 가질 수 있습니다.
my_package/
CMakeLists.txt
include/my_package/
package.xml
src/
my_package/
package.xml
resource/my_package
setup.cfg
setup.py
my_package/
3 작업 공간의 패키지
단일 작업 공간에 여러 패키지를 포함할 수 있으며 각 패키지는 자체 폴더에 있어야 합니다. 한 작업 공간에 다양한 빌드 유형의 패키지 (CMake, Python 등)를 가질 수 있습니다. 중첩된 패키지는 사용할 수 없습니다.
최상위 디렉토리를 “깔끔하게” 유지하기 위한 최선의 방법은 작업 공간 내에 src 폴더를 가지고 패키지를 만드는 것입니다.
간단한 작업 공간은 다음과 같을 수 있습니다.
workspace_folder/
src/
cpp_package_1/
CMakeLists.txt
include/cpp_package_1/
package.xml
src/
py_package_1/
package.xml
resource/py_package_1
setup.cfg
setup.py
py_package_1/
...
cpp_package_n/
CMakeLists.txt
include/cpp_package_n/
package.xml
src/
작업
1 패키지 만들기
먼저, ROS 2 설치 를 소스화하세요.
새 패키지를 위해 이전 튜토리얼 에서 생성한 작업 공간인 ros2_ws 를 사용합니다.
패키지 생성 명령을 실행하기 전에 src 폴더에 있는지 확인하세요.
cd ~/ros2_ws/src
ROS 2에서 새 패키지를 만드는 명령 구문은 다음과 같습니다.
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>
ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>
이 튜토리얼에서는 --node-name 옵션을 사용하여 패키지 내에서 간단한 “Hello World” 유형의 실행 파일을 만듭니다.
터미널에서 다음 명령을 입력하세요.
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name my_node my_package
이제 작업 공간의 src 디렉터리에 my_package 라는 새 폴더가 생겼을 것입니다.
명령을 실행한 후 터미널에 다음 메시지가 표시됩니다.
going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
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
going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['TODO: License declaration']
build type: ament_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source folder
creating folder ./my_package/my_package
creating ./my_package/setup.py
creating ./my_package/setup.cfg
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/my_package/__init__.py
creating folder ./my_package/test
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py
creating ./my_package/my_package/my_node.py
새 패키지의 자동으로 생성된 파일을 확인할 수 있습니다.
2 패키지 빌드
패키지를 작업 공간에 넣는 것은 colcon build 를 사용하여 한 번에 여러 패키지를 빌드할 수 있기 때문에 특히 가치가 있습니다.
그렇지 않으면 각 패키지를 개별적으로 빌드해야 합니다.
작업 공간의 루트로 이동하세요.
cd ~/ros2_ws
이제 패키지를 빌드할 수 있습니다.
colcon build
마지막 튜토리얼에서 ros2_ws 에 ros_tutorials 패키지가 있는 것을 기억하셨을 것입니다.
colcon build 를 실행하면 turtlesim 패키지도 빌드된 것을 볼 수 있을 것입니다.
작업 공간에 패키지가 몇 개 없을 때는 이러한 상황이 괜찮지만 패키지가 많을 때는 colcon build 가 오래 걸릴 수 있습니다.
다음에 my_package 패키지만 빌드하려면 다음 명령을 실행할 수 있습니다.
colcon build --packages-select my_package
3 설정 파일 소스화
새 패키지와 실행 파일을 사용하려면 먼저 새 터미널을 열고 주요 ROS 2 설치를 소스화하세요.
그런 다음 ros2_ws 디렉터리 내에서 다음 명령을 실행하여 작업 공간을 소스화합니다.
source install/local_setup.bash
작업 공간이 경로에 추가되었으므로 새 패키지의 실행 파일을 사용할 수 있게 됩니다.
4 패키지 사용
패키지 생성 중에 --node-name 인수를 사용하여 만든 실행 파일을 실행하려면 다음 명령을 입력하세요.
ros2 run my_package my_node
이 명령은 터미널에 메시지를 반환합니다.
hello world my_package package
Hi from my_package.
5 패키지 내용 검사
ros2_ws/src/my_package 내에서 ros2 pkg create 가 자동으로 생성한 파일과 폴더를 볼 수 있습니다.
CMakeLists.txt include package.xml src
my_node.cpp 는 src 디렉터리 내에 있습니다.
이곳은 향후 사용자 정의 C++ 노드를 모두 넣을 위치입니다.
my_package package.xml resource setup.cfg setup.py test
my_node.py 는 my_package 디렉터리 내에 있습니다.
이곳은 향후 사용자 정의 Python 노드를 모두 넣을 위치입니다.
6 package.xml 사용자 정의
패키지 생성 후 메시지에서 description 및 license 필드에 TODO 노트가 포함되어 있는지도 모릅니다.
이는 패키지 설명과 라이선스 선언이 자동으로 설정되지 않지만 패키지를 배포하려면 필요한 정보입니다.
maintainer 필드도 수동으로 작성해야 할 수 있습니다.
ros2_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="user@todo.todo">user</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>
<?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="user@todo.todo">user</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>
이메일 주소와 함께 maintainer 행에 이름을 입력하고 패키지를 요약하는 데 사용할 수 있는 description 행을 편집하세요.
<description>Beginner client libraries tutorials practice package</description>
그런 다음 license 행을 업데이트하세요.
오픈 소스 라이선스에 대해 더 자세히 알아보려면 여기 를 읽어보세요.
이 패키지는 연습용이므로 어떤 라이선스를 사용해도 안전합니다.
우리는 Apache License 2.0 을 사용할 것입니다.
<license>Apache License 2.0</license>
작업이 끝나면 반드시 저장하세요.
라이선스 태그 아래에는 _depend 로 끝나는 몇 가지 태그 이름이 있습니다.
여기에는 colcon이 검색할 패키지에 대한 package.xml 의 종속성이 나열됩니다.
my_package 는 간단하며 종속성이 없지만, 이 공간이 향후 튜토리얼에서 사용될 수 있음을 알게될 것입니다.
이제 모든 작업이 완료되었습니다!
setup.py 파일에는 package.xml 과 동일한 설명, 유지 관리자 및 라이선스 필드가 포함되어 있으므로 이를 일치시켜야합니다.
두 파일에서 정확하게 일치해야합니다. 또한 버전 및 이름 (package_name)은 정확하게 일치해야하며 두 파일에서 자동으로 채워집니다.
선호하는 텍스트 편집기를 사용하여 setup.py 를 엽니다.
from setuptools import setup
package_name = 'my_py_pkg'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='TODO',
maintainer_email='TODO',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_py_pkg.my_node:main'
],
},
)
maintainer, maintainer_email, 및 description 라인을 package.xml 과 일치하도록 편집하십시오.
파일을 편집한 후에는 저장을 잊지 마세요.
Summary
패키지를 만들어 코드를 구성하고 다른 사람들이 쉽게 사용할 수 있도록 만들었습니다.
패키지는 필요한 파일로 자동으로 채워져 colcon 을 사용하여 빌드하여 로컬 환경에서 해당 실행 파일을 사용할 수 있습니다.