ROS2學習之旅(8)——理解ROS2 Graph中的動作
動作是ROS2中的一種通訊型別,用於長時間執行的任務,它由三個部分組成:目標、反饋和結果。
動作建立在話題和服務之上,它的功能類似於服務,但動作是搶佔式的(可以在執行時取消它們)。它還提供穩定的反饋,而不是隻返回一個響應的服務。
動作使用客戶機-伺服器模型,類似於釋出者-訂閱者模型。“動作客戶端”節點向“動作伺服器”節點發送一個目標,該節點確認目標並返回一個反饋流和一個結果。
1.準備
執行/turtlesim
和/teleop_turtle
兩個節點,分別在兩個終端執行:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
此時,出現視窗:
2.使用動作
當啟動teleop_turtle
節點時,在終端中輸出:
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
'Q' to quit.
第二行對應一個動作。
注意:字母鍵G|B|V|C|D|E|R|T
在鍵盤上的F
鍵周圍形成一個“方框”,F
周圍的每個鍵的位置都對應於turtlesim
中海龜方向。例如,E會將海龜的方向旋轉到左上角。
請注意執行/turtlesim
/turtlesim
節點的的動作伺服器傳送了一個目標,目標是將海龜旋轉到一個特定的方向。一旦海龜完成旋轉,就會顯示傳遞目標結果的訊息:
[INFO] [turtlesim]: Rotation goal completed successfully
F
鍵將在執行過程中取消目標,演示了動作的可搶佔特性。
試著按C
鍵,然後在海龜完成旋轉之前按F
鍵。在/turtlesim
節點執行的終端中,將看到以下訊息:
[INFO] [turtlesim]: Rotation goal canceled
不僅客戶端(在teleop
中的輸入)可以搶佔目標,伺服器端(/turtlesim
試著按下D
鍵,然後在旋轉完成之前按下G
鍵。在/turtlesim
節點執行的終端中,將看到以下訊息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
伺服器端中止了第一個目標,因為它被中斷了。
3.ros2 node info
查詢/turtlesim
節點中的動作,可以執行:
ros2 node info /turtlesim
終端將返回/turtlesim
的訂閱者、釋出者、服務、動作伺服器和動作客戶端列表:
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/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
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
注意:/turtle1/rotate_absolute
動作在Action Servers
下,這表示/turtlesim
響應/turtle1/rotate_absolute
動作並提供反饋。
檢視teleop_turtle
節點的資訊:
ros2 node info /teleop_turtle
終端返回:
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/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
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
在Action Clients
下,有名為/turtle1/rotate_absolute
的節點,這意味著它為該動作名稱傳送目標。
4.ros2 action lsit
要識別ROS Graph中的所有動作,執行命令:
ros2 action list
終端返回:
/turtle1/rotate_absolute
這是ROS Graph中唯一的動作,如前所述,它控制海龜的旋轉。
4.1ros2 action list -t
檢視所有動作的型別,可以執行:
ros2 action list -t
此時,返回:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在每個動作名稱(在本例中僅為/turtle1/rotate_absolute
)右側的方括號中是動作型別turturlesim /action/RotateAbsolute
。當希望從命令列或程式碼執行操作時,將需要它。
5.ros2 action info
可以通過info
進一步得到有關動作的資訊,執行:
ros2 action info /turtle1/rotate_absolute
此時,返回:
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
可以得到:/teleop_turtle
節點有一個動作客戶端,/turtlesim
節點有一個動作伺服器,用於/turtle1/rotate_absolute
動作。
6.ros2 interface show
在傳送或執行操作目標之前,還需要了解動作型別的結構。在執行命令ros2 action list -t
時,確定了/turtle1/rotate_absolute
的型別。在終端中輸入以下的命令:
ros2 interface show turtlesim/action/RotateAbsolute
此時,終端返回:
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
該訊息的第一部分(位於--
之上)是目標請求的結構(資料型別和名稱),中間一節是結果的結構,最後一部分是反饋的結構。
7.ros2 action send_goal
從命令列傳送一個動作目標:
ros2 action send_goal <action_name> <action_type> <values>
<values>
必須是YAML形式。
在終端執行:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
海龜在旋轉,並可以在終端得到,
Waiting for an action server to become available...
Sending goal:
theta: 1.57
Goal accepted with ID: 85bd38f0238745e6af4bf2a64a941133
Result:
delta: 3.1200063228607178
Goal finished with status: SUCCEEDED
所有目標都有一個唯一的ID,顯示在返回訊息中,還可以看到結果,一個名為delta
的欄位,它是到起始位置的位移。
要檢視此目標的反饋,命令列最後新增--feedback
:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
此時,終端輸出:
Sending goal:
theta: -1.57
Goal accepted with ID: e6092c831f994afda92f0086f220da27
Feedback:
remaining: -3.1268222332000732
Feedback:
remaining: -3.1108222007751465
…
Result:
delta: 3.1200008392333984
Goal finished with status: SUCCEEDED
將持續收到反饋,直到目標完成。
8.總結
動作類似於服務,允許執行長時間執行的任務,提供定期反饋,並可取消。
機器人系統可以使用動作來導航。動作目標可以告訴機器人移動到某個位置,當機器人導航到該位置時,它可以沿途傳送更新資訊(即反饋),然後在到達目的地後傳送最終結果資訊。
如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。