rqt_graphの代わりにros2_graphを使ってtopic, service, actionの関係性を可視化する【ROS】

お疲れ様です。秋並です。

rqt_graphではrosのトピックの送受信の関係をグラフで可視化することができます。
これにより各ノード間でどのようなやり取りをしているかを確認できるためシステム全体を把握するときに大変便利なツールです。

<br>

一方で、rqt_graphには以下のようなデメリットも存在します。
- serviceを可視化できない
- actionは表示されるが、topicと同じように表示されるため、topicとactionの違いを見分けにくい

<br>

いいツールがないか探していたところ、「ros2_graph」というツールが公開されていたので、今回は、このros2_graphについて紹介します。

https://github.com/kiwicampus/ros2_graph

## 動作環境
- OS: ubuntu22.04 (on WSL2)
- ROS version: humble


# ros2_graphとは
ros2_graphとは、下図のようにノード間でやり取りされるtopic, service, actionの情報を可視化したグラフを生成するツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/0dbc6a66-e48f-94ed-9d38-24320dde2cd3.png)

## rqt_graphとros2_graphの比較

ros2_graphは、rqt_graphと比較して
- **serviceを可視化**できる
- **topicとactionを区別**して表示するため見やすい

といったメリットがあります。

<br>

一方で、以下のようなデメリットも存在します。
- topic, service, action以外の**tfやparamなどは可視化できない**（rqt_graphではできる）
- rqt_graphのように「更新ボタンを押して動的に確認」のようなことはできない。（**毎回ファイルとして出力する必要**がある）
- **ファイル出力に時間がかかる**（topicなどが多くなると数十分かかることも）

特に、tfトピックの流れは確認したい時も多いと思うので、その点は注意が必要です。

## ros2_graphのインストール
ros2_graphのインストール方法を解説します。

::: note
ros2_graphのリポジトリのREADMEにも記載されている内容です。
アップデートが入るなどしてインストール手順が変更される場合もあるので、以下の手順でエラーが発生した場合は、READMEを確認してください。
:::


ros2_graphをインストールします
```bash
pip install ros2-graph
```

<br>

グラフを画像として出力するために必要なパッケージをインストールします。
```bash
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install nodejs
npm install -g @mermaid-js/mermaid-cli
```

## ros2_graphを使ってみる。

インストールが完了したので、さっそくros2_graphを使ってみましょう。

今回は、`turtlesim`ノードと`teleop_turtle`ノードを起動し、その関係性をグラフに出力したいと思います。

<br>

最初に、`turtlesim`ノードと`teleop_turtle`ノードを起動します。
```bash
ros2 run turtlesim turtle_teleop_key
```

```bash
ros2 run turtlesim turtlesim_node
```

<br>

次に、ros2_graphを実行します。
```
ros2_graph /turtlesim /teleop_turtle -o ./turtle_node_graph --outputFormat svg
```

::: note
上記コマンドを一般化すると以下のようになります
```bash
ros2_graph /ノード1 /ノード2 ... -o 出力ファイル名 --outputFormat 出力ファイル形式
```
なお、 `--outputFormat`オプションがない場合、mdファイルとして、mermaid記法のグラフが出力されます。
:::

<br> コマンドが実行されると、`turtle_node_graph.svg`という名称の以下のような画像ファイルが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/0dbc6a66-e48f-94ed-9d38-24320dde2cd3.png)



# 複数のノードを含むグラフを簡単に生成する

ros2_graphでは、以下コマンドのように、グラフを出力したいノードを一つずつ記載していく必要があります。
```bash
ros2_graph /ノード1 /ノード2 ... -o 出力ファイル名
```

<br>

しかし、ノードの数が多くなると全てのノードをこの形式で記述するのは面倒です。

そこで、ここからは「複数のノードを含むグラフを簡単に生成する方法」を紹介します。
## <font color="red">全てのノード間の関係性を示したノードグラフ</font>を出力

最初に、「全てのノード間の関係性を示したノードグラフ」を出力する方法を紹介します。

この方法は、**システム全体のノードの関係性を確認したい**場合などに有効です。


<br>

以下コマンドを実行すると、「全てのノード間の関係性を示したノードグラフ」がsvgファイルとして出力されます。

```bash
ros2_graph $(ros2 node list) -o ＜出力するsvgファイルのファイル名＞ --outputFormat svg
```

<br>

`/turtlesim`ノードと、`/teleop_turtle`ノードを起動している場合は、以下のようなノードグラフが出力されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/0dbc6a66-e48f-94ed-9d38-24320dde2cd3.png)

::: note
timeoutのエラーが発生した場合は、以下コマンドでros2 daemonを起動しなおしてください。
```bash
ros2 daemon start
```
:::


<br>


## <font color="red">各ノードを中心としたノードグラフ</font>を、それぞれのノードごとに出力

次に、「各ノードを中心としたノードグラフを、それぞれのノードごとに出力」する方法を紹介します。

この方法は、**ノードの数が多く、1つの図にまとめてしまうと、グラフが複雑で見づらい**場合などに有効です。

<br>

最初に、以下のbashファイルを`ros2_graph.bash`という名前で作成します。

```bash
nodes=$(ros2 node list)

dir_path=$1
for node in $nodes; do
    node_without_slash=$(echo $node | sed 's/^\///')
    ros2_graph $node -o ${dir_path}/${node_without_slash} --outputFormat svg
done
```

<br>

次に、作成したbashファイルの権限を変更します。
```bash
sudo chmod 666 ros2_graph.bash
```

<br>

最後に、bashファイルを実行します
```bash
bash ros2_graph.bash <出力先ディレクトリまでのパス>
```
これで、各ノードを中心としたノードグラフが、それぞれのノードごとにsvgファイルとして出力されます。

::: note
例えば、`~/hoeg`というディレクトリに出力したい場合は、以下になります
```bash
bash ros2_graph.bash ~/hoge
```
:::

<br>

`/turtlesim`ノード、`teleop_turtle`ノードの2種類のノードを起動している場合は、以下二つのsvgファイルが出力されます。

- `/turtlesim`ノードを中心としたノードグラフ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/a62f5be0-8aff-d19e-169d-95873fd8278e.png)

- `teleop_turtle`ノードを中心としたノードグラフ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/3bc3d7ff-0363-a5a4-63e6-90b200c145ec.png)

# さいごに
今回は、ros2_graphの使い方を紹介しました。