前回はROS2のDockerを使った環境構築を行いました。
この章の目標
- ROS2における「ノード」と「トピック」の概念を理解する
- 実際のROS2環境でノードを動かし、トピック通信を確認する
- turtlesim(カメのシミュレーター)を用いた実習で学ぶ

ノードとは?
定義:
ノード(Node)とは、ロボットの1つの機能を担う小さなプログラムのことです。
ロボットは多くの機能で構成されています。ROS2ではこれらを「ノード」という単位で分けて管理します。
ノード名の例 | 役割 |
---|---|
/camera_node | カメラ画像の取得 |
/motor_controller | モーターへの命令を出す |
/map_publisher | 地図情報を配信 |
ノードを起動する
ros2 run コマンドによって、ノードを起動します。
ros2 run <パッケージ名> <実行可能ファイル名>
試しに元々含まれているプログラムを起動してみましょう。
ターミナルで以下のコマンドを実行してみます。
turtlesim_node
を起動
ros2 run turtlesim turtlesim_node
以下のように亀が表示されたウィンドウが立ち上がります。
ここでは package = turtlesim
, executable = turtlesim_node
です。

ノード一覧を確認
ros2 node list
を使うと、現在稼働中の全ノード名を一覧できます。複雑なシステムでも、どのノードが動いているかを把握しやすくなります。
上記のturtlesim
を起動したまま別ターミナルで以下を実行してください。
ros2 node list
以下のように表示されます。

さらに別のターミナルで teleop
ノードを起動してみます。
ros2 run turtlesim turtle_teleop_key
このプログラムを実行したターミナルをクリックし、アクティブにした状態で矢印キーを押すと、シミュレータ上の亀を動かすことができます。
その後、再度 ros2 node list
を実行すると以下のように表示されます。
(一度実行したコマンドは↑キーを押すと再度簡単に入力できます)

リマッピング(Remapping)
リマッピングを使うと、ノード名やトピック名などを 任意の名前に変更できます。
例えば /turtlesim
のノード名を my_turtle
に変えて実行するには以下のコマンドになります。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
するともう一つ亀シミュレータが立ち上がります。

先ほどのteleop
ノードをアクティブにして矢印キーを押すと2つのシミュレータ上の亀が同じように動きます。
ros2 node list
を再度実行すると以下のように表示され、名前が変わっていることがわかると思います。

ノードの詳細を確認
ノード名を取得したら、次に詳細情報を確認するコマンドを紹介します。
ros2 node info <ノード名>
例として /my_turtle
に対して実行すると次のような情報が表示されます。
ros2 node info /my_turtle

このように、ノードが購読しているトピック、発行しているトピック、提供しているサービス、アクションなどが一目で分かります。
他のノードでも同様に実行して違いを比較可能です。
ノードを終了するには実行したターミナル上でCtrl+Cを押します。
今回新たに起動した/my_turtleだけ終了させてください。
このまま次の章に移りトピックについて学びます。
トピックとは?
定義:
トピック(Topic)とは、ノード間でデータをやり取りするための“通路”のことです。
送信側と受信側で以下のような名称があります。
- データを送る側のノード:Publisher(パブリッシャー)
- データを受け取る側のノード:Subscriber(サブスクライバー)
通信は「一方向」で行われます。
ノード同士のやり取りを図で見る(rqt_graph)
rqt_graph
というツールを使うと、ノード同士がどんなトピックでつながっているかを図で表示できます。
rqt_graph
以下のように表示されます。
/teleop_turtle
(キーボード操作ノード) → /turtle1/cmd_vel
(トピック) → /turtlesim
(カメを動かすノード)

つまり:
- キーボード操作ノードが
/turtle1/cmd_vel
に「カメを動かせ」という情報を出して - カメノードがその情報を受け取って、画面上のカメが動く
という流れになっているのがわかります。
トピック一覧を表示(ros2 topic list)
今、ROS 2 上でやり取りされているトピックを全部見たいときはこのコマンドを実行します。
ros2 topic list
以下のように表示されます。

トピックにはノード同士で情報を正確にやり取りをするために、いくつかの型に当てはめてデータを送らなくてはなりません。
それぞれが、どんなメッセージ型(データ形式)を使っているかも見たければ以下のコマンドで確認できます。
ros2 topic list -t
以下のように表示されます。

geometry_msgs/msg/Twist
は「速さや角度」の情報を表す型です。
トピックの中身を見る(ros2 topic echo)
特定のトピックに、今どんなデータが流れているかをリアルタイムで見るには以下のコマンドを実行します。
ros2 topic echo /turtle1/cmd_vel
実行した状態でTeleopのノードでキー入力を行うと、トピックが送られて以下のようにデータの内容を確認できます。

このように、「どの方向に」「どのくらいの速さで」動かすかの情報が載っています。
トピックの詳細を調べる(ros2 topic info
)
「このトピックには、誰がデータを出して、誰が受け取っているの?」というのを知るには以下のコマンドを実行します。
ros2 topic info /turtle1/cmd_vel
以下のように出力されます。

- Type:このトピックのデータの形式(ここでは Twist 型)
- Publisher count:データを出しているノードの数(ここでは 1つ、
teleop_turtle
) - Subscription count:データを受け取っているノードの数(ここでは 1つ、
turtlesim
)
トピックが「誰と誰の間をつないでいるのか」が、これでわかります。
トピックのデータ形式を見る(ros2 interface show
)
「Twistってどんな情報が入ってるの?」を見たいときはこのコマンドを実行します。
ros2 interface show geometry_msgs/msg/Twist
以下のように出力されます。

つまりこの型には、
linear
:直線方向の動き(x, y, z)angular
:回転方向の動き(x, y, z)
という2つの情報が入っていることがわかります。
トピックに自分でデータを送ってみる(ros2 topic pub
)
今度は、自分でトピックにデータを送って、カメを動かしてみましょう。
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}}"
すると、以下のように亀が回り続けます。

オプション -1
を付けると1回だけ送信されます
ros2 topic pub -1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.8}}"
このように難しいプログラムは書かなくても簡単にコマンドで命令を送ることができます。
トピックの送信レートを測る(ros2 topic hz
)
「このトピックって、1秒間に何回データが送られているんだろう?」
それを調べるのが ros2 topic hz
です。
ros2 topic hz /turtle1/pose
以下のように実行されます。

約60回/秒のペースで、/turtle1/pose
に位置情報が送られている、ということです。
トピックの通信量(帯域幅)を測る(ros2 topic bw
)
「このトピック、どれくらいネットワークのデータを使ってるの?」
それがわかるのが ros2 topic bw
(bandwidth = 帯域幅)です。
ros2 topic bw /turtle1/pose
以下のように実行されます。

おおよそ 1.5キロバイト/秒のデータが流れているということです。
通信量が多すぎると、ロボットの動きが遅れたり止まったりすることもあるので、大事なチェックポイントです。
特定のデータ型を使っているトピックを探す(ros2 topic find
)
「このデータ型(たとえば Twist)を使っているトピックってどれだろう?」を探せるのが以下のコマンドです。
ros2 topic find geometry_msgs/msg/Twist
実行すると以下のように表示されます。

まとめ
今回学んだコマンドをすべて、まとめておきます。
今後困ったときに参照してください。
ノード コマンド一覧
コマンド | 説明 | 使用例 |
---|---|---|
ros2 run <パッケージ> <ノード> | ノードを起動する | ros2 run turtlesim turtlesim_node |
ros2 node list | 現在起動中のノードを一覧表示 | ros2 node list |
ros2 node info <ノード名> | ノードが使っているトピック・サービス等を表示 | ros2 node info /turtlesim |
--ros-args --remap __node:=<名前> | ノード名を変更して起動(リマップ) | ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle |
トピック コマンド一覧
コマンド | 説明 | 使用例 |
---|---|---|
ros2 topic list | 現在使われているトピックの一覧 | ros2 topic list |
ros2 topic list -t | トピックの型(データ形式)も一緒に表示 | ros2 topic list -t |
ros2 topic echo <トピック名> | トピックに流れるデータをリアルタイム表示 | ros2 topic echo /turtle1/cmd_vel |
ros2 topic info <トピック名> | トピックの送信元・受信先などを確認 | ros2 topic info /turtle1/cmd_vel |
ros2 interface show <型名> | トピックのメッセージ型の中身を確認 | ros2 interface show geometry_msgs/msg/Twist |
ros2 topic pub <トピック名> <型名> <データ> | 任意のデータをトピックに送信 | ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.8}}" |
ros2 topic hz <トピック名> | トピックの送信レート(Hz)を表示 | ros2 topic hz /turtle1/pose |
ros2 topic bw <トピック名> | 通信帯域(バイト/秒)を表示 | ros2 topic bw /turtle1/pose |
ros2 topic find <型名> | 指定した型を使うトピックを検索 | ros2 topic find geometry_msgs/msg/Twist |
GUIツール
コマンド | 説明 |
---|---|
rqt_graph | ノードとトピックの接続関係を視覚化するツール |
今回はノードとトピックの概要を学びました。
ROSの基本的な概念になりますので、しっかりと理解しておきましょう。
次回はこちら
Comming soon