ノード(node) は、メッセージ(messages)をトピック(topics)にパブリッシュすることでお互いに通信をすることができます。メッセージは、とてもシンプルな構造になっており、型の決まった変数を持っています。標準的な型(integer, floating, booleanなど)をサポートしており、それらの配列もサポートしております。メッセージは、任意にネスト構造や配列を含むことができます。
ノードは、ROSのserviceの呼び出しによって、リクエストとレスポンスをやり取りすることもできます。これらのリクエストとレスポンスのメッセージは、srv ファイルに定義されています。
msg ファイル
msgファイルは、メッセージのデータ構造を記述するのに単純なテキストファイルとなっています。これらのファイルは、パッケージのmsgサブディレクトリの中に蓄えられています。タイプの宣言など含めこれらのファイルについては、msg formatをご覧ください.
メッセージ タイプ
メッセージのタイプは、標準のROSの名前規則に則っています。:パッケージ名+/+.msgファイル名でできています。例えば、std_msgs/msg/String.msg は、 std_msgs/Stringというメッセージタイプとなります.
メッセージタイプに加え、メッセージは、.msgファイルのMD5合計値によってバージョン付けされています。ノードは、メッセージタイプとそのMD5の合計値が一致したときにメッセージのやりとりを行うことができます。
ビルド
ROSのクライアントライブラリは、.msgファイルをソースコードに変換するメッセージジェネレータを実行します。これらのメッセージジェネレータは、ビルドスクリプトから実行されるべきですが、血みどろな詳細のほとんどは、いくらかの一般的なビルドルールを含むことで面倒を見てもらえます。約束として、すべてのmsgファイルは、"msg"と呼ばれるパッケージのなかのディレクトリに蓄えます。もし、その中に定義しているなら、CMakeLists.txtにrosbuild_genmsg()の行を加えるだけで準備できます。以下が例です。
cmake_minimum_required(VERSION 2.6) include(rosbuild) rosbuild_init() rosbuild_genmsg()
ヘッダー
メッセージが、'Header'と呼ばれる特別なメッセージのタイプをインクルードしているかもしれませんが 、それは、いくらかの一般的なタイムスタンプやフレームIDなどのメタデータの変数をインクルードするためのものです。ROSのClient Librariesは、望むなら、自動的にこれらの値をセットします。ですので、これらの使用はとても便利です。
ヘッダーメッセージの中には以下に示すように3つの変数があります。seq変数は、メッセージが与えられたパブリッシャから送信されるにつれて自動的に増えてくidと一致します。stamp変数は、メッセージのデータが一致すべき時間情報を保持します。例えばレーザスキャンの例では、スタンプは、いつスキャンがされたかの時間と一致します。frame_idの変数は、メッセージのデータが一致すべきフレーム情報を保持します。レーザスキャンの例では、いつスキャンが行われたかのフレームがセットされます。
#Standard metadata for higher-level flow data types #sequence ID: consecutively increasing ID uint32 seq #Two-integer timestamp that is expressed as: # * stamp.secs: seconds (stamp_secs) since epoch # * stamp.nsecs: nanoseconds since stamp_secs # time-handling sugar is provided by the client library time stamp #Frame this data is associated with # 0: no frame # 1: global frame string frame_id
rosmsg
rosmsgは、メッセージについての情報を表示する、例えば、.msgのデータ構造などを表示したりするためのコマンドラインツールです。このツールを使う方法はrosmsgをご覧ください。