1.背景
ROS應用程序一般經過如下兩種類型之一的接口進行通訊:消息和服務。ROS使用簡化的描述語言來描述這些接口。這些描述使ROS工具能夠輕鬆地爲多種目標語言的接口類型自動生成源代碼。編程
在本文檔中,咱們將描述支持的類型以及如何建立本身的消息/服務文件。數組
2.消息描述說明
消息描述在ROS文件包中的"msg/"
目錄下的".msg"文件中定義。 .msg
文件由兩部分組成:字段和常量。
2.1字段
每一個字段由一個類型和一個名稱組成,用空格分隔,即:bash
fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3
例如:工具
int32 my_int string my_string
2.2.1字段類型
字段類型能夠是:ui
目前支持的內置類型:
spa
類型名稱 | C++ | Python | DDS 類型 |
bool | bool | builtins.bool | boolean |
byte | uint8_t | builtins.bytes* | octet |
char | char | builtins.str* | char |
float32 | float | builtins.float* | float |
float64 | double | builtins.float* | double |
int8 | int8_t | builtins.int* | octet |
uint8 | uint8_t | builtins.int* | octet |
int16 | int16_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 | std::string | builtins.str | string |
每一個內置類型均可以用來定義數組:
code
類型名稱 | C++ | Python | DDS類型 |
static array | std::array<T,N> | builtins.list* | T[N] |
unbounded dynamic array | std::vector | builtins.list* | sequence |
bounded dynamic array | custom_class<T,N> | builtins.list* | sequence<T,N> |
bounded string | std::string | builtins.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字段名稱
字段名稱必須是小寫字母和數字,可用下劃線分隔。它們必須以字母開頭,不能如下劃線結尾,也不能有兩個連續的下劃線。ip
2.1.3字段默認值
消息類型中的任何字段均可以設置爲默認值。當前字符串數組和複雜類型(即上面內置類型表中不存在的類型,運用於全部嵌套消息)不支持默認值。ci
經過向字段定義行添加第三個元素來定義默認值,即:
fieldtype fieldname fielddefaultvalue
例如:
uint8 x 42 int16 y -2000 string full_name "John Doe" int32[] samples [-200, -100, 0, 100, 200]
注意:
2.2常量
每一個常量定義相似於具備默認值的字段描述,但該值永遠不能以編程方式更改。經過使用等於'='的符號來指示該值賦值,例如
constantype CONSTANTNAME=constantvalue
例如
int32 X=123 int32 Y=-123 string FOO="foo" string EXAMPLE='bar'
注意:
常量名稱必須用大寫字母。
3.服務描述(Service Description)規範
服務描述在ROS包中的srv/
目錄下
的.srv
文件中定義。
服務描述文件由請求和響應消息類型組成,以「 - 」分隔。任何兩個.msg文件用' - '聯繫在一塊兒,就是合法的服務描述。
下面是一個很是簡單的服務示例,它接受一個字符串並返回一個字符串:
string str --- string str
咱們固然能夠變得更復雜(若是你想引用來自同一個包的消息,你就不能提到包名):
#請求常量 int8 FOO=1 int8 BAR=2 #請求字段 int8 foobar another_pkg/AnotherMessage msg --- #迴應常量 uint32 SECRET=123456 #迴應字段 another_pkg/YetAnotherMessage val CustomMessageDefinedInThisPackage value uint32 an_integer
不能在服務中嵌套服務。
英文原文:https://index.ros.org/doc/ros2/Concepts/About-ROS-Interfaces/