ROS2学习(八).ROS概念 - ROS 2接口(Ros2 interface)
ROS 2接口
- 背景
- 消息描述規范
- Fields*字段*
- Fields type*字段類型*
- Fields name*字段名稱*
- Fields default value*字段默認值*
- Constant*常量*
- 服務描述規范
- ROS 2的新功能
背景
ROS應用程序通過消息、服務和操作三種類型的接口來進行通信。
ROS2使用即接口定義語言(IDL)來描述這些接口,這種接口定義語言非常簡單。
IDL使得ROS工具可以較輕易地自動生成多種目標語言接口類型的源代碼。
接口包括
- msg消息: .msg文件是描述ROS消息字段的簡單文本文件。 它們用于為不同語言的消息生成源代碼。
- srv服務:.srv文件是用于描述服務的。 它們由請求和響應兩部分組成。 請求和響應都是一個消息聲明。
- action操作: .action文件描述操作。 它們由目標、結果和反饋三個部分組成。 每個部分都是一個消息聲明。
消息描述規范
消息被定義于ROS包的msg/目錄下的.msg文件中,.msg由fields字段和constants常量兩部分構成。
Fields字段
每個field由一個type類型和一個name名稱組成,由空格隔開,格式如下:
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
例如:
int32 my_int
string my_string
Fields type字段類型
字段類型包括
- 內置類型
- 自定義的消息描述名稱,例如“geometry_msgs/PoseStamped”
內置類型:
| 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 |
| wstring | std::u16string | builtins.str | wstring |
內置類型均可支持數組如下:
| 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 |
如下例:
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
Fields name字段名稱
字段名稱必須是小寫字母、數字和字符,用下劃線用于分隔單詞。須以字母字符開始,不能以下劃線結束,并且不能有兩個連續的下劃線。
Fields default value字段默認值
消息類型中的任意字段均可設置默認值。
目前尚不支持字符串數組和復雜類型的默認值。
定義默認值是通過向字段定義行添加第三個元素來實現的,即:
fieldtype fieldname fielddefaultvalue
例:
uint8 x 42
int16 y -2000
string full_name “John Doe”
int32[] samples [-200, -100, 0, 100, 200]
注意
- 字符串值需要以單引號’或雙引號"進行定義
- 目前字符串不支持轉義符
Constant常量
常量定義使用類似帶有默認值的字段描述的方式來定義。這個值永遠無法通過編程方式更改。常量采用等號’ = '表示進行賦值:
constanttype CONSTANTNAME=constantvalue
例:
int32 X=123
int32 Y=-123
string FOO=“foo”
string EXAMPLE=‘bar’
注意
常量名必須使用大寫字符
服務描述規范
服務被定義于ROS包的srv/目錄下的.srv文件中。
一個服務描述文件包含有請求和相應的消息格式,由‘-’分隔。任意兩個由‘-’的連接的.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我們不能在服務中循環嵌套使用服務。
ROS 2的新功能
ROS 2 IDL與ROS 1 IDL密切相關。大多數現有的ROS 1 .msg和.srv文件在ROS 2可以繼續使用。 在ROS 1現有功能集的基礎上,ROS 2 IDL引入了一些新功能,即:
- 有界數組 : 盡管ROS 1 IDL允許無界數組(如int32[] foo)和固定大小的數組(如int32[5] bar), ROS 2 IDL進一步允許有界數組(如int32[<=5] bat)。
有界數組能夠為數組的大小設置一個上限(例如在一個實時系統中,你需要預先分配在執行期間將使用的所有內存)。 - 有界字符串:ROS1 IDL允許無限制的字符串(例如字符串foo), ros2 IDL進一步允許有界字符串(例如字符串<=5 bar)。
- 默認值:盡管ROS 1 IDL允許常量字段(例如,int32 X=123), ROS 2 IDL進一步允許指定默認值(例如,int32 X 123)。 默認值在構造消息/服務對象時使用,隨后可以通過賦值給字段來重寫。 您還可以為action部分指定默認值。
總結
以上是生活随笔為你收集整理的ROS2学习(八).ROS概念 - ROS 2接口(Ros2 interface)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 20中在LXD容器内安装R
- 下一篇: ROS2学习(九).ROS概念 - RO