ROS2 package

이준혁·2024년 12월 18일

ROS2

목록 보기
4/14

제가 작성하는 이 글은 제가 공부하기 위해 작성하고 제 학교 후배들에게 조금이라도 ros에 대해서 접하게 하고자 작성하게 되었습니다. 그러니 만약 틀린내용이나 그러니 제가 부족한 부분이 있을수 있으니 주의해주면서 봐주시면 감사하겠습니다 -Happy Lee-


py_test/

├── package.xml
├── py_test/
│ └── init.py

├── resource/
│ └── py_test

├── setup.cfg
├── setup.py

└── test/
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
여기는 이제 기본 패키지 부분입니다.


package.xml

  • 패키지 설정파일은 ros 패키지의 필수 구성요소로 패키지의 정볼를 기술하는 파일입니다.
  • 패키지 이름, 저작자, 라이선스, 의존성 패키지 등이 있다.
  • 이것에 colcon build를 수행하면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>py_test</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="happy@todo.todo">happy</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>
<?xml>

: 문서문법을정의하는문구로아래의내용은xml 버전1.0을따르고있다는것을알린다.

<package> 

: 이구문부터맨끝의 </package까지가 ROS 패키지설정부분이다. 세부사항으로format="3" 이라고패키지설정파일의버전을기재한다. ROS 2는3를사용하면된다.

<name> 

: 패키지의이름이다. 패키지를생성할때입력한패키지이름이사용된다. 다른옵션도마찬가지지만이는사용자가원할때언제든지변경할수있다.

 <version> 

: 패키지의버전이다. 자유롭게지정할수있는데나중에패키지를바이너리패키지로공개한다면버전관리에사용되므로신중할필요가있다.

 <description> 

: 패키지의간단한설명이다. 보통2~3 문장으로기술한다.

 <maintainer> 

: 패키지관리자의이름과이메일주소를기재한다.

<license> 

: 라이선스를기재한다. Apache 2.0, BSD, MIT, BoostSoftwareLicense, GPLv2, GPLv3, LGPLv2.1, LGPLv3, Proprietary등을기재하면된다.

 <url> 

: 패키지를 설명하는 웹페이지 또는 버그관리, 소스코드 저장소 등의 주소를 기재한다. 이종류에 따라 type에 website, bugtracker, repository를 대입하면 된다.

 <author> 

: 패키지 개발에 참여한 개발자의이름과 이메일주소를 적는다. 복수의 개발자가 참여한 경우에는 바로 다음줄에 <author 태그를이용하여추가로넣음

<buildtool_depend> 

: 빌드툴의의존성을기술한다.

<build_depend> 

: 패키지를 빌드할때 필요한 의존패키지 이름을 적는다.

 <exec_depend> 

: 패키지를 실행할 때 필요한 의존패키지 이름을 적는다.

 <test_depend> 

: 패키지를 테스트할 때 필요한 의존패키지 이름을 적는다.

 <export> 

: 위에서 명시하지 않은 확장태그명을 사용할때 쓰인다. 빌드타입을 적는<build_type>, RViz 플러그인에 사용되는 <rviz, RQt플러그인에 사용되는 <rqt_gui, deprecated 되는 패키지일 경우 유저에게 알릴 수 있는<deprecated 태그등이있다.

<depend>

: ROS 2 패키지가 실행되거나 빌드될 때 필요한 다른 패키지를 선언하는 데 사용됨(빌드 타임 의존성, 런타임 의존성, 테스트 의존성)


exec_depend> : 태그는 해당 ROS 패키지가 실행되기 위해 필요한 의존성을 지정하는데 사용


setup.cfg

  • 패키지의 메타데이터와 옵션을 보다 단순하고 명확한 형식으로 지정
  • setup.py에 비해 정적인 설정에 더 적합하고 복잡한 계산 불가

코드

[develop]
script_dir=$base/lib/py_test
[install]
install_scripts=$base/lib/py_test

develop
script_dir : 개발 모드에서 스크립트가 저장될 경로를 설정
$base : 설치의 기본 경로를 의미

install
install_scripts : 패키지를 설치할 때 스크립트가 저장될 경로를 설정합니다.
$base/lib/py_test : 설치 시 스크립트가 복사될 경로입니다.

setup.py

  • setup.py는 python 스크립트 파일로 패키지의 메타데이터와 설치 설정을 프로그레밍 방식으로 정의
  • 패키지 이름, 버전, 의존성 등을 동적으로 계산하거나 조건부 로직을 적용할수 있는 높은 유연성 제공
  • 다양한 패키지를 빌드 및 설치 명령어 사용가능

코드

from setuptools import find_packages, setup

package_name = 'py_test'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='happy',
    maintainer_email='happy@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)
name=package_name,
version='0.0.0',

name: 패키지의 이름입니다. 여기서는 py_test로 설정
version: 패키지 버전 (0.0.0은 기본 값으로 나중에 수정해야 함)

packages=find_packages(exclude=['test']),
data_files=[
    ('share/ament_index/resource_index/packages',
        ['resource/' + package_name]),
    ('share/' + package_name, ['package.xml']),
],

find_packages() : 프로젝트 디렉토리에서 패키지를 자동으로 찾아냄
(exclude=['test']: test 디렉토리를 제외)
data_files : ROS 2 관련 설정 파일을 설치할 위치를 정의
share/ament_index/resource_index/packages: ROS 2 패키지 인덱스용 파일 설치 경로
share/py_test: package.xml 파일을 설치할 경로

install_requires=['setuptools'], : 패키지를 설치할 때 필요한 의존성

zip_safe: 패키지를 .zip 형태로 설치할 수 있는지 여부를 지정

maintainer='happy',
maintainer_email='happy@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',

maintainer / maintainer_email: 패키지 유지 보수자의 이름과 이메일입니다.
description: 패키지에 대한 설명
license: 라이선스를 명시 (예: Apache-2.0 또는 MIT)

tests_require : 테스트에 필요한 종속성을 정의 (pytest를 사용하여 테스트를 실행함)

entry_points={
    'console_scripts': [
    ],
},

console_scripts: 패키지 설치 후 실행 가능한 스크립트를 정의
여기에 ROS 2 노드나 실행 가능한 Python 스크립트를 추가 가능


추가

DDS : 퍼블리시-서브스크라이브(pub-sub) 기반의 분산 데이터 통신 표준으로 그것을 담당함

RMW : DDS 구현체를 독립적으로 사용할 수 있도록 인터페이스를 제공합니다

profile
#자기공부 #틀린것도많음 #자기개발 여러분 인생이 힘들다 하더라도 그것을 깨는 순간 큰 희열감으로 옵니다~

0개의 댓글