ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
※2019/05/06 現在のものです。
※以降、インターフェースを I/F と表記します。
1. 背景
ROS アプリケーションは通常、メッセージとサービスの2つのタイプのうちの1つの I/F を介して通信します。 ROS はこれらの I/F を記述するための記述言語を使います。これにより、異なる開発言語でも利用できる I/F 型のソースコードを自動的に生成することができます。
この文書ではサポートされている型の紹介と msg / srvファイルの作り方を説明します。
2. メッセージ記述仕様
メッセージの説明はROSパッケージの msg/
ディレクトリの .msg
ファイルに定義されています。.msg
ファイルは、フィールドと定数の2つの部分で構成されています。
2.1 フィールド
各フィールドは、スペースで区切られたタイプと名前で構成されています。
fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3
例:
int32 my_int string my_string
2.1.1フィールド型
フィールド型は次のとおりです。
- ビルトイン型
- “ geometry_msgs / PoseStamped” のように独自に定義されたメッセージ
現在サポートされているビルトイン型
型名 | C++ | Python | DDS における型 |
---|---|---|---|
bool | bool | builtins.bool | boolean |
byte | uinit8_t | buitins.bytes* | octet |
char | char | builtins.str* | char |
float32 | float | buitlins.float* | float |
float64 | double | builtins.float* | double |
int8 | int8_t | builtins.int* | octet |
uint8 | uint8_t | builtins.int* | short |
uint16 | uint16_t | builtins.int* | unsigned short |
int32 | int32_t | builtins.int* | long |
uint32 | uint32_t | builtins.int* | unsigned long |
int64 | int64_t | builtins.int* | long long |
uint64 | uint64_t | builtins.int* | unsigned long long |
string | str::string | builtins.str | string |
各ビルトイン型は配列としても使用できます。
型名 | C++ | Python | DDS における型 |
---|---|---|---|
static array | std::array<T,N> | builtin.list* | T[N] |
unbounded dynamic array |
std::vector | builtin.list* | sequence |
bounded dynamic array |
custom_class<T,N> | builtin.list* | sequence<T,N> |
bounded string | std::string | builtin.str* | string |
ROS 定義よりも許容度の高い型については、変数範囲や文字列長を強制的に ROS の制約側に合わせるよう調整されます。
配列とサイズ固定型を使ったメッセージ定義の例:
int32[] unbounded_integer_array int32[5] five_integers_array int32[<=5] up_to_five_integers_array string string_of_unbounded_size string<=10 up_to_ten_characters_string string[<=5] up_to_five_unbounded_strings string<=10[] unbounded_array_of_string_up_to_ten_characters each string<=10[<=5] up_to_five_strings_up_to_ten_characters_each
2.1.2 フィールド名
フィールド名は、単語を区切るためのアンダースコアを含む小文字の英数字でなければなりません。開始文字は英字でなければなく、かつアンダースコアで終わってはいけません。アンダースコアを2つ連続で使用してもいけません。
2.1.3フィールドデフォルト値
デフォルト値は、メッセージタイプの任意のフィールドに設定できます。現在のデフォルト値は、文字列配列と複雑な型(つまり、全てのネストされたメッセージに適用される上記のビルトイン型のテーブルに存在しない型)ではサポートされていません。
フィールド定義行に3番目の要素を追加することによって、デフォルト値を設定できます。
書式:
fieldtype fieldname fielddefaultvalue
例:
uint8 x 42 int16 y -2000 string full_name "John Doe" int32[] samples [-200, -100, 0, 100, 200]
注意:
- 文字列値は、
'
または"
で定義する必要があります。 - 現在、文字列値はエスケープされません
2.2 定数
各定数定義は、デフォルト値を持つフィールドの仕様と似てはいますが、この値はプログラムで変更することはできません。この値の割り当ては、等号「=」を使用して示されます。
書式:
constanttype CONSTANTNAME=constantvalue
例:
int32 X=123 int32 Y=-123 string FOO="foo" string EXAMPLE='bar'
注意
定数名は大文字にする必要があります。
3. サービス記述仕様
サービスの記述は、ROSパッケージのsrv/
ディレクトリ内の.srv
ファイル内に定義されています。
サービス記述ファイルは、リクエストとレスポンスの msg タイプを「-」で区切って構成されています。 2つの .msg ファイルを「-」で連結することは、正式な書式です。
次は、文字列を受け取り、文字列を返すサービスのごく単純な例です。
string str --- string str
もちろん、もっと複雑になる可能性もあります(ちなみに、同じパッケージからのメッセージを参照したい場合は、パッケージ名を参照してはいけません)。
#request constants int8 FOO=1 int8 BAR=2 #request fields int8 foobar another_pkg/AnotherMessage msg --- #response constants uint32 SECRET=123456 #response fields another_pkg/YetAnotherMessage val CustomMessageDefinedInThisPackage value uint32 an_integer
他のサービスをサービスの中に埋め込むことはできません。