• ROS2系列知识(6):Action服务概念


    一、背景

            Action是 ROS 2 中的一种通信类型,适用于长时间运行的任务。它们由三个部分组成:目标、反馈和结果。

            操作建立在主题和服务之上。它们的功能类似于服务,除了可以取消操作。它们还提供稳定的反馈,而不是返回单一响应的服务。

            操作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中描述)。 “动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈流和结果。

    二、开启演示方式

    启动海龟案例的两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。

    打开一个新终端并运行:

    ros2 run turtlesim turtlesim_node

    打开另一个终端并运行:

    ros2 run turtlesim turtle_teleop_key

    三、使用动作action

    当您启动 /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.

    让我们关注第二行,它对应一个动作。 其中:

     (G|B|V|C|D|E|R|T对应一条指令,而该指令对应于“cmd_vel”主题。F对应另一个指令,另一个动作)

            请注意,字母键 G|B|V|C|D|E|R|T 在美国 QWERTY 键盘上的 F 键周围形成一个“框”(如果您不使用 QWERTY 键盘,请参阅此链接以跟随)。每个键在 F 周围的位置对应于 turtlesim 中的方向。例如,E 会将海龟的方向旋转到左上角。

            注意运行 /turtlesim 节点的终端。每次按下其中一个键时,都会向作为 /turtlesim 节点一部分的操作服务器发送一个目标。目标是旋转乌龟以面向特定方向。一旦海龟完成其旋转,应显示一条中继目标结果的消息:

    1. [INFO] [turtlesim]: Rotation goal completed successfully
    2. ([INFO] [turtlesim]:轮换目标成功完成)

            F 键将在执行过程中取消目标。

            尝试按 C 键,然后在海龟完成旋转之前按 F 键。在 /turtlesim 节点正在运行的终端中,您将看到以下消息:

    1. [INFO] [turtlesim]: Rotation goal canceled
    2. [INFO] [turtlesim]:轮换目标取消

            不仅客户端(您在 Teleop 中的输入)可以停止目标,服务器端(/turtlesim 节点)也可以。当服务器端选择停止处理一个目标时,它被称为“中止”该目标。

            尝试按 D 键,然后在完成第一次旋转之前按 G 键。在 /turtlesim 节点正在运行的终端中,您将看到以下消息:

    1. [WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
    2. [WARN] [turtlesim]:在上一个目标完成之前收到轮换目标。中止先前的目标

            此操作服务器选择中止第一个目标,因为它有一个新目标。它本可以选择其他方式,比如拒绝新目标或在第一个目标完成后执行第二个目标。不要假设每个动作服务器在获得新目标时都会选择中止当前目标。

    四、ros2 节点信息

    4.1 查看 /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
      Service Servers:
        /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
      Service Clients:

      Action Servers:
        /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
      Action Clients:

            请注意,/turtlesim 的 /turtle1/rotate_absolute 操作位于操作服务器下。这意味着 /turtlesim 响应 /turtle1/rotate_absolute 操作并提供反馈。

    4.2 查看 /teleop_turtle节点的操作 

            /teleop_turtle 节点在 Action Clients 下的名称为 /turtle1/rotate_absolute,这意味着它为该动作名称发送目标。

    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

    4.3 查看节点对比后结论

            /turtlesim和 /teleop_turtle是一对action的服务器、客户端。通过以上信息对比,不难获得下列结论:

    1)在ROS2的节点基类中,存在六个基本模块:

    • Subscribers:
    • Publishers:
    • Service Servers:
    • Service Clients
    • Action Servers: 
    • Action Clients:

    2)六个模块,表示六种身分。每个节点可以是六模块中的任意一个或多个角色。

    3)看上例得出: /turtlesim是action的服务器, /teleop_turtle是action的客户端。

    五、针对于Action的特殊操作

    5.1 ros2 action列表

            要识别 ROS 图中的所有操作,请运行以下命令:

    ros2 action list

            返回信息是action的名称

    /turtle1/rotate_absolute

    这是目前 ROS 图中唯一的动作服务,其topic名为/turtle1/rotate_absolute。

            如您之前所见,它控制海龟的旋转。您还已经知道,通过使用 ros2 node info 命令,该操作有一个操作客户端(/teleop_turtle 的一部分)和一个操作服务器(/turtlesim 的一部分)。

    5.2 ros2 action list -t  动作有类型 

    类似于主题和服务。要查找 /turtle1/rotate_absolute 的类型,请运行以下命令:

     ros2 action list -t 

    会返回action的类型:

    /turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

    在每个动作名称右侧的括号中(在这种情况下只有 /turtle1/rotate_absolute)是动作类型,turtlesim/action/RotateAbsolute。当您想从命令行或代码执行操作时,您将需要它。

    5.3 ros2 动作信息

            您可以使用以下命令进一步检查 /turtle1/rotate_absolute 操作:

    ros2 action info  /turtle1/rotate_absolute

    返回信息是action的发起方和接收方:

    1. Action: /turtle1/rotate_absolute
    2. Action clients: 1
    3. /teleop_turtle
    4. Action servers: 1
    5. /turtlesim

            这告诉我们之前在每个节点上运行 ros2 节点信息所学到的知识:/teleop_turtle 节点有一个动作客户端,/turtlesim 节点有一个用于 /turtle1/rotate_absolute 动作的动作服务器。

    5.4 ros2界面显示

            在您自己发送或执行操作目标之前,您需要的另一条信息是操作类型的结构。

            回想一下,您在运行命令 ros2 action list -t 时确定了 /turtle1/rotate_absolute 的类型。如果想看到topic数据类型的内部定义,可在终端中输入以下带有操作类型的命令:

    ros2 interface show  < action的类型>  

    在本案例:

    ros2 interface show turtlesim/action/RotateAbsolute

    会返回:

    1. # The desired heading in radians
    2. float32 theta
    3. ---
    4. # The angular displacement in radians to the starting position
    5. float32 delta
    6. ---
    7. # The remaining rotation in radians
    8. float32 remaining

            此消息的第一部分,在 --- 上方,是目标请求的结构(数据类型和名称)。下一部分是结果的结构。最后一部分是反馈的结构。

    5.5 ros2 手工发送动作请求 

            现在让我们使用以下语法从命令行发送一个动作目标:

    ros2 action send_goal <action_name> <action_type> <values>
    •   需要采用 YAML 格式。
    • 密切注意turtlesim窗口

    然后在终端中输入以下命令:

    ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

    您应该看到海龟旋转,以及终端中的以下消息:

    1. Waiting for an action server to become available...
    2. Sending goal:
    3. theta: 1.57
    4. Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444
    5. Result:
    6. delta: -1.568000316619873
    7. Goal finished with status: SUCCEEDED

            所有目标都有一个唯一的 ID,显示在返回消息中。您还可以看到结果,一个名为 delta 的字段,它是到起始位置的位移。

            要查看此目标的反馈,请将 --feedback 添加到 ros2 action send_goal 命令:

    ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback

            终端将返回消息:

    1. Sending goal:
    2. theta: -1.57
    3. Goal accepted with ID: e6092c831f994afda92f0086f220da27
    4. Feedback:
    5. remaining: -3.1268222332000732
    6. Feedback:
    7. remaining: -3.1108222007751465
    8. Result:
    9. delta: 3.1200008392333984
    10. Goal finished with status: SUCCEEDED

    您将继续收到反馈,剩余的弧度,直到目标完成。

    注意:这里的 ros2 action send_goal ros2 topic pub类似都是调试节点的好工具!!!

    六、总结

            action类似于允许您执行长时间运行的任务、提供定期反馈并且可以取消的服务。

            机器人系统可能会使用action进行导航。action目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。

            Turtlesim 有一个动作服务器(Action),动作客户端可以将目标发送到旋转海龟。在本教程中,您明白动作 /turtle1/rotate_absolute,以及是什么,它们如何工作。

    Understanding actions — ROS 2 Documentation: Humble documentation

     ROS on DDS (ros2.org)

  • 相关阅读:
    STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)
    arm-2d头文件概述
    JavaSE第三节————运算符
    局域网上IP多播与IP单播关于MAC地址的区别
    Spring框架学习技术清单
    计算机毕业设计Java智慧防疫上报系统服务端(源码+系统+mysql数据库+Lw文档)
    活动推广的作用有哪些呢?
    算法必刷系列之查找、排序
    安全防御(四)--- 恶意软件及其特征、分类、免杀技术,反病毒技术,反病毒网关工作过程及其配置
    数据服务安全的重要性
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/126088129