天天看點

ROS 2服務-services-

前序:ROS 2主題-topics-

本節詳細介紹服務service。

1. 如何了解服務service:

服務是ROS圖中節點通信的另一種方法。 服務基于調用-響應模型,不同于主題的釋出-訂閱模型。 主題實作節點訂閱資料流并獲得連續更新,但是服務僅在用戶端專門調用它們時才提供資料。

注意:本教程中提到的一些概念(例如節點和主題)已在前序教程中介紹。本節需要turtlesim包。 與往常一樣,請不要忘記在打開的每個新終端後更新ROS 2。Linux:source;windows:call。

2. 服務service有哪些指令功能:

使用幫助指令:

ros2 service -h

顯示如下:

ROS 2服務-services-

指令有:

  • call:調用服務
  • find:列出給定類型服務
  • list:列出活動服務表
  • type:輸出服務類型

具體各指令使用細節,使用 ros2 service <command> -h 進行查閱。

3. 服務指令實踐

如之前一樣,先開啟:

  1. ​ros2 run turtlesim turtlesim_node​

  2. ​ros2 run turtlesim turtle_teleop_key​

3.1 清單

看看有哪些服務被啟動了?

ros2 service list

ROS 2服務-services-

看到兩個節點都具有相同的六個服務,它們的名稱帶有參數。 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 輸出數量
ROS 2服務-services-
ros2 service list -t      

顯示如下:

ROS 2服務-services-

3.4 類型

如果需要查找給定類型,使用這些類型的服務使用如下指令:

ros2 service find <type_name>      

比如查找空Empty類型

ros2 service find std_srvs/srv/Empty      

會傳回:

ROS 2服務-services-

3.5 接口

可以從指令行調用服務,但是首先需要了解輸入參數的結構。

ros2 interface show <type_name>.srv      

例如,服務/clear的類型Empty:

ros2 interface show std_srvs/srv/Empty.srv      

顯示

---

---将請求結構(上方)與響應結構(下方)分開。 但是,正如先前所了解的,Empty類型不會發送或接收任何資料。 是以,自然地,它的結構是空白的。

再如/spawn

ROS 2服務-services-

---行上方的資訊可知調用/spawn所需的參數。 x,y和theta确定了小烏龜的位置和角度,命名是可選的。

在這種情況下,不需要了解該行下方的資訊,但可以幫助了解通過調用獲得的響應的資料類型。

3.6 調用

現在已經知道什麼是服務類型,如何找到服務類型以及如何找到該類型的參數結構,可以使用以下指令調用服務:

ros2 service call <service_name> <service_type> <arguments>      

更多内容:

ROS 2服務-services-

<arguments>部分是可選的。 例如,Empty類型的服務沒有任何參數:

如下指令将清除turtlesim視窗中小烏龜繪制的所有線條。

之前:

ROS 2服務-services-

指令:

ros2 service call /clear std_srvs/srv/Empty      

之後:

ROS 2服務-services-
ROS 2服務-services-

現在,通過調用/spawn并輸入參數來生成一隻新的烏龜。 在指令行中進行服務調用輸入的<arguments>必須采用YAML文法。

輸入指令:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"      

回應如下:

ROS 2服務-services-

雖然沒有指定名稱,但是系統給定turtle2。

ROS 2服務-services-

節點可以使用ROS 2中的服務進行通信。服務僅将資訊傳遞給節點(如果該節點明确要求該資訊),并且每個請求僅将資訊傳遞一次(而不是連續流)。 通常不希望使用服務進行連續調用; 否則主題甚至行動将更适合。

繼續閱讀