ROS講座04 roslaunch1

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
ROS講座03でROSの実行を行いましたが、簡単なROSの実行でもターミナルを3つ開かなくてはいけません。この方法では、今後もっと複雑な構成をとることを考えると実行が大変面倒です。
そのような場合には`roslaunch`を使用します。`roslaunch`では複数のROSノードを同時に立ち上げたり、複雑な設定をすることができます。

# launchファイルの記述
流儀としてROSパッケージ内の`launch/`ディレクトリにlaunchファイルを作成します。

```shell
cd ~/catkin_ws/src/ros_lecture/basic_lecture/launch
touch pubsub1.launch
```

以下のようなlaunchファイルを記述してみてください。XML形式で記述します。XMLでは開始タグ`<tag>`から閉じタグ`</tag>`までの間が1つの要素として扱われます。またタグの中に属性を`attribute="value"`の形式で書けます。空要素タグ`<tag/>`は単独で（つまり閉じタグ無しで）使えます。

```xml:basic_lecture/launch/pubsub1.launch
<launch>
  <node name="basic_simple_talker"   pkg="basic_lecture" type="basic_simple_talker" />
  <node name="basic_simple_listener" pkg="basic_lecture" type="basic_simple_listener" output="screen"/>
</launch>
```

nodeタグの中の

* pkgはそのROSノードが属するROSパッケージ名を書きます。
* typeはROSノードの元の名前を書きます。
* nameは自由につけることができる名前です。リネームすることができるので同じROSノードを名前を変えて2つ実行することもできます（これのメリットはまた後々書きます）。

# 実行1
各ターミナルごとに実行前に`source ~/catkin_ws/devel/setup.bash`を実行する必要があります。

```shell:launchの実行
roslaunch basic_lecture pubsub1.launch
```

この1行でROS講座03で実行したターミナル3つ分の処理が行えます。
しかしlistenerの分しか画面出力がされていません。roslaunchではnodeタグに`output="screen"`の属性を付けたノードのみ画面出力がされます。

```shell:launchの結果
user@ubuntu:~$ roslaunch basic_lecture pubsub1.launch 
... logging to /home/srs/.ros/log/afcc2554-5dc7-11e8-a707-000c297e7534/roslaunch-ubuntu-7245.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://ubuntu:39439/

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.13

NODES
  /
    simple_listener (basic_lecture/simple_listener)
    simple_talker (basic_lecture/simple_talker)

auto-starting new master
process[master]: started with pid [7255]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to afcc2554-5dc7-11e8-a707-000c297e7534
process[rosout-1]: started with pid [7268]
started core service [/rosout]
process[simple_talker-2]: started with pid [7275]
process[simple_listener-3]: started with pid [7286]
[ INFO] [1526997287.237937304]: I heard: [hello world!]
[ INFO] [1526997287.337150230]: I heard: [hello world!]
[ INFO] [1526997287.437157640]: I heard: [hello world!]
[ INFO] [1526997287.536618320]: I heard: [hello world!]
[ INFO] [1526997287.636732507]: I heard: [hello world!]
[ INFO] [1526997287.737866320]: I heard: [hello world!]
#この後も続く
```

# 実行2
以下のようなpubsub2.launchを書いて実行してみましょう。各ターミナルごとに実行前に`source ~/catkin_ws/devel/setup.bash`を実行する必要があります。

```xml:basic_lecture/launch/pubsub2.launch
<launch>
  <node name="basic_simple_talker"   pkg="basic_lecture" type="basic_simple_talker" output="screen"/>
  <node name="basic_simple_listener" pkg="basic_lecture" type="basic_simple_listener" output="screen"/>
</launch>
```

```shell:launchの実行
roslaunch basic_lecture pubsub2.launch
```

このようにすると`basic_simple_talker`と`basic_simple_listener`の両方の画面出力がターミナル上に出ます。

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)