ROS2 packageの作成

ROS2でプログラミングするために勉強したメモです．
ここでは，packageの作成方法を書きます．

## packageに関する説明
packageは，Pythonとc++(CMake)で必要な構成要素が異なる．
### 構成に必要な要素
#### Python
- `package.xml`：packageに関するメタ情報を含むファイル．
- `setup.py`：packageのインストール方法の説明が含まれている．
- `setup.cfg`：packageに実行可能ファイルがある場合に求められる．このファイルのおかげで，`ros2 run`はpackageを見つけることができる．
- `<package_name>`：ROS 2ツールがパッケージを見つけるために使用するファイル

#### CMake
- `package.xml`：packageに関するメタ情報を含むファイル．
- `CMakeLists.txt`：package内のコードをビルドする方法が記述されたファイル．

### 例) workspaceの中のpackageの様子
```
workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

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


## packageの作成
**[Note]
以降は，Pythonについて記述する．必要に応じてC++(CMake)についても記述する．**

#### 


#### packageを作成

`<workspace_name>`のフォルダの中の，`src`フォルダでpackageを作成する．

```
ros2 pkg create --build-type ament_python <package_name>
```
nodeを作成する場合は，以下のコマンドを使用する．

```
ros2 pkg create --build-type ament_python --node-name <node_name> <package_name>
```
これで，`src`フォルダに新しい`<package_name>`のフォルダが追加されている．

#### packageをビルド
```
# workspaceのルートに移動
cd ~/dev_ws
# colconでビルド
colcon build
```
[Note]
上記のコマンドではすべてのpackageがビルドされてしまうので，長時間かかるデメリットがある．
特定のpackageだけをビルドする方法は以下のコマンドである．

```
colcon build --packages-select <package_name>
```

## 作成したpackageの編集

packageの説明とライセンス宣言は，packageをリリースする場合は必須となる．
#### `package.xml`ファイルを編集
```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>
```
ここで，

- `my_package`は`<package_name>`である．
- `<description>TODO: Package description</description>`にpackageの説明を
記述する．
- `<maintainer email="user@todo.todo">user</maintainer>`に名前とe-mailアドレスを記述する．
- `<license>TODO: License declaration</license>`にライセンス情報を記述する．
- `setup.py`の中にも同様の記載項目があり，`package.xml`と正確に一致させる必要がある．

```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,
   author='ROS 2 Developer',
   author_email='ros2@ros.com',
   maintainer='TODO',
   maintainer_email='TODO',
   keywords=['foo', 'bar'],
   classifiers=[
        'Intended Audience :: Developers',
        'License :: TODO',
        'Programming Language :: Python',
        'Topic :: Software Development',
   ],
   description='TODO: Package description',
   license='TODO: License declaration',
   tests_require=['pytest'],
   # Like the CMakeLists add_executable macro, you can add your python
   # scripts here.
   entry_points={
      'console_scripts': [
         'my_node = my_py_pkg.my_node:main'
      ],
   },
)
```
#### `setup.cfg`を編集する．

```setup.cfg
[develop]
script-dir=$base/lib/<package-name>
[install]
install-scripts=$base/lib/<package-name>
```

# 参考サイト
- https://index.ros.org/doc/ros2/Tutorials/Creating-Your-First-ROS2-Package/