IoT

[ROS2] ROS2 패키지 만들기

김과분 2023. 12. 13. 17:37
728x90

참고 자료: https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html

 

Creating a package — ROS 2 Documentation: Foxy documentation

Inside ros2_ws/src/my_package, you will see the files and folders that ros2 pkg create automatically generated: CMakePython CMakeLists.txt include package.xml src my_node.cpp is inside the src directory. This is where all your custom C++ nodes will go in t

docs.ros.org

 

ROS2 패키지 : 하나 이상의 노드가 기능적 단위로 묶인 ROS2 코드의 컨테이너

  • 코드 설치 및 다른 사람과 공유 위함
  • 작업 release & 다른 사람들이 쉽게 빌드 및 사용 가능

패키지 생성?

  • 빌드 시스템 : ament, 단일 패키지 빌드 시 사용
    • C++ : CMake 기반 ament_cmake
    • Python : ament_python
  • 빌드 도구(툴) : colcon, 전체 패키지 빌드 시 사용

패키지 구성

CMake 패키지

  • CMakeLists.txt 패키지 내에서 코드를 빌드하는 방법을 설명하는 파일
  • include/<package_name> 패키지의 공개 헤더가 포함된 디렉터리
  • package.xml 패키지에 대한 메타 정보가 포함된 파일
  • src 패키지의 소스 코드가 포함된 디렉터리

간단한 파일 구조 예

my_package/
     CMakeLists.txt
     include/my_package/
     package.xml
     src/

⭐ Python 패키지

  • package.xml 패키지에 대한 메타 정보가 포함된 파일
  • resource/<package_name> 패키지의 마커 파일
  • setup.cfg 패키지에 실행 파일이 있을 때 필요하므로 ros2 run가 찾을 수 있습니다.
  • setup.py 패키지 설치 방법에 대한 지침이 포함되어 있습니다.
  • <package_name> 패키지를 찾기 위해 ROS 2 도구가 사용하는 패키지와 동일한 이름을 가진 디렉터리에는 __init__.py이 포함됩니다.

간단한 파일 구조 예시

my_package/
      package.xml
      resource/my_package
      setup.cfg
      setup.py
      my_package/

다양한 빌드 유형의 패키지 but, 중첩된 패키지 가질 수 없음

→ 작업 공간 내에 폴더 생성, 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/

작업 (Linux, Python)

0. 작업 공간 내의 새 디렉터리 생성 및 사용

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

1. 새 패키지 생성

ros2 pkg create [패키지 이름] --build-type [빌드 타입]

#example
ros2 pkg create my_package --build-type ament_python --node-name my_node

#명령 실행 후 터미널 메시지 -> 새 패키지에 대해 파일 자동 생
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

--node-name 패키지에 간단한 Hello World 유형 실행 파일을 생성하는 선택적 인수를 사용합니다 .

2. 패키지 구축

작업 영역 루트에서 colcon build 실행 → 한번에 많은 패키지 빌드 가능

→ 작업 영역 내에 패키지 넣는 것이 유용

cd ~/ros2_ws #작업 공간 루트로 돌아가기
colcon build #패키지 빌드

but, colcon build의 경우, 특정 패키지가 아닌 생성한 모든 패키지를 빌드함

colcon build --packages-select my_package

3. setup 파일 얻기

새 터미널 열고 기본 ROS2 설치 → 새 패키지 및 실행 파일 사용 가능

디렉터리 내부 ros2_ws 명령 실행 → 작업공간 sourcing

source install/local_setup.bash

4. 패키지 사용

ros2 run <package_name> <executable_name> #기본 문법
ros2 run my_package my_node #인수 사용하여 생성한 실행파일 실행

#실행 결과
Hi from my_package.

5. 패키지 내용물 검사

#ros2_ws/src/my_package 내부 : 파일 및 폴더 확인 (by. ros2 pkg create)
my_package  package.xml  resource  setup.cfg  setup.py  test
#my_node.py : my_package 디렉터리 내부에 존재 -> 파이썬 노드 커스텀 가능

6. package.xml 사용자 정의

ros2_ws/src/my_package 에서 원하는 텍스트 편집기 사용하여package.xml 열기

# package.xml

http://download.ros.org/schema/package_format3.xsd>"
   schematypens="<http://www.w3.org/2001/XMLSchema>"?>

 my_package
 0.0.0
 TODO: Package description
 user
 TODO: License declaration

 ament_copyright
 ament_flake8
 ament_pep257
 python3-pytest

 
   ament_python
 


#이름과 이메일 X -> 입력 및 저장
Beginner client libraries tutorials practice package
#license 행 업데이트 및 저
Apache License 2.0

setup.py와 package.xml → 동일한 설명, 관리자 및 라이센스 필드여야 함

→ setup.py파일의 버전, 이름(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와 일치하도록 편집 및 저장

728x90