---
description: '저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo'
---

# 패키지 만들기

## 개요

### 1. ROS2 패키지란 무엇입니까?

패키지는 ROS 2 코드의 컨테이너로 간주될 수 있습니다. 코드를 설치하거나 다른 사람과 공유하려면 패키지로 구성해야 합니다. 패키지를 사용하면 ROS 2 작업을 릴리스하고 다른 사람들이 쉽게 빌드하고 사용할 수 있습니다.

ROS 2에서 패키지 생성은 빌드 시스템으로 ament를 사용하고 빌드 도구로 colcon을 사용합니다. 공식적으로 지원되는 CMake 또는 Python을 사용하여 패키지를 만들 수 있지만 다른 빌드 유형이 존재합니다.

### 2. 무엇이 ROS2 패키지를 구성합니까?

ROS 2 Python 및 CMake 패키지에는 각각 고유한 최소 필수 콘텐츠가 있습니다.

#### cmake

* `package.xml`패키지에 대한 메타 정보를 포함하는 파일
* `CMakeLists.txt`패키지 내에서 코드를 빌드하는 방법을 설명하는 파일

#### Python

* `package.xml`패키지에 대한 메타 정보를 포함하는 파일
* `setup.py`패키지 설치 방법에 대한 지침 포함
* `setup.cfg`패키지에 실행 파일이 있는 경우 `ros2 run` 로 찾을 수 있습니다 .
* `<package_name>` 디렉토리에는 `__init__.py`이 포함됩니다.

가능한 가장 간단한 패키지는 다음과 같은 파일 구조를 가질 수 있습니다.

#### cmake

```
my_package/
     CMakeLists.txt
     package.xml
```

#### Python

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

**"본 교재에서는 Python을  기준으로 학습 합니다"**

### 3. 작업공간의 패키지

단일 작업 공간에는 각각 자체 폴더에 원하는 만큼 많은 패키지가 포함될 수 있습니다. 하나의 작업 공간(CMake, Python 등)에 다양한 빌드 유형의 패키지를 포함할 수도 있습니다. 패키지를 중첩할 수 없습니다.

가장 좋은 방법은 작업 공간 `src`내에 폴더를 만들고 거기에 패키지를 만드는 것입니다. 이렇게 하면 작업 공간의 최상위 수준이 "깨끗한" 상태로 유지됩니다.

간단한 작업 공간은 다음과 같습니다.

```
workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/package_2
      ...
      package_n/
          CMakeLists.txt
          package.xml
```

## 실습

### 1. 패키지 생성

먼저 [ROS 2 설치 소스를 찾습니다](https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Configuring-ROS2-Environment.html) .

[새 패키지에 대해 이전 자습서](https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Creating-A-Workspace/Creating-A-Workspace.html#new-directory) 에서 만든 `ros2_ws`작업 공간을 사용하겠습니다 .

패키지 생성 명령을 실행하기 전에 폴더 `src가` 있는지 확인하십시오 .

```
cd ~/ros2_ws/src
```

ROS 2에서 새 패키지를 생성하기 위한 명령 구문은 다음과 같습니다.&#x20;

```
ros2 pkg create --build-type ament_python --node-name my_node my_package
```

`src`이제 작업 공간 디렉토리 내에 이라는 새 폴더가 생겼습니다 `my_package`.

명령을 실행하면 터미널에서 다음 메시지를 반환합니다.

```
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
```

새 패키지에 대해 자동으로 생성된 파일을 볼 수 있습니다.

### 2. 패키지 빌드

작업 공간 루트에서 실행하여 한 번에 많은 패키지를 빌드할 수 있기 때문에 작업 공간에 패키지를 배치하는 것은 특히 유용합니다 . 그렇지 않으면 각 패키지를 개별적으로 빌드해야 합니다.`colcon build`

작업 공간의 루트로 돌아갑니다.

```
cd ~/ros2_ws
```

이제 패키지를 빌드할 수 있습니다.

```
colcon build
```

실행 중 `ros_tutorials`패키지도 빌드되었음을 알 수 있습니다 . 작업 공간에 몇 개의 패키지만 있으면 괜찮지만 패키지가 많으면 시간이 오래 걸릴 수 있습니다.

다음에 `my_package`패키지 만 빌드하려면 다음을 실행할 수 있습니다.

```
colcon build --packages-select my_package
```

### 3. install 파일 소싱

새 패키지와 실행 파일을 사용하려면 먼저 새 터미널을 열고 기본 ROS2 를 소싱하십시오.

그런 다음 디렉터리 내에서 `ros2_ws`다음 명령을 실행하여 작업 영역을 소싱합니다.

```
source install/local_setup.bash
```

이제 작업 영역이 경로에 추가되었으므로 새 패키지의 실행 파일을 사용할 수 있습니다.

### 4. 패키지 사용

패키지 생성 중 `--node-name`인수를 사용하여 생성한 실행 파일을 실행하려면 다음 명령을 입력합니다.

```
ros2 run my_package my_node
```

그러면 터미널에 메시지가 반환됩니다.

```
Hi from my_package.
```

### 5. 패키지 내용 확인

`ros2_ws/src/my_package`내부에는 `ros2 pkg create에 의해`자동으로 생성된 파일과 폴더가 표시됩니다.

```
my_package  package.xml  resource  setup.cfg  setup.py  test
```

my\_package 디렉토리 안에 my\_node.py 가있습니다 . 향후 모든 사용자 지정 Python 노드가  생성될위치입니다.

### 6. package.xml 사용자 지정

패키지를 만든 후 반환 메시지에서 필드 `description`및 `license TODO`가 포함되어 있음 을 알 수 있습니다. 패키지 설명과 라이센스 선언은 자동으로 설정되지 않지만 패키지를 릴리스하려는 경우 필요하기 때문입니다. `maintainer`필드 를 채워야 할 수도 있습니다.

원하는 텍스트 편집기를 사용하여 `ros2_ws/src/my_package/package.xml를`엽니다.

```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>

 <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>
```

`maintainer에`자동으로 입력되지 않은 경우 이름과 이메일을 라인에 입력하십시오 . 그런 다음 `description`행을 편집하여 패키지를 요약합니다.

```xml
<description>Beginner client libraries tutorials practice package</description>
```

그런 다음 `license`라인을 업데이트하십시오. [오픈 소스 라이선스에 대한 자세한 내용은 여기에서](https://opensource.org/licenses/alphabetical) 확인할 수 있습니다 . 이 패키지는 연습용이므로 모든 라이선스를 사용해도 안전합니다. 다음을 사용합니다. `Apache License 2.0`

```xml
<license>Apache License 2.0</license>
```

편집이 완료되면 저장하는 것을 잊지 마십시오.

라이센스 태그 아래에 `_depend`로 끝나는 일부 태그 이름이 표시됩니다 . 이것은 colcon이 검색할 수 있도록 `package.xml` 패키지에 대한 종속성을 나열하는 곳입니다. 현재는간단하고 종속성이 없지만 다음 자습서에서 이 공`my_package`간이 활용되는 것을 볼 수 있습니다.

`package.xml`파일에는 와 동일한 설명, 관리자 및 라이센스 필드가 포함되어 있으므로 `setup.py`도 동일하게설정해야 합니다. 두 파일에서 정확히 일치해야 합니다. 버전과 이름( `package_name`)도 정확히 일치해야  합니다.

`setup.py를`선호하는 텍스트 편집기로 엽니다 .

```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'
     ],
   },
)
```

일치하도록 `maintainer`, `maintainer_email`항목을편집합니다 .

파일을 저장하는 것을 잊지 마십시오.
