ROS2 launchの使用

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】

# 概要
ros2 launchの使い方について．

1. ノードを準備
1. launchファイルを準備
1. launchファイル使用のための設定
1. colcon build
1. 使用可に！

## launchで実行するnodeについて
いくつかパターンがあるので羅列しつつ，本ページで例題として使用する名前を以下のように付与．


* パッケージ名: nek_pkg
* ノードがpythonの場合
    * target名, entry point: nek_target
    * node名: nek_node
* ノードがC++の場合
    * target名: nek_target
    * node名: nek_node
* yamlファイル
    * config/nek.yaml
* launchファイル
    * launch/nek_launch.py
        * launchファイルは後ろに`_launch`をつけることとなっている．

# 詳細
ノードのプログラミングは出来てるものとする．
yamlは`config/`ディレクトリに，launchyファイルは`launch/`ディレクトリに保存することとするので，最初に作っておく．
またyamlファイルの中身については[YAMLファイルによるROS2のパラメータ設定](https://qiita.com/NeK/items/15bf1e657d8d694592ed)あたりを参考に．

## launchファイルの準備
### 一般的なもの

```py:launchy/nek_launchy.py
from launch import LaunchDescription
from launch_ros.actions import Node
import os

pkg_name1 = 'nek_pkg'

def generate_launch_description():
    ld = LaunchDescription()

    config1 = os.path.join(
        pkg_name1,
        'config',
        'nek.yaml'
    )

    node1 = Node(
        package=pkg_name1,
        executable='nek_target',
        name='nek_node',
        output='screen',
        emulate_tty=True,
        parameters=[config1]
    )

    ld.add_action(node1)
# 複数ノードを追加する場合は，configN,nodeNを作ってld.add_action(nodeN)?

    return ld
```

### コンポーネントノードの場合

[Using ROS 2 launch to launch composable nodes]を参照．気が向いたらそのうち書く．

## launchファイル使用のための設定
### ノードがPyhtonの場合
[Using parameters in a class (Python)]通り，`setup.py`の中の`datafiles`項に加える．それに伴って`os`と`glob`を`import`する．

```py:setup.py
import os
from glob import glob
# ...

setup(
  # ...
  data_files=[
      # ...
      (os.path.join('share', package_name), glob('launch/*launch.[pxy][yma]*')),
    ]
  )
```

### ノードがC++の場合
[ROS2 YAML For Parameters]を参考に，`CMakeLists.txt`に加える．ただし，`config`に関する部分はいらない(参考ページとの整合性のためコメントアウトにしているがいらない．詳しくは[参考](#参考)の部分を参照のこと．)

```cmake:CMakeLists.txt
...
install(DIRECTORY
  launch
  DESTINATION share/${PROJECT_NAME}
)
#install(DIRECTORY
#  config
#  DESTINATION share/${PROJECT_NAME}
#)
...
```

## 実行
ビルド，`. install/local_setup.bash`後，以下のコマンドで実行．

```bash:
$ ros2 launch nek_pkg nek_launch.py
```






# 参考

* ROS2 公式のページ
    * [Launch]
        * [Integrating launch files into ROS 2 packages]
    * [Using parameters in a class (Python)]
    * [Using ROS 2 launch to launch composable nodes]
* [ROS2 YAML For Parameters]
    * launchにyaml(パラメータ用)を組み込むための良い情報源
    * 上記ページではlaunchファイル用のディレクトリとyaml用のディレクトリの設定をsetup.py, CMakeLists.txtに組み込んでいるが，本ページではyaml用の設定はしない．
        * ここで組み込むと実体が`install/.../share/...`にコピーされてそちらを用いることとなる．つまり，変更するとビルドをして`install/.../share/...`のアップデートが必要となる．しかしyamlファイルは気軽に使いたいので，yamlファイルの中身(パラメータ)を書き換えるたびビルドするのは面倒．なので本ページではlaunchファイルのみ設定している．

[Integrating launch files into ROS 2 packages]:https://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Launch-system.html
[Using parameters in a class (Python)]:https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Using-Parameters-In-A-Class-Python.html
[ROS2 YAML For Parameters]:https://roboticsbackend.com/ros2-yaml-params/
[Using ROS 2 launch to launch composable nodes]:https://docs.ros.org/en/humble/How-To-Guides/Launching-composable-nodes.html
[Launch]:https://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Launch-Main.html