iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

今天是補班日QQ,簡單的介紹ROS的第二種通訊機制:Services

Services


Service是ROS中的另一種通訊方式,與網頁機制中的Request-Response是一樣概念。與Topic不同的是,當Service Server收到Service Client的請求後,會立即回傳結果,而不是像Topic一樣,Server會持續的發送資料給Client。不過Server有Blocking的機制,也就是說,當Server收到Client的請求後,Server會一直等待處理完畢後才會回傳結果,這也是Service與Topic的差異之一。Topic是用來傳送串流資料和連續資料,而Service只有在被呼叫時才傳送資料。

本來想畫圖,但官方的GIF實在太好了,就直接拿來用了。
Service
首先可以看到Client發送Request到Service,接著Service會幫我們把Request傳送給Server,Server處理完後會回傳Response給Service,Service再將Response傳送給Client。其中這段時間,Client會一直等待Server回傳Response,這就是Blocking的機制。

Mutli-Client Services
與Topic不同的是,Services可以有多個Clients,不過只能有一個Server,Server會依序處理Client的Request,也就是說,Server會依序回傳Response給Client。

實際應用上,Service通常用在需要Server回傳結果的情況,例如:機器人的導航系統,Client會傳送目標位置給路徑規劃Server,Server會計算路徑並回傳給Client。此時,Client會再將回傳的路徑傳送給機器人控制系統的Action Server(ROS的第三種通訊機制),機器人控制系統會依照路徑移動。

QoS


Topic中介紹過的QoS在Service中也是可以使用的,畢竟其底層都是使用DDS。不論是Service Server還是Service Client,都可以透過QoS來設定Service的傳輸品質。可以回顧Day8 ROS2 Topic
中QoS的機制。

Srv


Topic是用來傳送Message,而Service是用來傳送Service。這邊滿容易混淆的要注意。

另外還有一點容易混淆的是,API當中會稱Server為Service,這邊的Service是指Service Server。譬如C++的API中,就是以node->create_service來建立Service Server,而node->create_client則是建立Service Client。

Service的訊息格式是.srv,與Topic的.msg不同,.srv的格式是RequestResponse,因此會用---來分隔。除此之外,其他的格式都是一樣的。

# request
int64 a
int64 b
---
# response
int64 sum

接下來就會來寫寫看Service Server和Service Client,也會介紹如何自定義Service。

Reference



上一篇
Day10 ROS2 Publisher & Subscriber - C++
下一篇
Day12 ROS2 Service Server 和 Client - Python
系列文
ROS2 及 ROS Porting 自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言