見出し画像

ROS入門 (5) - ROS2のデータ通信の仕組み

ROS2のデータ通信の仕組みについてまとめました。

・Galactic

前回

1. ROS2のデータ通信の仕組み

ROSはソフトウェアの再利用性を高めるため、分散システムとして設計されています。「ノード」と呼ばれるプロセスが、メッセージを送受信しあいながら、1つの大きなシステムとして動作します。

画像1

◎ ノード
「ノード」は、ROS内で実行されるプロセス(最小のプログラム)です。
ノード毎に独立したメモリ空間で動作します。ROSでは目的(カメラ、モーターなど)ごとに、ノードを作成します。他のノードとの通信のために、「メッセージ」を使います。

◎ メッセージ
「メッセージ」は、ノード間でやりとりするデータです。

2. ROS2のノード間通信の方式

ROSはノード間の通信方法として、「トピック」「サービス」「アクション」の3つを提供しています。

◎ トピック
「トピック」は、「パブリッシャー-サブスクライバー」関係の通信を行います。パブリッシャーがトピックを作成して転送すると、サブスクライバーがそのトピックを受信します。この関係は一方的でサブスクライバーからパブリッシャーに転送することができません。

画像2

サブスクライバーを多数設定することもできます。

画像3

◎ サービス
「サービス」は、「サーバー-クライアント」関係の通信を行います。クライアントがサーバーにリクエストすると、サーバーがレスポンスを返します。

画像4

◎ アクション
「アクション」は、サービスと同様に「サーバー-クライアント」関係の通信を行います。サービスと異なる点は、サーバーがクライアントにフィードバックを返すことです。フィードバックとはリクエストに対する処理で発生するイベントで、フィードバックを受信したクライアントは処理の進行状況を知ることができます。

画像5

3. turtlesimのノードとトピックの確認

ROS入門 (3) - DockerによるROS2のセットアップ」で実行した、「turtlesim」のノードとトピックを確認してみます。

◎ ノードの確認
「ros2 node list」でノード一覧を確認します。

$ ros2 node list
/teleop_turtle
/turtlesim

・/teleop_turtle : カメシミュレータを表示するノード
・/turtlesim : カメシミュレータを操作するノード

ノード名(turtlesim_node、turtle_teleop_key)ではなく、ノード実行名(/turtlesim、/teleop_turtle)で表示されています。

◎ ノード情報の確認
「ros2 node info <ノード実行名>」で、ノード情報を確認します。

・turtlesimの情報
トピック「/turtle1/cmd_vel」を受信していることがわかります。

$ ros2 node info /turtlesim
/turtlesim
 Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
 Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
 Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
 Service Clients:

 Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
 Action Clients:

・teleop_turtleの情報
トピック「/turtle1/cmd_vel」を送信していることがわかります。

/teleop_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
 Service Servers:
    /teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
 Service Clients:

 Action Servers:

 Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

◎ トピック一覧の確認
「ros2 topic list」でトピック一覧を確認します。

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

・/parameter_events : パラメータイベントのトピック
・/rosout : ログ出力のトピック
・/turtle1/cmd_vel : 加速度コマンド
・/turtle1/color_sensor : 色センサー
・/turtle1/pose : 姿勢

◎ トピック情報の確認
「ros2 topic info <トピック名>」でトピック情報を確認します。

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

「-v」でパブリッシャーとサブスクライバーを確認できます。

ros2 topic info -v /turtle1/cmd_vel

Type: geometry_msgs/msg/Twist

Publisher count: 1

Node name: teleop_turtle
Node namespace: /
Topic type: geometry_msgs/msg/Twist
Endpoint type: PUBLISHER
GID: 48.e8.10.01.59.00.bd.7d.11.df.70.4d.00.00.15.03.00.00.00.00.00.00.00.00
QoS profile:
Reliability: RELIABLE
Durability: VOLATILE
Lifespan: 9223372036854775807 nanoseconds
Deadline: 9223372036854775807 nanoseconds
Liveliness: AUTOMATIC
Liveliness lease duration: 9223372036854775807 nanoseconds

Subscription count: 1

Node name: turtlesim
Node namespace: /
Topic type: geometry_msgs/msg/Twist
Endpoint type: SUBSCRIPTION
GID: 26.ef.10.01.0e.fc.3c.be.17.80.d2.0c.00.00.1e.04.00.00.00.00.00.00.00.00
QoS profile:
Reliability: RELIABLE
Durability: VOLATILE
Lifespan: 9223372036854775807 nanoseconds
Deadline: 9223372036854775807 nanoseconds
Liveliness: AUTOMATIC
Liveliness lease duration: 9223372036854775807 nanoseconds

/turtle1/cmd_velのパブリッシャーはteleop_turtle、サブスクライバーはturtlesimであることがわかります。

◎ トピック値の確認
「ros2 topic echo <トピック名>」でトピック値をリアルタイムに確認します。「Ctrl-C」で終了します。
/turtle1/cmd_velは、キー操作した時に受信します。

$ ros2 topic echo /turtle1/cmd_vel
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0
---
    :

◎ トピック値のパブリッシュ
「ros2 topic pub <トピック名> <トピック型> '<値の辞書>'」でトピック値をパブリッシュします。コマンドでカメを操作できます。

$ ros2 topic pub /turtle1/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1}, angular: {z: 0.3}}'

◎ グラフによる確認
「rqt_graph」でノードの関係をグラフで確認します。

$ rqt_graph

次回



この記事が気に入ったらサポートをしてみませんか?