ROS 介面(訊息與服務)

2021-08-21 21:50:10 字數 3655 閱讀 6354

ros應用程式通常通過以下兩種型別之一的介面進行通訊:訊息和服務。ros使用簡化的描述語言來描述這些介面。此描述使ros工具可以輕鬆地為多種目標語言中的介面型別自動生成源**。

在本文件中,我們將介紹支援的型別以及如何建立自己的msg / srv檔案。

訊息描述在ros包中msg/目錄下.msg字尾的檔案中定義。.msg檔案由兩部分組成:欄位和常量。

每個欄位由乙個型別和乙個名稱組成,用空格分隔,即:

fieldtype1 fieldname1

fieldtype2 fieldname2

fieldtype3 fieldname3

例如:

int32 my_int

string my_string

2.1.1欄位型別

字段型別可以是:

目前支援的內建型別:

型別名稱

c ++

python

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

每個內建型別都可用於定義陣列:

型別名稱

c++python

static array

std::array

builtins.list*

t[n]

unbounded dynamic array

std::vector

builtins.list

sequence

bounded dynamic array

custom_class

builtins.list*

sequence

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欄位名稱

欄位名稱必須是帶有下劃線的小寫字母數字字元,用於分隔單詞。它們必須以字母字元開頭,它們不能以下劃線結尾,也不能有兩個連續的下劃線。

2.1.3欄位預設值

可以將預設值設定為訊息型別中的任何字段。當前字串陣列和複雜型別(即上面的內建型別表中不存在的型別,不適用於所有巢狀訊息)不支援預設值

通過向字段定義行新增第三個元素來完成定義預設值,即:

fieldtype fieldname fielddefaultvalue
例如:

uint8 x 42

int16 y -2000

string full_name "john doe"

int32 samples [-200, -100, 0, 100, 200]

注意:

每個常量定義類似於具有預設值的字段描述,但該值永遠不能以程式設計方式更改。通過使用等於'='的符號來指示該值賦值,例如

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訊息和ROS服務

1.1在工作空間下的功能包下新建名為msg的資料夾 新建person.msg檔案 int64 num1.2為確保msg檔案被轉換成python或者其他語言的源 需要修改功能包下package.xml檔案,以新增功能包依賴 message generation build depend message...

ROS 服務 訊息傳遞

定義服務的訊息型別與自定義話題的訊息型別類似 1 首先在軟體包目錄下 新建乙個 srv資料夾,並且新建乙個訊息型別檔案 mkdir roswork space src hello ros srv cd roswork space src hello ros srv touch my srv.srv ...

ROS入門教程 (建立ROS訊息和ROS服務)

參考中文官網 description 本教程詳細介紹如何建立並編譯ros訊息和服務,以及rosmsg,rossrv和roscp命令列工具的使用。01.訊息 msg 和服務 srv 介紹 msg檔案存放在package的msg目錄下,srv檔案則存放在srv目錄下。msg檔案實際上就是每行宣告乙個資料...