1. 程式人生 > 其它 >ROS2學習之旅(6)——理解ROS2 Graph中的服務

ROS2學習之旅(6)——理解ROS2 Graph中的服務

ROS2中的服務

服務是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中的服務進行通訊,是一種請求/響應模式,客戶端發出請求,節點提供服務和處理服務請求並生成一個響應。

當不希望使用一個服務來連續呼叫,話題或者動作會更合適。

如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。

都看到這了,點個推薦再走吧~

未經允許,禁止轉載。