在介紹完 Publisher 以及 Subscriber 後,我們即將介紹 ROS 架構中的 Service 與 Parameter。簡單來說,Nodes 之間除了透過 Topics 溝通之外,也能利用服務 (Services) 傳輸所需的 data。而 Parameters 指的是系統參數,我們能輕易的透過此參數來針對 ROS 專案中的某個部分進行修改。那麼接下來就開始進入正題吧!
與 Topics 不同的地方在於, Services 是一種同時包含了 Request 及 Response 的訊息機制。何謂 Request-Response? 在 Topic 裡頭有 Publisher 以及 Subscriber,兩者是由 Publisher 向 Topic 發布訊息,Subscriber 才會接收到訊息。但在 Service 裡只有 Server 與 Client,Client 必須透過 Service 向 Server 提出 Request,而 Server 才會回傳對應的 Response 給 Client。我們可以用簡單的圖例來解釋 Request-Response:
我們可以在 turtlesim_node 當中試著使用 Services,首先開啟好小烏龜,並且在另一 Terminal 當中輸入 rosservice list
:
可以看到出現了許多 Services,其中開頭為 /rosout
的兩個 Services 就是之前所說 ROS 底下的 log所產生,至於其他的 /clear
, /kill
, /reset
等等就是我們小烏龜帶有的 Services。我們可以透過 rosservice call [service]
來執行這些 Services:
注意小烏龜的視窗當中,不論是軌跡或者烏龜的圖形都被刷新了!接著我們可以透過 rosservice type [service] | rossrv show
來清楚的到 Service 的 Request-Response 格式:
Request-Response 以"---"符號區分各自的格式,以上為 Request 以下為 Response。可以看到 /reset
這項 Service 不需要提供 Request,Response 亦不回傳任何訊息!讓我們再看看其他的 Services:
/spawn
這項 Service 需要提供的 Request 有四個,其實這項 Service 就是你提供 x、 y、 theta、 name 後,就會幫你在視窗當中的 (x,y) 位置,生成一隻角度為 theta,名稱為 name 的小烏龜,讓我們實際試試看:
Services 大致上就介紹到這邊,重點就在於 Request-Response 的訊息格式是與 Topics 的 Message 是不同的!
Parameter 被存放於 ROS Master下的 Parameter Server,可以供整個 ROS 專案當中所有的 Nodes 作存取。由於一個機器人所攜帶的參數會相當多,為了避免每次修改參數時都需要重新編譯程式,因此利用 Parameter Server 來管理這些系統參數,能達到方便管理與修改的目的。
我們可以透過 rosparam list
來查看目前有哪些系統參數,不過 Parameter Server 是存在於 ROS Master 下,因此我們必須在開啟 ROS Master 的狀況下才能查看有哪些 Parameter:
知道有哪些 Parameter 後,我們可以利用 rosparam get [param_name]
來獲取 Parameter 的參數:
此外,我們也能透過 rosparam set [param_name] <value>
來設定我們想要給定的參數值:
設定完成後,我們來使用剛剛提到的 Service 指令 rosservice call /clear
,看看小烏龜視窗的變化:
以上就是 Parameter 的介紹,雖然我們只用了基本的小烏龜來進行解說,但愈龐大的 ROS 專案其 Parameter 的重要性也愈大,如何有效的設定並運用 Parameter 對於 ROS 架構而言是相當重要的。
簡單總結一下今天的內容,今天介紹了 ROS Services 與 Parameters,Services 類似於 Message 的概念,但並非透過 Topic 來傳遞訊息,而是藉由 Request-Response 機制來完成;Parameters 則是能夠讓你快速調整 ROS 專案當中的某些數據,省去到內部程式修改、編譯的時間。雖然只有簡單介紹兩者的概念,但瞭解這些功能也是相當重要的。明天我們則會開始介紹 Xml 格式,為之後的 launch 檔做鋪陳,那麼就請各位敬請期待!