티스토리 친구하기

본문 바로가기

Robotics/ROS2

ROS2 Creating a package 2 [ROS2 패키지 만들기 2]

728x90

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 중에서 선택하여 작성할 수 있습니다.

반응형