(訳注:最新の情報は原文を参照してください.)
Note: This tutorial assumes that you have completed the previous tutorials: rosedを使ってファイルを編集する. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
ROSのmsgとsrvを作る
Description: このチュートリアルでは、どのようにmsgやsrvファイルを作りビルドするかをrosmsg, rossrv や roscpなどのコマンドの使い方とともに学びますTutorial Level: BEGINNER
Next Tutorial: シンプルなパブリッシャとサブスクライバを書く (python) (c++)
Contents
ROS メッセージとサービスの作成
メッセージとサービスの概要
msg: メッセージ(msg)ファイルは ROS メッセージの型を説明する単純なテキストファイルです.これはメッセージのソース コードを異なる言語で作成するのに使います.
srv: サービス(srv)ファイルはサービスを記述します.これはリクエストとレスポンスという2つの部分で構成されます.
メッセージ ファイルはパッケージの msgディレクトリに保管されており、サービス ファイルは srv ディレクトリに保管されています.
メッセージは一行ごとに型と名前が記載されている,ただの単純なテキスト ファイルです.型には以下のものが使用できます:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
ROS 固有の型もあります.Header はタイムスタンプと ROS でよく使用される座標フレームの情報が含まれています.メッセージ ファイルの最初の行には Header header と書かれています.
以下は Header と文字列型と他の2つのメッセージを用いたメッセージの例です:
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
サービス ファイルはリクエストとレスポンスの部分があることを除けば,メッセージ ファイルによく似ています.2つの部分は '---' の行で区切られています.以下がサービス ファイルの例です.
int64 A int64 B --- int64 Sum
上の例では A と B はリクエストで,Sum がレスポンスです.
メッセージ(msg)を使う
メッセージの作成
先ほどのチュートリアルで作成したパッケージに,新しいメッセージを定義してみましょう.
$ cd ~/catkin_ws/src/beginner_tutorials $ mkdir msg $ echo "int64 num" > msg/Num.msg
上の例は内容が1行だけの最もシンプルな.msgファイルです。もちろん、以下のような複数の要素を含んだより複雑なmsgファイルも作成できます:
string first_name string last_name uint8 age uint32 score
もう1つステップがありますが,ここでメッセージ ファイルが C++ や Python や他の言語のソースコードへ変換できることを確認しましょう:
package.xmlを開き、 package.xmlの中に以下の2行があることを確認して、コメントタグを外してください:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
メッセージビルド時には"message_generation"が有効になっていることが必要で、メッセージ実行時には、"message_runtime"の有効化のみ必要です。
エディタでCMakeLists.txtを開きましょう。(前項のチュートリアルで出てきたrosed が使えますね)
CMakeLists.txtの中にすでにあるfind_packageの呼び出しに、message_generationの依存項目を付け加えると、メッセージを生成できます。 これは以下にあるようなCOMPONENTSのリストに、message_generationを追記するだけですみます。
# 自分のCMakeLists.txtにこれ全体を単に追加しないこと。既にあるfind_packageの項を探し、終わりの括弧の前にmessage_generationを追加すること。 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
すべての依存をfind_packageで呼び出さなくても、しばしば自分のプロジェクトがきちんとビルドできていることに気づくかもしれません。これはcatkinがすべてのプロジェクトを一つにまとめているからで、元のプロジェクトがfind_packageを呼び出しているなら、自分のプロジェクトはそれと同じ値で構成されます。しかし、find_packageの呼び出しを忘れると、自分のプロジェクトの単独ビルド時に、プロジェクトが壊れかねません。
同様にメッセージの実行時依存も有効になっていることを確認しましょう。
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
CMakeLists.txt内のコードにある以下のブロックを見つけてください:
# add_message_files( # FILES # Message1.msg # Message2.msg # )
行頭の#記号を外してコメント化を解除し、Message*.msgと書かれている部分を自分の.msgファイルに置き換えてください。以下のようになります:
add_message_files( FILES Num.msg )
他の.msgファイルを追加した後にプロジェクトを再構成しなければならないことを、手動で.msgファイルをadd_message_filesに追加することで、必ずCMakeに認識させましょう。
続いて、メッセージ生成generate_messages()の呼び出しについても、有効にしておかなければいけません。
ROS Hydro以降のバージョンでは、以下のブロックのコメント化を解除が必要で、:
# generate_messages( # DEPENDENCIES # std_msgs # )
#記号を外すと、このようになります。
generate_messages( DEPENDENCIES std_msgs )
これ以前のバージョンでは、1行をコメント解除するだけです:
generate_messages()
$ roscd beginner_tutorials $ mkdir msg $ echo "int64 num" > msg/Num.msg
上の例は内容が1行だけの最もシンプルな.msgファイルです。もちろん、以下のような複数の要素を含んだより複雑なmsgファイルも作成できます:
string first_name string last_name uint8 age uint32 score
もう1つステップがありますが,ここでメッセージ ファイルが C++ や Python や他の言語のソースコードへ変換できることを確認しましょう。CMakeLists.txtを好みのエディタで開き、 CMakeLists.txtを好みのエディタで開きましょう(前項のチュートリアルで出てきたrosedが使えますね)そして以下の行の# のコメントを外してください:
# rosbuild_genmsg()
これで自分のメッセージ定義からソースファイルを生成する準備ができました。もし今すぐ試したければ、次の項をスキップして、msgとsrvの共通手順の項(msgとsrvの共通手順)でメッセージのソースファイルを生成できます。
rosmsg を使う
前項でmsgを作るのに必要な作業がわかりました。ではrosmsg showコマンドを使って、ROSでメッセージを確認していきましょう.
使い方:
$ rosmsg show [message type]
例:
$ rosmsg show beginner_tutorials/Num
このように表示されるはずです:
int64 num
先ほどの例で,メッセージには2つの部分が含まれていました:
beginner_tutorials -- メッセージが定義されているパッケージ
Num -- Num メッセージの名前
どのパッケージにメッセージが入っているのか覚えていなければ,パッケージ名を省略できます.やってみましょう:
$ rosmsg show Num
このように表示されるはずです:
[beginner_tutorials/Num]: int64 num
サービス(srv)を使う
サービスの作成
作成したパッケージを使用してサービスを作成しましょう:
$ roscd beginner_tutorials $ mkdir srv
手作業で新しくサービスを定義するのではなく,別のパッケージをコピーします.
roscpは 1つのパッケージから他のパッケージへファイルをコピーするのに便利なコマンドライン-ツールです.
使い方:
$ roscp [package_name] [file_to_copy_path] [copy_path]
rospy_tutorialsパッケージからサービスをコピーできるようになりました:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
もう1つステップがありますが,ここでサービス ファイルが C++ や Python や他の言語のソースコードへ変換できることを確認しましょう:
まだmsgの項で処理を終えていないのであれば、メッセージ生成のために、CMakeLists.txtにmessage_generationの依存を追加してください:
#以下の行を自分のCMakeLists.txtに直接追加せずに、既存の該当行を編集すること find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
(message_generationという名称になっていますが、msg と srvの両方の生成に働きかけます.)
前項のmsgの作成で見たように、srvについてもCMakeLists.txtのサービスのメッセージのブロックに依存解決の記述を追記します。
以下のブロックのコメント記号#を外し:
# add_service_files( # FILES # Service1.srv # Service2.srv # )
そしてService*.srvと書かれている部分を自分のサービスファイルに置き換えます。
add_service_files( FILES AddTwoInts.srv )
もう一度、CMakeLists.txt をエディタで開いてください.そして以下の行の # のコメントを外してください:
# rosbuild_gensrv()
これで自分のサービス定義からソースファイルを生成する準備ができました。もし今すぐ試したければ、次の項をスキップして、msgとsrvの共通手順の項(msgとsrvの共通手順)でサービスのソースファイルを生成できます。
rossrvを使う
サービスを作成するためのすべての準備が整ったところで、rossrv show コマンドを使ってサービスの定義を表示して、内容を確認してみましょう。 使い方:
$ rossrv show <service type>
例:
$ rossrv show beginner_tutorials/AddTwoInts
このように表示されます:
int64 a int64 b --- int64 sum
rosmsgと同様、パッケージ名を特定しなくても、以下のようにサービスファイルを見つけることが出来ます。
$ rossrv show AddTwoInts [beginner_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum [rospy_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum
msgとsrvの共通手順
では、CMakeLists.txtの中で次のセクションを見つけて下さい:
# generate_messages( # DEPENDENCIES # # std_msgs # Or other packages containing msgs # )
このセクションのコメントを外し、以下のように、自分のメッセージが使う.msgファイルを含む依存パッケージ(この場合はstd_msgs)を追記します:
generate_messages( DEPENDENCIES std_msgs )
これでいくつか新しいメッセージを作成したので、自分のパッケージを再度makeする必要があります:
# catkinワークスペースの中で $ cd ../.. $ catkin_make $ cd -
新しくメッセージを作成したので,もう一度パッケージをmakeする必要があります:
$ rosmake beginner_tutorials
メッセージ形式のための完全な仕様書はMessage Description Languageのページを利用できます.
コマンドラインでのHelpの取得
私たちはまだほんの少しの ROS ツールについてしか見てきていません.それぞれのコマンドが要求する引数を覚えておくことは難しいかもしれません.幸運なことに,ほとんどの ROS ツールは各々がヘルプを提供しています.
やってみましょう:
$ rosmsg -h
違う rosmsg サブコマンドの種類を見ることができます.
Commands: rosmsg show Show message description rosmsg users Find files that use message rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messages
サブコマンドについてのヘルプも見ることができます.
$ rosmsg show -h
以下は rosmsg show で必要な引数を表示しています:
Usage: rosmsg show [options] <message type> Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments
復習
これまで使ってきたコマンドを並べてみましょう:
- rospack = ros+pack(age) : ROS パッケージに関連した情報を提供します
- roscd = ros+cd : ROS パッケージがスタックのディレクトリへ移動(cd=changes directory)します
- rosls = ros+ls : ROS パッケージ内のファイルを表示(ls=list segments)します
- roscp = ros+cp : ROS パッケージから、またはパッケージへファイルをコピー(cp=copy)します
- rosmsg = ros+msg : ROS メッセージ定義に関連した情報を提供します
- rossrv = ros+srv : ROS サービス定義に関連した情報を提供します
- catkin_make = catkin+make : ROSパッケージを作成(コンパイル)します
- rospack = ros+pack(age) : ROS パッケージに関連した情報を提供します
- rosstack = ros+stack : ROS スタックに関連した情報を提供します
- roscd = ros+cd : ROS パッケージがスタックのディレクトリへ移動します
- rosls = ros+ls : ROS パッケージ内のファイルを表示します
- roscp = ros+cp : ROS パッケージから/へファイルをコピーします
- rosmsg = ros+msg : ROS メッセージ定義に関連した情報を提供します
- rossrv = ros+srv : ROS サービス定義に関連した情報を提供します
- rosmake = ros+make : ROSパッケージを作成(コンパイル)します
次のチュートリアル
ここでは ROS メッセージとサービスを作成しました.次は(python) (c++)を見てみましょう.