[ROS2] ROS2 패키지 만들기
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와 일치하도록 편집 및 저장