ROS2學習之旅(6)——理解ROS2 Graph中的服務
服務是ROS Graph中節點之間相互通訊的一種方式。服務基於呼叫-響應模型,而不是話題的釋出者-訂閱者模型。話題允許節點訂閱資料流並獲得持續更新,而服務只有在客戶端特定呼叫時才提供資料,一個server只能提供一種service。
1.準備
執行/turtlesim
和/teleop_turtle
兩個節點,分別在兩個終端執行:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
此時,出現視窗:
2.ros2 service list
在新終端中執行ros2 service list
/clear /kill /reset /spawn /teleop_turtle/describe_parameters /teleop_turtle/get_parameter_types /teleop_turtle/get_parameters /teleop_turtle/list_parameters /teleop_turtle/set_parameters /teleop_turtle/set_parameters_atomically /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/describe_parameters /turtlesim/get_parameter_types /turtlesim/get_parameters /turtlesim/list_parameters /turtlesim/set_parameters /turtlesim/set_parameters_atomically
可以看到兩個節點具有相同的6個服務,其名稱中包含parameters。幾乎ROS 2中的每個節點都有這些基礎服務,這些服務是引數構建的基礎。在本節中,引數services省略,下節討論。
可以看到與turtle1
相關的服務有:
/clear
/kill
/reset
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
3.ros2 service type
服務訊息具有描述服務的請求和響應的兩種資料型別。服務型別的定義類似於話題型別,服務訊息型別有兩個部分:一個訊息型別用於請求,另一個訊息型別用於響應。
執行如下命令可以得到服務的型別:
ros2 service type <service_name>
檢視/clear
服務的型別,在終端執行:
ros2 service type /clear
此時,終端返回:
std_srvs/srv/Empty
Empty
型別意味著服務呼叫在發出請求時不傳送資料,在接收響應時不接收資料。
3.1ros2 service list -t
想要檢視所有服務的型別,可以在終端輸入:
ros2 service list -t
此時,返回:
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
/teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
/teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
/teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
/teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
/turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
/turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
/turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
/turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
4.ros2 service find
如果需要查詢指定型別的所有服務,可以使用此命令:
ros2 service find <type_name>
例如,想要找到所有服務型別為Empty
的服務,可以執行:
ros2 service find std_srvs/srv/Empty
此時,終端返回:
/clear
/reset
5.ros2 interface show
想要獲得服務訊息的結構,可以執行:
ros2 interface show <type_name>.srv
檢視Empty
的訊息結構:
ros2 interface show std_srvs/srv/Empty
此時,會返回:
---
--
將請求結構(上)與響應結構(下)分開,如前所述,Empty
型別不傳送或接收任何資料。因此,它的結構是空白的。
檢查一個具有傳送和接收資料型別的服務,比如/spawn
。從ros2 service list -t
的執行結果中,可以知道/spawn
的型別是turtlesim/srv/ Spawn
。
要檢視/spawn
呼叫和請求中的引數,執行命令:
ros2 interface show turtlesim/srv/Spawn
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
--
上面的資訊告訴我們呼叫/spawn
所需的引數。x、y和theta決定了新生小海龜的位置,而name是可選的。
--
下面的資訊是從呼叫中獲得的響應的資料型別。
6.ros2 service call
在已知服務型別以及該型別引數的結構時,可以使用以下方法呼叫服務:
ros2 service call <service_name> <service_type> <arguments>
'<arguments>'
部分是可選的。例如,空型別的服務沒有任何引數:
ros2 service call /clear std_srvs/srv/Empty
此命令將清除turtlesim
視窗中已繪製的任何線條。
接下來通過呼叫/spawn
並輸入引數來生成一個新的海龜。'<arguments>'
在一個來自命令列的服務呼叫中需要使用YAML語法。
在終端執行:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
在終端得到服務響應:
waiting for service to become available...
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
response:
turtlesim.srv.Spawn_Response(name='turtle2')
7.總結
節點可以使用ROS2中的服務進行通訊,是一種請求/響應模式,客戶端發出請求,節點提供服務和處理服務請求並生成一個響應。
當不希望使用一個服務來連續呼叫,話題或者動作會更合適。
如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。