ROS學習之服務
在ROS中,節點通信有多種方法。筆者在前面講過消息(即一個節點向話題中發布消息,其他多個節點可以訂閱消息。),本篇文章講解另一種方法,服務。服務是兩個節點之間的通信。主要區別如下所示:
1)服務是點對點的,一個節點發送消息,還需要等待接受節點的響應。而消息發布后沒有響應之說,誰訂閱了這個話題,誰就可以讀取到此消息。
2)服務是一對一的,消息可以多對多。
0.1服務專業術語
客戶端:用來向服務器發送請求的。
服務器:接受服務器請求,並采取一定處理回饋給客戶端。
服務數據類型:數據傳輸的類型。
0.2命令行指令
0.2.1服務列表
rosservice list顯示當前所有服務
0.2.2查找提供服務的節點
要完成這個反向查詢,即查找提供給定服務的節點,可以使用這條指令:
rosservice node service-name
正如期望的,當查詢關於任意由 rosnode info /turtlesim 指令列出的服務時,這條指令將給出/turtlesim; 而查詢其他兩條服務時,返回的節點是/rosout。
查找服務的數據類型 可以利用下面的指令來確定一個服務的數據類型:
rosservice info service-name
例如,在終端中輸入下面這條命令
rosservice info /spawn
得到的結果是:
Node: /turtlesim
URI: rosrpc://Donatello:47441
Type: turtlesim/Spawn
Args: x y theta name
可以看到,/spawn 服務的數據類型是 turtlesim/Spawn。同消息類型類似,服務數據類型有兩個部分,其一聲明擁有此數據類型的包,其二聲明類型本身。
0.2.3查詢服務數據類型
當服務的數據類型已知時,我們可以使用rossrv 指令來獲得此服務數據類型的詳情:
rossrv show service-data-type-name
例如:rossrv show turtlesim/Spawn
輸出如下結果:
float32 x
float32 y
float 32 theta
string name
---
string name
在這里,短橫線(---)之前的數據是請求項,這是客戶節點發送到服務節點的信息。短橫線之后的所有字段是響應項,或者說是服務節點完成請求后發送回請求節點的信息。
0.2.4調用服務
為了直觀地觀察服務是如何工作的,你可以使用下面這條指令,從命令行中調用它們:
rosservice call service-name request-content
請求內容部分應該列出請求每一個域的值,正如 rossrv show指令所展示的。下面是一個例子:
rosservice call /spawn 3 3 0 Mikey
這條服務調用的效果是在現有仿真器中,位置 ( x , y ) = (3,3) 處創建一個名為“Mikey”的新海龜,其朝向角度 θ = 0 。
0.3客戶端程序
0.3.1
0.3.2
0.4服務器程序
