MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。

【ROS 2】インターフェースについて(公式文書和訳)

Sponsored Link

ROS 2 公式文書(英語) 日本語訳シリーズです。

本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。

www.moriken254.com

※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

他のサービスをサービスの中に埋め込むことはできません。

翻訳元文書

index.ros.org

関連記事

www.moriken254.com

www.moriken254.com

www.moriken254.com