패키지란?
패키지는 ROS에서 실행될 코드를 담고 있는 공간입니다. 앞서 올린 작업공간 게시글에서 소스 파일과 비슷한 것이라 하였는데, 그것은 이 패키지가 사실상 코어 역할을 하고 있기 때문입니다. Visual Studio로 비유하자면 Hello world!
를 출력하는 프로그램을 C언어로 작성했다고 합시다. 프로젝트(dev_ws)을 만들고 그 안의 소스 파일 폴더(src)안에 helloworld.cpp 소스 파일(패키지)을 만들면 결국 Hello world!
출력은 helloworld.cpp 파일이 하는 것입니다. 작업공간과 패키지 역시 같습니다. 작업공간도 패키지가 돌아갈 환경을 마련해 줄 뿐, 실제 operation은 패키지가 다 합니다. 따라서 어떤 부품을 사용하려 할때 그 부품에 맞는 패키지를 다운받아 사용하면, 우리가 직접적으로 코드를 짜는 일이 현저히 줄어듭니다. 이 Tutorial 게시글에는 간단한 예시로 패키지를 체험해 볼 뿐이지만, 직접 사용할 때는 디바이스와 연동하여 사용할 것입니다.
패키지 사용방법
1. 패키지 생성
패키지를 생성하는 방법은 다음과 같습니다. 사용할 언어에 따라서 명령어가 조금 달라집니다.
C++(cmake):
ros2 pkg create --build-type ament_cmake <패키지 이름>
Python:
ros2 pkg create --build-type ament_python <패키지 이름>
패키지는 src 폴더에 저장되어야 하므로 우선 src 폴더로 이동한 후 명령어를 실행해 줍시다. 저는 파이썬을 기준으로 예시를 들겠습니다.
$ cd ~/dev_ws/src
$ ros2 pkg create --build-type ament_python --node-name my_node my_package
src 폴더를 보면 my_package
라는 폴더가 생성되었을 것입니다.
2. colcon build
패키지를 작업공간에서 사용하기 위해서 colcon build
명령어로 빌드해 줍시다.
또는 colcon build
의 --packages-select
명령어를 사용하여 지정한 패키지만 빌드할 수도 있습니다.
$ colcon build --packages-select my_package
3. colcon ws setup.bash 파일 소싱
작업공간의 setup.bash 파일을 소싱해 줍시다. 이 작업은 오버레이(덧씌우기)하여 가장 최신 작업 상태의 작업공간을 적용하는 과정입니다.
작업공간 내의 파일을 수정했다면 그때마다 실행해 줍시다.
4. 노드 실행해보기
ROS2의 패키지는 기본적으로 테스트 노드가 같이 생성됩니다. 이미 패키지 생성&빌드를 완료했으니 테스트 노드를 실행해 봅시다.
$ ros2 run my_package my_node
실행결과는 다음과 같습니다.
언어에 따른 패키지 폴더 살펴보기
위에서 말했듯 ROS2는 C++과 파이썬 두 언어로 빌드할 수 있습니다. 위의 예시는 파이썬을 실행한 결과입니다. 각각의 경우 ros2 pkg create
가 생성해 주는 패키지의 생김새를 살펴봅시다.
1. C++(Cmake 빌드)
dev_ws/src/my_package
폴더의 내용물은 이렇습니다.
$ cd dev_ws/src/my_package
$ ls
CMakeLists.txt include package.xml src
C++로 짠 노드 파일은 src
폴더 안에 저장됩니다. 실제로 기본적으로 생성된 테스트 노드가 들어 있습니다.
2. Python
마찬가지로 위의 명령어를 실행하면 내용물은 다음과 같습니다.
$ cd dev_ws/src/my_package
$ ls
my_package package.xml resource setup.cfg setup.py test
Python으로 짠 노드 파일은 my_package
폴더 안에 저장됩니다. C++과는 다르게 노드 파일 폴더의 이름이 패키지 이름과 같습니다.
package.xml 파일
package.xml 파일에는 패키지에 대한 간단한 설명과 의존성 정보가 들어 있습니다. 설명은 패키지 실행에 아무 영향을 주지 않지만 정보를 위해 작성합니다. 각 언어에 따라서 package.xml의 생김새가 다릅니다.
1. C++(Cmake 빌드)
C++패키지의 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>
초반부는 패키지의 내용을 설명하는 부분입니다. 패키지의 이름이나, 작성자, 설명, 이메일, 라이센스의 정보를 담을 수 있습니다. 내맘대로 수정해 봅시다.
<name>my_package</name>
<version>1.0.0</version>
<description>Beginner client libraries tutorials practice package</description>
<maintainer email="bhbhchoi@gmail.com">user</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>
의존성을 추가하면 이곳에 같이 추가해 줘야 합니다.
2. Python
Python 패키지의 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_python</buildtool_depend>
<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>
C++의 package.xml 파일과 거의 비슷하지만 의존성 부분이 조금 다릅니다. 패키지 내용과 의존성 추가 편집 방법 역시 C++ 패키지와 같습니다. 하지만 Python 패키지에서는 package.xml 파일을 수정할 때 고쳐줘야 할 파일이 하나 더 있습니다. 바로 setup.py 파일입니다. 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'
],
},
)
이 파이썬 코드에서 16~19줄을 package.xml 파일의 내용에 맞게 고치면 됩니다.
maintainer='bhbhchoi',
maintainer_email='bhbhchoi@gmail.com',
description='Beginner client libraries tutorials practice package',
license='Apache License 2.0',
이런 식으로 말이죠. 이미 maintainer와 maintainer_email은 본인에 맞게 되어 있을 것입니다.
마무리
다음 시간에는 퍼블리셔&서브스크라이버 노드를 직접 작성해 보겠습니다.
참고 사이트
ROS Index-ROS2 튜토리얼 패키지 생성편
Refstop
Deep Learning 및 SLAM을 공부하고 있습니다.
Comments