前序:ROS 2主題-topics-
本節詳細介紹服務service。
1. 如何了解服務service:
服務是ROS圖中節點通信的另一種方法。 服務基于調用-響應模型,不同于主題的釋出-訂閱模型。 主題實作節點訂閱資料流并獲得連續更新,但是服務僅在用戶端專門調用它們時才提供資料。
注意:本教程中提到的一些概念(例如節點和主題)已在前序教程中介紹。本節需要turtlesim包。 與往常一樣,請不要忘記在打開的每個新終端後更新ROS 2。Linux:source;windows:call。
2. 服務service有哪些指令功能:
使用幫助指令:
ros2 service -h
顯示如下:
指令有:
- call:調用服務
- find:列出給定類型服務
- list:列出活動服務表
- type:輸出服務類型
具體各指令使用細節,使用 ros2 service <command> -h 進行查閱。
3. 服務指令實踐
如之前一樣,先開啟:
-
ros2 run turtlesim turtlesim_node
-
ros2 run turtlesim turtle_teleop_key
3.1 清單
看看有哪些服務被啟動了?
ros2 service list
看到兩個節點都具有相同的六個服務,它們的名稱帶有參數。 ROS 2中幾乎每個節點都具有類似結構。 在下一個教程中将有更多關于參數的資訊。 在本教程中,将不讨論服務中的參數。
針對其中一些服務進行學習,如果感覺不熟練,推薦複習一下turtlesim和rqt簡介教程。
3.2 類型
服務的資料類型采用具有描述服務請求和響應的結構。 服務類型的定義與主題類型相似,不同的是,服務類型包括兩部分:
一個消息用于請求,另一個消息用于響應。
- 請求
- 響應
例如,一個典型的主題類型color:
uint8 r
uint8 g
uint8 b
定義了r g b三色。
而一個典型的服務類型setpen:
uint8 r
uint8 g
uint8 b
uint8 width
uint8 off
---
此處注意并沒有消息用于響應,但是又---
又例如spawn:
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
要找出服務的類型,請使用以下指令:
ros2 service type <service_name>
比如服務/clear
ros2 service type /clear
顯示
std_srvs/srv/Empty
空類型表示服務調用在送出請求時不發送任何資料,而在接收響應時不接收任何資料。
看看ros2 service type /spawn
turtlesim/srv/Spawn
3.3 清單
這個指令類似topic,用法也類似:
ros2 service list -h
- -h 幫助
- -t 顯示類型
- -c 輸出數量
ros2 service list -t
顯示如下:
3.4 類型
如果需要查找給定類型,使用這些類型的服務使用如下指令:
ros2 service find <type_name>
比如查找空Empty類型
ros2 service find std_srvs/srv/Empty
會傳回:
3.5 接口
可以從指令行調用服務,但是首先需要了解輸入參數的結構。
ros2 interface show <type_name>.srv
例如,服務/clear的類型Empty:
ros2 interface show std_srvs/srv/Empty.srv
顯示
---
---将請求結構(上方)與響應結構(下方)分開。 但是,正如先前所了解的,Empty類型不會發送或接收任何資料。 是以,自然地,它的結構是空白的。
再如/spawn
---行上方的資訊可知調用/spawn所需的參數。 x,y和theta确定了小烏龜的位置和角度,命名是可選的。
在這種情況下,不需要了解該行下方的資訊,但可以幫助了解通過調用獲得的響應的資料類型。
3.6 調用
現在已經知道什麼是服務類型,如何找到服務類型以及如何找到該類型的參數結構,可以使用以下指令調用服務:
ros2 service call <service_name> <service_type> <arguments>
更多内容:
<arguments>部分是可選的。 例如,Empty類型的服務沒有任何參數:
如下指令将清除turtlesim視窗中小烏龜繪制的所有線條。
之前:
指令:
ros2 service call /clear std_srvs/srv/Empty
之後:
現在,通過調用/spawn并輸入參數來生成一隻新的烏龜。 在指令行中進行服務調用輸入的<arguments>必須采用YAML文法。
輸入指令:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
回應如下:
雖然沒有指定名稱,但是系統給定turtle2。
節點可以使用ROS 2中的服務進行通信。服務僅将資訊傳遞給節點(如果該節點明确要求該資訊),并且每個請求僅将資訊傳遞一次(而不是連續流)。 通常不希望使用服務進行連續調用; 否則主題甚至行動将更适合。