Skip to content

トピックの理解

目標: rqt_graphとコマンドラインツールを使用してROS 2トピックを検査します。

チュートリアルレベル: 初心者

所要時間: 20分

背景

ROS 2は複雑なシステムを多くのモジュラーノードに分解します。トピックは、ノードがメッセージを交換するためのバスとして機能するROSグラフの重要な要素です。

Topic-SinglePublisherandSingleSubscriber

ノードは任意の数のトピックにデータを公開し、同時に任意の数のトピックにサブスクリプションを持つことができます。

Topic-MultiplePublisherandMultipleSubscriber

トピックは、ノード間、つまりシステムの異なる部分間でデータが移動する主要な方法の1つです。

前提条件

前のチュートリアルでは、ここで構築されるノードに関するいくつかの有用な背景情報を提供しています。

いつものように、開く新しいターミナルごとにROS 2をソースすることを忘れないでください。

タスク

1 セットアップ

これまでに、turtlesimの起動に慣れているはずです。

新しいターミナルを開いて実行します:

bash
$ ros2 run turtlesim turtlesim_node

別のターミナルを開いて実行します:

bash
$ ros2 run turtlesim turtle_teleop_key

前のチュートリアルから、これらのノードの名前はデフォルトで/turtlesim/teleop_turtleであることを思い出してください。

2 rqt_graph

このチュートリアル全体を通して、rqt_graphを使用して変化するノードとトピック、およびそれらの間の接続を視覚化します。

turtlesimチュートリアルでは、rqt_graphを含むrqtとそのすべてのプラグインのインストール方法を説明しています。

rqt_graphを実行するには、新しいターミナルを開いて次のコマンドを入力します:

bash
$ rqt_graph

rqtを開いてPlugins > Introspection > Node Graphを選択することでもrqt_graphを開くことができます。

rqt_graph

上記のノードとトピック、およびグラフの周辺にある2つのアクション(今は無視しましょう)が表示されるはずです。中央のトピックにマウスを置くと、上の画像のように色がハイライトされます。

グラフは、/turtlesimノードと/teleop_turtleノードがトピックを介してどのように通信しているかを描いています。/teleop_turtleノードは、データ(タートルを動かすために入力するキーストローク)を/turtle1/cmd_velトピックに公開し、/turtlesimノードはそのトピックにサブスクライブしてデータを受信しています。

rqt_graphのハイライト機能は、多くのノードとトピックが多くの異なる方法で接続されている、より複雑なシステムを調査する際に非常に役立ちます。

rqt_graphはグラフィカルな検査ツールです。次に、トピックを検査するためのコマンドラインツールを見てみましょう。

3 ros2 topic list

新しいターミナルでros2 topic listコマンドを実行すると、現在システムでアクティブなすべてのトピックのリストが返されます:

bash
$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -tは同じトピックのリストを返しますが、今度はトピックタイプが括弧内に追加されています:

bash
$ ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

これらの属性、特にタイプは、ノードがトピックを介して移動する際に同じ情報について話していることを知る方法です。

これらのトピックがすべてrqt_graphのどこにあるのか疑問に思っている場合は、**Hide:**の下のすべてのボックスのチェックを外すことができます:

unhide

しかし今のところ、混乱を避けるためにこれらのオプションをチェックしたままにしておいてください。

4 ros2 topic echo

トピックで公開されているデータを見るには、以下を使用します:

bash
$ ros2 topic echo <topic_name>

/teleop_turtle/turtle1/cmd_velトピックを介して/turtlesimにデータを公開していることがわかっているので、echoを使用してそのトピックを検査しましょう:

bash
$ ros2 topic echo /turtle1/cmd_vel

最初、このコマンドはデータを返しません。これは、/teleop_turtleが何かを公開するのを待っているからです。

turtle_teleop_keyが実行されているターミナルに戻り、矢印を使用してタートルを動かしてください。同時にechoが実行されているターミナルを見ていると、あなたが行うすべての動きに対して位置データが公開されているのが見えます:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

次に、rqt_graphに戻り、Debugボックスのチェックを外します。

debug

/_ros2cli_26646は、先ほど実行したechoコマンドによって作成されたノードです(番号は異なる可能性があります)。これで、パブリッシャーがcmd_velトピックを介してデータを公開し、2つのサブスクライバーがそれにサブスクライブしていることがわかります。

5 ros2 topic info

トピックは1対1の通信である必要はありません。1対多、多対1、または多対多にすることができます。

これを見る別の方法は、次を実行することです:

bash
$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6 ros2 interface show

ノードはメッセージを使用してトピックを介してデータを送信します。パブリッシャーとサブスクライバーは通信するために同じタイプのメッセージを送受信する必要があります。

先ほどros2 topic list -tを実行した後に見たトピックタイプから、各トピックで使用されるメッセージタイプがわかります。cmd_velトピックには次のタイプがあることを思い出してください:

geometry_msgs/msg/Twist

これは、geometry_msgsパッケージにTwistと呼ばれるmsgがあることを意味します。

このタイプでros2 interface show <msg_type>を実行して、その詳細を学ぶことができます。具体的には、メッセージが期待するデータの構造を知ることができます。

bash
$ ros2 interface show geometry_msgs/msg/Twist

これは次を返します:

# This expresses velocity in free space broken into its linear and angular parts.
    Vector3  linear
            float64 x
            float64 y
            float64 z
    Vector3  angular
            float64 x
            float64 y
            float64 z

これは、/turtlesimノードが、それぞれ3つの要素を持つ2つのベクトル、linearangularを含むメッセージを期待していることを教えてくれます。echoコマンドで/teleop_turtle/turtlesimに渡していたデータを思い出すと、それは同じ構造になっています:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7 ros2 topic pub

メッセージ構造がわかったので、次のコマンドを使用してコマンドラインから直接トピックにデータを公開できます:

bash
$ ros2 topic pub <topic_name> <msg_type> '<args>'

'<args>'引数は、前のセクションで発見した構造で、実際にトピックに渡すデータです。

タートル(および一般的にそれが模倣することを意図している実際のロボット)は、継続的に動作するために安定したコマンドストリームを必要とします。そこで、タートルを動かし、動き続けるには、次のコマンドを使用できます。この引数はYAML構文で入力する必要があることに注意することが重要です。次のように完全なコマンドを入力してください:

bash
$ ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

コマンドラインオプションがない場合、ros2 topic pubは1Hzで安定したストリームでコマンドを公開します。

pub_stream

(継続的にではなく)一度だけトピックにデータを公開したい場合があります。コマンドを一度だけ公開するには、--onceオプションを追加します。

bash
$ ros2 topic pub --once -w 2 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

--onceは「1つのメッセージを公開して終了」を意味するオプション引数です。

-w 2は「2つのマッチングサブスクリプションを待つ」を意味するオプション引数です。これは、turtlesimとtopic echoの両方がサブスクライブしているために必要です。

ターミナルに次の出力が表示されます:

Waiting for at least 2 matching subscription(s)...
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

そして、タートルは次のように動きます:

pub_once

rqt_graphを更新して、何が起こっているかをグラフィカルに確認できます。ros2 topic pub ...ノード(/_ros2cli_30358)が/turtle1/cmd_velトピックを介して公開しており、それがros2 topic echo ...ノード(/_ros2cli_26646)と/turtlesimノードの両方によって受信されていることがわかります。

rqt_graph2

最後に、poseトピックでechoを実行し、rqt_graphを再チェックできます:

bash
$ ros2 topic echo /turtle1/pose

rqt_graph3

/turtlesimノードがposeトピックにも公開しており、新しいechoノードがそれにサブスクライブしていることがわかります。

タイムスタンプ付きメッセージを公開する場合、pubには現在時刻で自動的に入力する2つの方法があります。std_msgs/msg/Headerを持つメッセージの場合、ヘッダーフィールドをautoに設定してstampフィールドを入力できます。

bash
$ ros2 topic pub /pose geometry_msgs/msg/PoseStamped '{header: "auto", pose: {position: {x: 1.0, y: 2.0, z: 3.0}}}'

メッセージが完全なヘッダーを使用せず、builtin_interfaces/msg/Timeタイプのフィールドのみを持つ場合、それを値nowに設定できます。

bash
$ ros2 topic pub /reference sensor_msgs/msg/TimeReference '{header: "auto", time_ref: "now", source: "dumy"}'

8 ros2 topic hz

次のコマンドを使用して、データが公開される速度を確認することもできます:

bash
$ ros2 topic hz /turtle1/pose
average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

これは、/turtlesimノードがposeトピックにデータを公開している速度に関するデータを返します。

ros2 topic pub --rate 1を使用してturtle1/cmd_velの速度を安定した1Hzに設定したことを思い出してください。turtle1/poseの代わりにturtle1/cmd_velで上記のコマンドを実行すると、その速度を反映した平均が表示されます。

注意

速度は、ros2 topic hzコマンドによって作成されたサブスクリプションでの受信速度を反映しており、プラットフォームリソースとQoS設定の影響を受ける可能性があり、パブリッシャー速度と正確に一致しない場合があります。

9 ros2 topic bw

トピックが使用する帯域幅は次のコマンドで確認できます:

bash
$ ros2 topic bw /turtle1/pose
Subscribed to [/turtle1/pose]
1.51 KB/s from 62 messages
    Message size mean: 0.02 KB min: 0.02 KB max: 0.02 KB

これは、/turtle1/poseトピックに公開されている帯域幅使用量とメッセージ数を返します。

注意

帯域幅は、ros2 topic bwコマンドによって作成されたサブスクリプションでの受信速度を反映しており、プラットフォームリソースとQoS設定の影響を受ける可能性があり、パブリッシャーの帯域幅と正確に一致しない場合があります。

10 ros2 topic find

指定されたタイプの利用可能なトピックのリストを一覧表示するには、次を使用します:

bash
$ ros2 topic find <topic_type>

cmd_velトピックには次のタイプがあることを思い出してください:

geometry_msgs/msg/Twist

findコマンドを使用すると、メッセージタイプが与えられたときに利用可能なトピックが出力されます:

bash
$ ros2 topic find geometry_msgs/msg/Twist
/turtle1/cmd_vel

11 クリーンアップ

この時点で、多くのノードが実行されています。各ターミナルでCtrl+Cを入力してそれらを停止することを忘れないでください。

まとめ

ノードはトピックを介して情報を公開し、これにより任意の数の他のノードがその情報をサブスクライブしてアクセスできます。このチュートリアルでは、rqt_graphとコマンドラインツールを使用して、トピックを介したいくつかのノード間の接続を調べました。ROS 2システム内でデータがどのように移動するかについて、良いアイデアが得られたはずです。

次のステップ

次に、チュートリアル「サービスの理解」でROSグラフの別の通信タイプについて学習します。

Released under the MIT License.