お疲れ様です。秋並です。
rqt_graphではrosのトピックの送受信の関係をグラフで可視化することができます。
これにより各ノード間でどのようなやり取りをしているかを確認できるためシステム全体を把握するときに大変便利なツールです。
一方で、rqt_graphには以下のようなデメリットも存在します。
- serviceを可視化できない
- actionは表示されるが、topicと同じように表示されるため、topicとactionの違いを見分けにくい
いいツールがないか探していたところ、「ros2_graph」というツールが公開されていたので、今回は、このros2_graphについて紹介します。
動作環境
- OS: ubuntu22.04 (on WSL2)
- ROS version: humble
ros2_graphとは
ros2_graphとは、下図のようにノード間でやり取りされるtopic, service, actionの情報を可視化したグラフを生成するツールです。
rqt_graphとros2_graphの比較
ros2_graphは、rqt_graphと比較して
- serviceを可視化できる
- topicとactionを区別して表示するため見やすい
といったメリットがあります。
一方で、以下のようなデメリットも存在します。
- topic, service, action以外のtfやparamなどは可視化できない(rqt_graphではできる)
- rqt_graphのように「更新ボタンを押して動的に確認」のようなことはできない。(毎回ファイルとして出力する必要がある)
- ファイル出力に時間がかかる(topicなどが多くなると数十分かかることも)
特に、tfトピックの流れは確認したい時も多いと思うので、その点は注意が必要です。
ros2_graphのインストール
ros2_graphのインストール方法を解説します。
ros2_graphのリポジトリのREADMEにも記載されている内容です。
アップデートが入るなどしてインストール手順が変更される場合もあるので、以下の手順でエラーが発生した場合は、READMEを確認してください。
ros2_graphをインストールします
pip install ros2-graph
グラフを画像として出力するために必要なパッケージをインストールします。
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
ノードを起動し、その関係性をグラフに出力したいと思います。
最初に、turtlesim
ノードとteleop_turtle
ノードを起動します。
ros2 run turtlesim turtle_teleop_key
ros2 run turtlesim turtlesim_node
次に、ros2_graphを実行します。
ros2_graph /turtlesim /teleop_turtle -o ./turtle_node_graph --outputFormat svg
上記コマンドを一般化すると以下のようになります
ros2_graph /ノード1 /ノード2 ... -o 出力ファイル名 --outputFormat 出力ファイル形式
なお、 --outputFormat
オプションがない場合、mdファイルとして、mermaid記法のグラフが出力されます。
コマンドが実行されると、turtle_node_graph.svg
という名称の以下のような画像ファイルが出力されます。
複数のノードを含むグラフを簡単に生成する
ros2_graphでは、以下コマンドのように、グラフを出力したいノードを一つずつ記載していく必要があります。
ros2_graph /ノード1 /ノード2 ... -o 出力ファイル名
しかし、ノードの数が多くなると全てのノードをこの形式で記述するのは面倒です。
そこで、ここからは「複数のノードを含むグラフを簡単に生成する方法」を紹介します。
全てのノード間の関係性を示したノードグラフを出力
最初に、「全てのノード間の関係性を示したノードグラフ」を出力する方法を紹介します。
この方法は、システム全体のノードの関係性を確認したい場合などに有効です。
以下コマンドを実行すると、「全てのノード間の関係性を示したノードグラフ」がsvgファイルとして出力されます。
ros2_graph $(ros2 node list) -o <出力するsvgファイルのファイル名> --outputFormat svg
/turtlesim
ノードと、/teleop_turtle
ノードを起動している場合は、以下のようなノードグラフが出力されます。
timeoutのエラーが発生した場合は、以下コマンドでros2 daemonを起動しなおしてください。
ros2 daemon start
各ノードを中心としたノードグラフを、それぞれのノードごとに出力
次に、「各ノードを中心としたノードグラフを、それぞれのノードごとに出力」する方法を紹介します。
この方法は、ノードの数が多く、1つの図にまとめてしまうと、グラフが複雑で見づらい場合などに有効です。
最初に、以下のbashファイルをros2_graph.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
次に、作成したbashファイルの権限を変更します。
sudo chmod 666 ros2_graph.bash
最後に、bashファイルを実行します
bash ros2_graph.bash <出力先ディレクトリまでのパス>
これで、各ノードを中心としたノードグラフが、それぞれのノードごとにsvgファイルとして出力されます。
例えば、~/hoeg
というディレクトリに出力したい場合は、以下になります
bash ros2_graph.bash ~/hoge
/turtlesim
ノード、teleop_turtle
ノードの2種類のノードを起動している場合は、以下二つのsvgファイルが出力されます。
さいごに
今回は、ros2_graphの使い方を紹介しました。