ROS2のコンポーネントの利用

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】
【前:[ROS2におけるコンポーネントの作成](https://qiita.com/NeK/items/775c0ddb4e10ed091068)】

[ROS2におけるコンポーネントの作成](https://qiita.com/NeK/items/775c0ddb4e10ed091068)などで使用したコンポーネントの利用方法について．

# コンポーネントの使い方
詳しくは[公式tutorial](https://index.ros.org/doc/ros2/Tutorials/)の[Composing multiple nodes in a single process](https://index.ros.org/doc/ros2/Tutorials/Composition/)の[Run the demos](https://index.ros.org/doc/ros2/Tutorials/Composition/#run-the-demos)を参考のこと．

## 共有ライブラリのように使用
main関数のあるターゲットを作成し，普通の共有ライブラリと同じように使用する．

## 簡単なコマンド一覧
`ros2 component -h` や `ros2 component load -h` などで詳しい情報を見ることが出来る．

### システムが見えているコンポーネント一覧を表示

```
$ ros2 component types
```

### コンポーネントをスタンドアロンで実行

```
$ ros2 component standalone [パッケージ名] [名前空間::クラス名]
```

例では以下の通り．

```
$ ros2 component standalone minimal_comp minimal_comp::MinimalCompNode1
```

### rclcpp_componentsによる実行
コンポーネントマネージャをterminal1で実行．terminal2でloadすることでterminal1で次々ロード・実行される．single threadなコンポーネントマネージャの実行の仕方は以下の通り．

```terminal:terminal1
$ ros2 run rclcpp_components component_container
```

multi threadなコンポーネントマネージャを実行したい場合は以下のようにする．
詳しくは[githubのrclcpp_componentsのソース](https://github.com/ros2/rclcpp/tree/master/rclcpp_components/src)を見ると分かりやすい．

```terminal:terminal1
$ ros2 run rclcpp_components component_container_mt
```


terminal2でコンポーネントマネージャを確認してみる．

```terminal:terminal2
$ ros2 component list
/ComponentManager
```

コンポーネントマネージャにnodeを追加する場合は以下のようにする．

```terminal:terminal2
$ ros2 component load [コンテナノード名] [パッケージ名] [名前空間::クラス名]
```

例では以下の通り．

```
$ ros2 component load /ComponentManager minimal_comp minimal_comp::MinimalCompNode1
```

実行するとコンポーネントマネージャを実行したterminal1に実行結果が出てくる．

#### コンテナノードのノード名・名前空間の変更
コンテナは普通のノードなのでノード名・名前空間を変えることができる．その場合コンポーネントのロードにも影響がある．
詳しくは[公式tutorial](https://index.ros.org/doc/ros2/Tutorials/)の[Composing multiple nodes in a single process](https://index.ros.org/doc/ros2/Tutorials/Composition/)の[Remapping container name and namespace](https://index.ros.org/doc/ros2/Tutorials/Composition/#remapping-container-name-and-namespace)を参考のこと．


### YAMLファイルの読み込み
<font color="Red">2020/7/24現在．模索中．以下ではできません．</font>

`ros2 component standalone` や `ros2 component load` でyamlの設定ファイルを読み込む方法．`-r __params:=[yamlファイルの指定]` かな？([参考](https://github.com/ros2/rclcpp/issues/715#issuecomment-489866554))

`./yaml/test.yaml` を読み込む場合，例えば以下の通り．

```
$ ros2 component load /ComponentManager minimal_comp minimal_comp::MinimalCompNode1 -r ./yaml/test.yaml
```

# rclcpp_components_register_nodes詳細
[公式githubの関係ページ](https://github.com/ros2/rclcpp/blob/master/rclcpp_components/cmake/rclcpp_components_register_node.cmake)では使用方法が以下のようになっている．

```
# usage: rclcpp_components_register_node(
#        <target> PLUGIN <component> EXECUTABLE <node>)
#
# :param target: the shared library target
# :type target: string
# :param PLUGIN: the plugin name
# :type PLUGIN: string
# :param EXECUTABLE: the node's executable name
# :type EXECUTABLE: string
# :param RESOURCE_INDEX: the ament resource index to register the components
# :type RESOURCE_INDEX: string
```

つまり，以下の書き方が正しいかもしれない．ちなみに，PLUGIN書いても書かなくても同じように動いた．

```
rclcpp_components_register_nodes([target名]
  PLUGIN "namespace::クラス名"
)
```

なお，デフォルトでついてくるジョイスティックを動かす用の[joyパッケージ](https://index.ros.org/p/joy/)では以下のようになっている．

```
rclcpp_components_register_node(joy
  PLUGIN "joy::Joy"
  EXECUTABLE joy_node)
```

このようにEXECUTABLEを指定することで実行するための名前を付けられるようである．
実際，以下のコマンドで起動できる．

```bash
$ ros2 run joy joy_node
```

ただ，EXECUTABLEについては自分のところでは出来ていない(2020/07/23)．