Python ROS2 プログラム 高専4年生

【ROS2講座①】ノードとトピック【Python】

前回は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

Follow me!

-Python, ROS2, プログラム, 高専4年生
-, , ,

PAGE TOP