1. 程式人生 > 其它 >ROS2學習之旅(8)——理解ROS2 Graph中的動作

ROS2學習之旅(8)——理解ROS2 Graph中的動作

ROS2中的動作伺服器...

動作是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.總結

動作類似於服務,允許執行長時間執行的任務,提供定期反饋,並可取消。

機器人系統可以使用動作來導航。動作目標可以告訴機器人移動到某個位置,當機器人導航到該位置時,它可以沿途傳送更新資訊(即反饋),然後在到達目的地後傳送最終結果資訊。

如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。