ROS2編程基礎課程--介面
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ZhangRelay/article/details/100773009
About ROS 2 Interfaces 關於ROS 2介面
Table of Contents 目錄
2. Message Description Specification 消息說明規範
2.1 Fields 欄位
2.1.1 Field Types 欄位類型
2.1.2 Field Names 欄位名稱
2.1.3 Field Default Value 欄位默認值
3. Service Description Specification 服務描述規範
1. Background 背景
ROS applications typically communicate through interfaces of one of two types: messages and services. ROS uses a simplified description language to describe these interfaces. This description makes it easy for ROS tools to automatically generate source code for the interface type in several target languages.
ROS應用程式通常通過以下兩種類型之一的介面進行通訊:消息和服務。ROS使用簡化的描述語言來描述這些介面。此描述使ROS工具可以輕鬆地為多種目標語言中的介面類型自動生成源程式碼。
In this document we will describe the supported types and how to create your own msg/srv files.
在本節將介紹支援的類型以及如何創建自定義的msg / srv文件。
2. Message Description Specification
消息說明規格
Messages description are defined in .msg files in the msg/ directory of a ROS package. .msg files are composed of two parts: fields and constants.
消息描述定義在ROS包msg/目錄的.msg文件中。 .msg文件由兩部分組成:欄位和常量。
2.1 Fields 欄位
Each field consists of a type and a name, separated by a space, i.e:
每個欄位由一個類型和一個名稱組成,用空格分隔,即:
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
For example: 例如:
int32 my_int
string my_string
Field types can be: 欄位類型可以是:
- a built-in-type
內置式
- names of Message descriptions defined on their own, such as 「geometry_msgs/PoseStamped」
自定義的消息描述的名稱,例如「geometry_msgs/PoseStamped」
Built-in-types currently supported: 目前支援的內置類型:
Type name | C++ | Python | DDS type |
|---|---|---|---|
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 |
Every built-in-type can be used to define arrays: 每個內置類型都可用於定義數組:
Type name | C++ | Python | DDS type |
|---|---|---|---|
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 |
All types that are more permissive than their ROS definition enforce the ROS constraints in range and length by software
所有比ROS定義更寬鬆的類型都通過軟體強制執行ROS範圍和長度約束!
Example of message definition using arrays and bounded types: 使用數組和有界類型的消息定義示例:
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
Field names must be lowercase alphanumeric characters with underscores for separating words. They must start with an alphabetic character, they must not end with an underscore and never have two consecutive underscores. 欄位名稱必須是帶有下劃線的小寫字母數字字元,用於分隔單詞。它們必須以字母字元開頭,它們不能以下劃線結尾,也不能有兩個連續的下劃線。
2.1.3 Field Default Value 欄位默認值
Default values can be set to any field in the message type. Currently default values are not supported for string arrays and complex types (i.e. types not present in the built-in-types table above, that applies to all nested messages)
可以將默認值設置為消息類型中的任何欄位。當前字元串數組和複雜類型(即上面內置類型表中不存在的類型,不適用於所有嵌套消息)不支援默認值
Defining a default value is done by adding a third element to the field definition line, i.e:
通過向欄位定義行添加第三個元素來定義默認值,即:
fieldtype fieldname fielddefaultvalue
For example: 例如:
uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]
Note: 注意:
- string values must be defined in single ' or double quotes " 字元串值必須用單引號'或雙引號"定義
- currently string values are not escaped 當前字元串值不會被轉義
2.2 Constants 常數
Each constant definition is like a field description with a default value, except that this value can never be changed programatically. This value assignment is indicated by use of an equal 『=』 sign, e.g.
每個常量定義類似於具有默認值的欄位描述,但該值永遠不能以編程方式更改。通過使用等於'='的符號來完成該值賦值,例如
constanttype CONSTANTNAME=constantvalue
For example: 例如:
int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'
Note 注意
Constants names have to be UPPERCASE 常量名稱必須是大寫的
3. Service Description Specification
服務描述規範
Services description are defined in .srv files in the srv/ directory of a ROS package.
服務描述在ROS包srv/目錄中的.srv文件中定義。
A service description file consists of a request and a response msg type, separated by 『—』. Any two .msg files concatenated together with a 『—』 are a legal service description.
服務描述文件由請求和響應消息類型組成,以「 - 」分隔。任何兩個.msg文件與' --- '連接在一起是合法的服務描述。
Here is a very simple example of a service that takes in a string and returns a string:
下面是一個非常簡單的服務示例,它接受一個字元串並返回一個字元串:
string str
---
string str
We can of course get much more complicated (if you want to refer to a message from the same package you must not mention the package name):
當然可以實現更複雜的(如果想引用來自同一個包的消息,不能提到包名):
#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
You cannot embed another service inside of a service.
無法在服務中嵌入其他服務。