ROSのrqt_graphで出力されるノードグラフっぽいものを、dot言語で作成するときのサンプル。
dot言語で書く理由
「rqt_graphでノードグラフを自動で作成できるのに、なぜわざわざ手書きをするのか」という当然の疑問に対する答えとして、以下のケースを挙げておきます。
- 実装前の設計時に、どうしても綺麗なノードグラフを書く羽目になってしまった。
- 実装はし終わったがnodeletを使っていたため、
rqt_graph
で出力されるノードグラフの可読性が低くなってしまった。- (2019/1/27追記) nodelet managerを使わずに,各ノードレットをstand aloneで起動させれば,rqt_graph内で通常のノードと同じように描画されることに気づきました。なので,後者の場合はノードグラフ描画のためにlaunchファイルを別途作ったほうが早そうです。
また、dot言語はテキストで作図できるため、gitなどで差分管理がしやすく、設計変更時に必要な労力を下げることができます(plant-UMLと同じ哲学です)。dot言語を知らないという方はここなどを見てください。
ちなみに,rqt_graphの画面の右上あたりのボタンから,図をdotファイルとして出力できます。
環境構築のメモ書き
- 環境構築とか面倒という私みたいな方は、GraphvizOnlineを使ってブラウザで作業できます。本記事の図もGraphvizOnlineで作成しました。
- Visual Studio Codeだと、VSCodeとGraphvizでテキストからグラフ生成
が参考になりそうです。 - DotEditorというGUIアプリでDot言語を扱えるソフトもあります。DotEditorで分散ソフトのノードグラフを書く
が参考になります。
ノードグラフのサンプル
ここではhttp://wiki.ros.org/rqt_graph に出てくる以下の図に相当するグラフをdot言語で書いてみます。
digraph graph_name {
// graph setting
graph [
rankdir=LR; // left to right (default is TB)
]
// nodes (楕円の枠を作る)
"/joint_state_publisher";
"/move_group";
"/virtual_joint_broadcaster_0";
// topics (長方形の枠を作る)
"/joint_states"[shape=box];
"/move_group/display_planned_path"[shape=box];
"/tf"[shape=box];
"/planning_scene_world"[shape=box];
"/planning_scene"[shape=box];
// link (矢印を作る)
"/joint_state_publisher" -> "/joint_states";
"/joint_states" -> "/robot_state_publisher";
"/joint_states" -> "/move_group";
"/virtual_joint_broadcaster_0" -> "/tf"
"/robot_state_publisher" -> "/tf";
"/tf" -> "/move_group";
"/planning_scene" -> "/move_group";
"/planning_scene_world" -> "/move_group";
// 名前空間(長方形で囲む)
subgraph cluster_name {
label = "move_group";
"/move_group" -> "/move_group/display_planned_path";
}
}
楕円がノード名を、長方形がトピック名をそれぞれ表しています。名前空間の長方形はsubgraph
を使って実現しています。rqt_graphの出力結果と少し異なるようですが、本質ではないので気にしません。
ROSのノードグラフっぽくするポイントとして、rankdir=LR
を指定しておくことです。これがないと、下図のように、上から下に矢印が描画されます。これでもいいのですが、今回の場合だと、名前空間のmove_groupの表示が矢印と重なっており、締りが悪いです。
なお、トピック名は矢印のラベルとして次のように描画することもできます。
"/joint_state_publisher" -> "/robot_state_publisher"[label="joint_states"];