Create a package [패키지 만들기]
ROS2에서 새로운 패키지를 만들려면 다음 단계를 따르면 됩니다.
1. 새로운 터미널 창을 열고 ROS 2 워크스페이스의 디렉토리로 이동합니다. 예를 들어, 다음과 같이 작성할 수 있습니다.
$ cd ~/ros2_ws/src
2. `ros2 pkg create` 명령어를 사용하여 새로운 패키지를 생성합니다. 패키지 이름은 소문자로 작성해야 하며, 여러 단어의 경우 하이픈(`-`)을 사용합니다. 예를 들어, `package_name`라는 이름의 패키지를 만들고 싶다면 다음과 같이 작성할 수 있습니다.
# CMake
ros2 pkg create --build-type ament_cmake <package_name>
# Python
ros2 pkg create --build-type ament_python <package_name>
3. '--node-name' 이라는 optional argument를 사용해서 실행가능한 excutable 만들 수 있습니다.
# CMake
ros2 pkg create --build-type ament_cmake --node-name my_node my_package
# Python
ros2 pkg create --build-type ament_python --node-name my_node my_package
4. 패키지를 생성한 후, 패키지 디렉토리로 이동합니다.
cd my_package
Build a package [패키지 빌드]
아래의 명령어처럼 workspace으로 이동 후 colcon을 이용해서 빌드합니다.
cd ~/ros2_ws/
colcon build
이전 튜토리얼에서 언급되었던 `ros_tutorials` 패키지도 `ros2_ws` 디렉토리에 있습니다. `colcon build` 명령어를 실행하면 `my_package` 패키지뿐만 아니라 `ros_tutorials` 패키지도 빌드됩니다. 패키지가 몇 개 없을 때는 방법도 괜찮지만, 패키지가 많을 경우 `colcon build`는 시간이 오래 걸립니다.
만약 `my_package` 패키지만 빌드하고 싶으면, 아래와 같이 입력하면 됩니다.
colcon build --packages-select my_package
`--packages-select` 옵션 다음에 빌드할 패키지의 이름을 지정합니다. 이렇게 하면 다른 패키지를 빌드하지 않고 필요한 패키지만 빌드할 수 있으므로, 빌드 시간을 절약할 수 있습니다.
Source the setup file [setup 파일 소스]
`source`는 Unix/Linux 환경에서 사용되는 명령어 중 하나로, 지정된 파일의 내용을 현재 셸(현재 명령어를 입력하는 터미널) 세션으로 가져와 적용되도록 하는 명령어입니다.
ROS에서 `source` 명령어를 사용하면 ROS에서 필요한 환경 변수, 함수 및 별칭을 현재 셸 세션에 설정할 수 있습니다. 이렇게 하면 ROS 명령어 및 도구를 사용할 수 있으며, ROS 시스템을 더 쉽게 사용할 수 있습니다.
`setup.bash` 파일에 `source` 명령어를 실행하면 파일에 포함된 환경 변수 및 함수를 현재 셸 세션으로 가져옵니다.
ROS 2에서 package와 executable을 사용하려면, 먼저 workspace를 초기화해야 하는데, 이를 위해 `setup.bash` 파일을 소스하는 것이 일반적입니다.
다음은 `setup.bash` 파일을 소스하는 방법입니다.
새로운 터미널 창을 열고 ROS 2 워크스페이스의 디렉토리로 이동 후, 'source' 명령어를 사용해서 'setup.bash' 파일을 소스합니다.
cd ~/ros2_ws/
source install/setup.bash
이제 ROS 2 package와 executable을 사용할 수 있습니다. ROS 2 명령어를 실행하기 전에 항상 `setup.bash` 파일을 소스해야 합니다.
Use the package [패키지 사용]
package를 사용하려면, 'ros2 run' 명령어를 이용해서 실행 가능한 노드 (executable)을 실행해야 합니다. 아래의 명령어처럼 실행해 보세요.
ros2 run my_package my_node
그러면 아래의 결과가 출력됩니다.
# CMake
hello world my_package package
# Python
Hi from my_package.
Examine package contents [패키지 내용]
ros2/src/my_package 로 가면, 아래의 폴더 및 파일들을 볼 수 있습니다.
# CMake
CMakeLists.txt include package.xml src
my_node.cpp는 src 디렉토리 안에 있습니다.
# Python
my_package package.xml resource setup.cfg setup.py test
my_node.py는 my_package 디렉토리 안에 있습니다.
Customize package.xml [package.xml 파일 편집]
`package.xml` 파일은 ROS2 패키지 메타데이터를 정의하는 XML 파일입니다. 패키지 메타데이터는 패키지의 이름, 버전, 저작자, 라이센스 등과 같은 정보를 포함합니다. `package.xml` 파일은 자동으로 세팅되지 않기 때문에, 개발자의 정보 및 개발한 패키지에 맞게 편집하여 정보를 수정하거나 추가하시면 됩니다.
다음은 `package.xml` 파일에서 편집할 수 있는 몇 가지 주요 요소입니다.
<name>: 패키지의 이름 정의
<version>: 패키지의 버전 정의
<description>: 패키지에 대한 간단한 설명 제공
<maintainer>: 패키지를 관리하는 사람의 이름과 이메일 정의
<license>: 패키지의 라이센스 정의
<author>: 패키지 작성자의 정보
<build_depend>: 패키지를 빌드하는데 필요한 다른 패키지들을 명시, 빌드 시스템이 패키지들을 빌드하기 위해 필요한 패키지들
<exec_depend>: 패키지를 실행하는데 필요한 다른 패키지들을 명시, 패키지가 실행되는데 필요한 라이브러리나 실행 파일을 제공하는 패키지
<depend>: 패키지가 의존하는 다른 ROS 패키지들을 명시합니다.
<export>: 패키지에서 노출하는 빌드, 실행, 테스트 및 설치 대상을 지정
# CMake
<?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>
# Python
<?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>
`package.xml` 파일은 패키지 메타데이터를 정의하는 중요한 파일이므로, 변경 사항을 적용할 때는 주의해서 작업해야 합니다. 필요한 경우, `catkin_make`나 `colcon build` 등을 실행하여 변경 사항이 올바르게 적용되는지 확인해야 합니다.
`setup.py` 파일은 Python 패키지를 빌드하고 설치하기 위한 스크립트 파일입니다. ROS 2의 `setup.py` 파일은 `setuptools`를 사용하여 패키지를 빌드하고 설치하는 방법을 정의합니다. `setuptools`는 Python 패키지를 쉽게 빌드하고 배포하기 위한 유틸리티 라이브러리입니다.
`setup.py` 파일은 일반적으로 패키지의 정보를 제공하는 `setup()` 함수를 포함합니다. 이 함수에는 패키지 이름, 버전, 작성자, 설명, 의존성 패키지 등의 정보가 포함됩니다.
ROS 2에서 `setup.py` 파일은 `setuptools`를 이용하여 빌드 및 설치 방법을 정의하고, `ament_python`을 이용하여 ROS 2 시스템과 Python 패키지를 통합합니다. `ament_python`은 `setuptools`를 이용하여 빌드된 Python 패키지를 ROS 2의 런타임 환경과 연결합니다.
ROS 2에서 `setup.py` 파일을 사용하여 Python 패키지를 빌드하고 설치하기 위해 다음과 같은 단계를 수행합니다.
1. `setup.py` 파일을 생성하고, 패키지의 이름, 버전 및 의존성 등의 정보를 제공합니다.
2. `setuptools`를 사용하여 패키지를 빌드합니다. 이 단계에서 패키지의 의존성을 확인하고, 필요한 의존성 패키지를 자동으로 다운로드하고 빌드합니다.
3. `ament_python`을 사용하여 빌드된 Python 패키지를 ROS 2 시스템에 통합합니다.
4. `colcon build` 명령어를 사용하여 패키지를 빌드하고, `colcon install` 명령어를 사용하여 패키지를 설치합니다.
이러한 단계를 수행하면 Python 패키지가 빌드되고 ROS 2 시스템과 통합되어 사용할 수 있는 상태가 됩니다.
# Python
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'
],
},
)
Summary
지금까지 우리는 코드를 정리하고 다른 사람들도 쉽게 사용할 수 있도록 패키지를 만들었습니다.
필요한 파일들이 자동으로 패키지에 포함되었고, 그 후에 colcon을 사용하여 패키지를 빌드하여 로컬 환경에서 실행 가능한 실행 파일을 생성했습니다.
이제 패키지에 의미있는 내용을 추가해봅시다. 간단한 publisher/subscriber 시스템을 만들어보겠습니다. 이를 C++ 또는 Python 중에서 선택하여 작성할 수 있습니다.
'Robotics > ROS2' 카테고리의 다른 글
ROS2 topic 1 [ROS2 토픽 1] (0) | 2023.05.14 |
---|---|
ROS2 Node [ROS2 노드] (2) | 2023.04.27 |
ROS2 Creating a package 1 [ROS2 패키지 만들기 1] (0) | 2023.04.24 |
ROS2 Creating a workspace [workspace 만들기] (0) | 2023.04.23 |
ROS2 ubuntu 20.04 ROS2 foxy Installation [ROS2 foxy 설치] (0) | 2023.04.21 |