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

【ROS2講座②】サービスとパラメータ、アクション【Python】

前回はROS2のノードとトピックについて学びました。

今回はサービスとアクションについて学びます。

サービスとは

ROS 2 の通信方式には、**トピック(Topic)サービス(Service)**があります。

トピックは前回勉強しましたが、トピックは一方的な通信で、データを送った後きちんと動いたかはわかりません。

サービスは、通信が 「呼びかけ・応答」のリクエスト‑レスポンス型になっています。

  • **クライアント(Client)**が「○○して!」と呼びかけ
  • **サーバ(Server)**が処理して「はい、OKです」と応える
  • 例えば「turtlesim にカメを新しく生み出して!」など、一度きりの処理に向いています

前回同様、turtlesimを使って体験してみましょう。

turtlesim の起動

ターミナル①:

ros2 run turtlesim turtlesim_node

ターミナル②:

ros2 run turtlesim turtle_teleop_key

サービス一覧を確認(ros2 service list

現在システムで使える「サービスの一覧」を表示します。どんなサービスが定義されているかをまず確認するのに使います。

もう一つターミナルを立ち上げて以下のコマンドを実行します。

ros2 service list

以下のように一覧が表示されます。

/clear: 画面の軌跡を消す

/spawn: 新しいカメを生み出す

など、どれも turtlesim に用意されたサービスです。

サービスの形式を調べる(ros2 service type

上記の ros2 service list に加えて、それぞれのサービスがどんな**データ型(型名)**を使っているかも表示します。

ros2 service list -t

以下のように表示されます。

std_srvs/srv/Empty: 引数も返り値も「何もない」シンプルな型

turtlesim/srv/Spawn: カメを生み出すための位置などの情報を送る型

型の名前を調べる ros2 service type <サービス名>

指定したサービスが使っている型の名前を教えてくれます。

ros2 service type /clear

以下のように表示されます。

この型がわかれば、次に「どんなデータを渡せばいいか」が確認できます。

型のサービスを表示 ros2 service find <型名>

指定した型を使っているサービスをすべてリストアップします。

ros2 service find std_srvs/srv/Empty

以下のように表示されます。

「この型ってどこで使われているんだっけ?」と調べたいときに便利です。

サービスの中身を表示 ros2 interface show <サービス型>

サービスの「型」の中身(引数や返り値のフィールド)を表示します。

ros2 interface show std_srvs/srv/Empty

以下のように表示されます。

引数・返り値ともに空です。

/Spawnですと以下の通りに表示されます。

ros2 interface show turtlesim/srv/Spawn

上部がリクエスト(送る側)、下部がレスポンス(返ってくる側)です。
x, y, theta はカメの座標や角度、name は任意でつけられる名前です。

サービスのコマンドをまとめます。

コマンド概要主な使い方
ros2 service list利用可能なサービス一覧どんな操作があるかを調べる
ros2 service list -t一覧+型情報表示使われている型も併せて見たいとき
ros2 service type /サービス名特定サービスの型を調べるinterface show で中身を見る前段階として
ros2 service find <型名>指定型を使っているサービス一覧特定の型を使う操作を探したい時
ros2 interface show <型名>サービスの引数や返り値を確認サービス呼び出しの前に絶対確認
ros2 service call /サービス名 型 "{引数}"サービスを実行(呼び出す)turtlesim の操作を試して学ぶ!

サービスの実行 service call /サービス名 型 "{引数}"

それでは実際にサービスを動かしながら動作を見てみます。

カメの軌跡を消す(/clear サービス)

亀を動かすと白い線で軌跡が出ます。

以下のサービスコマンドで軌跡を消せます。

ros2 service call /clear std_srvs/srv/Empty

トピックとの違いは実行した結果が表示されます。

カメを新しく生み出す(/spawn サービス)

新しいカメが (x=2.0, y=2.0) に出現します。名前は turtle2 など自動でつけられます。

※2匹目以降のカメも /turtle2/turtle3 と追加されていきます。

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.0, name: ''}"

サービスでカメを「瞬時に移動」

ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 6.0, y: 6.0, theta: 0.0}"

カメが一瞬でワープします。

これが サービス通信の特徴です。
「お願い!(リクエスト)→ やったよ!(レスポンス)」という形で処理される。
同期処理であるため、結果を待つことができます。

サービスとトピックを並行して使ってみる

以下のコマンドで亀が回り続けます(トピック送信中)

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 service call /clear std_srvs/srv/Empty

このように

・トピックは常に流れ続けている

・サービスは呼んだときだけ動く(トリガー処理)

という違いがあります。

パラメータとは

パラメータ(Parameter)はノードの設定値です。

例えば整数、浮動小数点数、文字列、真偽値、配列などが扱えます。

各ノードは独自にパラメータを管理し、起動時や実行中に動的に設定を変えることができます

パラメータ一覧を表示 ros2 param list

以下のコマンドでパラメータ一覧を表示できます。

ros2 param list

以下のように表示されます。

各ノードが持つパラメータ名が表示されます。

use_sim_time はROS全体でよく使われる共通パラメータです。

background_r/g/b は、turtlesim の背景色 RGB を調整するためのものです。

設定されているパラメータ値を確認 ros2 param get /turtlesim background_g

ros2 param get /turtlesim background_g

以下のように表示されます。

background_g の値が 86(緑成分)であることを確認できます。他の成分も同様に取得可能です。

パラメータの値を変更する ros2 param set /turtlesim background_r 150

ros2 param set /turtlesim background_r 150

ターミナルに「Set parameter successful」と表示され、背景色が変わるはずです。theconstruct.ai+5docs.ros.org+5daobook.github.io+5

ポイント:このコマンドはリアルタイムに設定を変更できます(ただし次回起動時には元に戻ります)。

パラメータの保存 ros2 param dump

以下のコマンドでturtlesim.yamlというファイルで設定が保存されます。

ros2 param dump /turtlesim > turtlesim.yaml

一度シミュレータを再起動するとまた青い背景に戻っています。

以下のコマンドで実行中の turtlesim ノードに対し、保存したパラメータを再読み込みできます。

ros2 param load /turtlesim ./turtlesim.yaml

ノード起動時にパラメータを設定

以下のコマンドでパラメータファイルを指定してノードを起動できます。

ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml

パラメータ関連のコマンドは以下の通りです

操作内容正しいコマンド
実行中ノードのパラメータを取得ros2 param get /ノード名 パラメータ名
パラメータを実行中に変更ros2 param set /ノード名 パラメータ名 値
パラメータをファイルに保存ros2 param dump /ノード名
ファイルから読み込みros2 param load /ノード名 ファイル名.yaml
ノード起動時にパラメータ適用ros2 run <pkg> <exec> --ros-args --params-file <file>.yaml

アクションとは

アクションは「長時間かかる処理」に適した通信手段です。

ゴール(Goal)フィードバック(Feedback)、**結果(Result)**という構成を持ちます。

サービスとトピックのいいとこ取りで、「リクエスト → 応答」の同期処理に加え、進捗報告キャンセルも可能です。

アクションの体験

いつも通り以下のコマンドを2つ実行しシミュレータとキーボード操作のプログラムを実行します。

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

turtle_teleop_key を起動すると、キーの案内メッセージが表示されます

書いてある通り、トピック通信だけでなく、アクション通信も試すことができます。

G/B/V/C/D/E/R/TとFキーは「アクション」のゴール送信とキャンセルに対応しています。

試しにCキーを押してみてください。

亀が回転し、以下の表示が出てきます。

次にTを押して、回転している途中でFを押します。

途中で回転が止まり、キャンセルされたと表示されます。

このようにアクションは時間のかかる動作に対して、状況がわかる上に、途中でキャンセルすることもできます。

アクションの一覧表示

以下のコマンドで一覧を表示できます。

ros2 action list

アクションの詳細を調べる

ros2 action info /turtle1/rotate_absolute

ゴール/フィードバック/結果の型などが表示されます。

アクションの実行

以下の通りアクションを実行することができます。

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

これでカメが90度(1.57 rad)回転します。

終了後、結果が返されます。

まとめ

通信方式特徴
トピック連続的・非同期矢印キーによるカメの移動
サービス単発・同期/clear による線消去
アクション長時間・同期 → フィードバック + キャンセル可能キーでカメの向きを変える rotation

今回はサービスとパラメータ、アクションの概要を学びました。

ROSの基本的な概念になりますので、しっかりと理解しておきましょう。

次回はこちら

Comming soon

Follow me!

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

PAGE TOP