ROS講座05 ROStools

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

| 項目 | 値 |
|:-:|:-:|
| 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を使ったプログラムでも同じことです。そのためにROSのためにはデバッグや解析のためのツールが多々あります。

今回紹介するコマンドは、ROSを実行しながら別のターミナルで実行します。今回は例としてROS講座04で使った以下のlaunchファイルを使います。

```xml:basic_lecture/launch/pub_sub1.launch
<launch>
  <node name="simple_talker"   pkg="basic_lecture" type="simple_talker" />
  <node name="simple_listener" pkg="basic_lecture" type="simple_listener" output="screen/>
</launch>
```

# rostopic
一番多用するコマンドが`rostopic`です。`rostopic`では名前の通り、ROSの中で流れているtopicを見ることができます。基本的にROSのデバッグはまずこれで行いますし、大体のデバッグは`rostopic`を見ると解決します。

## rostopic list
`rostopic list`と打つと現在のROSの中で流れているtopicの一覧を見ることができます。以下の`rostopic echo`や`rostopic pub`を見る前にtopic名を調べるときに多用します。

```shell:rostopic_listの結果
/chatter
/rosout
/rosout_agg
```

## rostopic echo
topicの中身を見ることができます。例えば/chatterというtopicを見るときは以下のように打ちます。topicの名前は必ず`/`から始まることに注意しましょう。topicをそのまま表示するので、例えば連続で1秒間に10回送ってくるtopicなら1秒間に10回表示されます。表示を止めたいときは`ctrl+C`を押します。

```shell:/chatterの中身を表示
rostopic echo /chatter
```

```shell:コマンドの結果（以下ずっと流れる）
data: "hello world!"
---
data: "hello world!"
---
data: "hello world!"
---
data: "hello world!"
---
```

もしtopicを1つだけ見たい場合は以下のように`-n 1`とつけます。

```shell:/chatterの中身を表示
rostopic echo /chatter -n 1
```

* 例えば`cmd_vel`のlinearのxだけ見たいときは`rostopic echo /chatter/data`とか`rostopic echo /cmd_vel/linear/x`とします。
* またpathのposeのような配列の0番目を見たいときは`rostopic echo /path/pose[0]`のように指定することもできます。 

## rostopic pub
`echo`の逆で任意のtopicを送信するのが`rostopic pub`です。`echo`に比べると頻度はだいぶ低いのですが、たまにデバッグで必要になるので覚えておきましょう。

```shell:/chatterに送信
rostopic pub -1 /chatter std_msgs/String "data: 'hello world!'" 
```

オプションの`-1`は1回だけの送信を表します。繰り返し送信したい場合、例えば10Hzで送信したい場合は`-r 10`とします（止めたいときは`ctrl+C`）。オプションの次の`/chatter`はROSのtopic名、次の`std_msgs/String`はROSのメッセージの型名です。これらはTabキーを押せば自動で補完されます。次の`"data: 'hello world!'"`はデータで、ここもTabキーで一部（`"data: ' '"`）が補完されます。

## rostopic info

```shell
rostopic info /chatter 
```

対象のtopicをpublishしているROSノード、subscribeしているROSノードの一覧を表示します。

# rosnode

## rosnode list
```shell
rosnode list
```
起動してるROSノードの一覧が表示されます。

## rosnode info
```shell
rosnode info /talker0 
```
対象のROSノードがpublish、subscribeしているtopicの一覧が表示されます。

# rosmsg
ROSツールのコマンドとして`rosmsg`があります。これはROSトピックの型であるROSメッセージの詳細を見ることのできるコマンドです。

## rosmsg list
システム中で登録されているROSメッセージのリストが表示されます。表示量が多いので適宜`rosmsg list | grep String`などとgrepしましょう。

## rosmsg show
特定のmsgの詳細が見れます。`rosmsg show std_msgs::String`のように使います。

# rqt_graph
```shell
rosrun rqt_graph rqt_graph
```

ROSノードとROSトピックの送受の関係をGUIで図示します。ROSが動いている時に別のターミナルで`rqt_graph`を実行すると以下のようなGUIが立ち上がります。丸の中はROSノードで矢印はROSトピックを表します。
![rqt_graph.png](https://qiita-image-store.s3.amazonaws.com/0/254442/e77faab9-340b-5e2b-8191-8e3d269d7802.png)
上記のような単純なROSなら必要はないですが、複雑になってくると便利です。しかし、あまりにも複雑なROSではこれを見ても仕方がないのでそんなには役に立ちませんが。

# コメント
ROSのデバッグとはROSノードとROSトピックが適正な状態になっているかを確認する作業です。実際のデバッグ作業ではまずこれでおかしいところを見つけれその後にROSノードの中身を調べるのが一般的です。

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