前序:ROS 2 | 参数-parameters-   本节详细介绍行动action。   1. 如何理解行动action:   行动action是ROS 2中用于长时间运行任务的通信类型之一。 它由三部分组成:目标,结果和反馈。   行动基于主题和服务。 它们的功能与服务相似,但行动是可抢占的模式(即,可以在执行时将其取消)。 与返回单个响应的服务不同,它们还提供稳定的反馈(过程状态反馈)。   行动使用客户端-服务器端模型,类似于发布者-订阅者模型(已经在主题教程中进行了介绍)。 “行动客户端”节点将目标发送到“行动服务器”节点,该节点确认目标并返回反馈流和一个结果。   2. 行动action有哪些命令功能:   ros2 action -h     命令如下: ·   info:显示行动具体信息 ·   list:输出行动名列表 ·   send_goal:发送行动目标 ·   show:显示行动类型定义   行动消息格式如下: # 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   ·   主题消息,没有--- ·   服务消息,一个--- ·   行动消息,两个---   3. 行动命令实践   启动turtesim案例如下: 1)  ros2 run turtlesim turtlesim_node 2)  ros2 run turtlesim turtle_teleop_key   3.1 小试牛刀   启动/teleop_turtle节点时,在终端中看到以下消息:     专注于第二行,它对应于一个行动。 (第一条指令对应于主题教程中先前讨论的“ cmd_vel”主题。)   请注意,字母键G | B | V | C | D | E | R | T在键盘上的F键周围形成一个“框”。 F周围每个键的位置都对应于turtlesim中的方向。 例如,E会将乌龟的方向旋转到左上角。     注意节点/turtlesim正在运行的终端。 每次按这些键之一,就向一个目标服务器发送目标,该服务器是/ turtlesim节点的一部分。 目标是旋转乌龟以使其朝向特定方向。 乌龟完成旋转后,将显示一条有关目标结果的消息:   E:   V:     F键将取消目标的中间执行,表明行动具有可抢占的功能。   尝试按C键,在乌龟完成旋转之前按F键。 在/turtlesim节点运行的终端中,将看到以下消息:     客户端(在Teleop中的输入)不仅可以抢占目标,而且服务器端(/turtlesim节点)也可以抢占目标。 当服务器端抢占一个行动时,它“中止”了目标。   尝试先按D键,在完成第一次旋转之前按G键。 在/turtlesim节点运行的终端中,将看到以下消息:     服务器端中止了前一个目标,因为它被中断了。   3.2 节点信息(行动)   要查看/turtlesim节点的行动,请打开一个新终端并运行以下命令: ros2 node info /turtlesim   这将返回/turtlesim的订阅者,发布者,服务,行动服务器和行动客户端的列表:     请注意,/turtlesim的行动/turtle1/rotate_absolute位于行动服务器端下。 这意味着/turtlesim会响应行动/turtle1/rotate_absolute并提供反馈。   节点/teleop_turtle在“行动客户端”下具有名称/turtle1/rotate_absolute,这表示它发送该目标行动的名称。 ros2 node info /teleop_turtle     通俗一点: ·   节点turtlesim为行动服务器端 ·   节点teleop_turtle为行动客户端   3.3 行动列表   显示ROS图中的所有行动,运行以下命令: ros2 action list   返回值: /turtle1/rotate_absolute    这是目前ROS图中唯一的行动。 如先前所见,它控制着乌龟的旋转。 使用ros2节点信息<node_name>命令可以为该操作提供一个行动客户端(/teleop_turtle的一部分)和一个行动服务器(/turtlesim的一部分)。   3.4 行动信息   使用以下命令进一步查询/turtle1/rotate_absolute行动: ros2 action info /turtle1/rotate_absolute   返回:     运行ros2节点信息:/teleop_turtle节点有一个行动客户端,/turtlesim节点有一个针对/turtle1/rotate_absolute行动服务器。 3.5 行动接口   发送或执行目标行动之前,需要知道是行动的结构类型。   回想一下,在运行ros2行动列表-t时,已经确定了/turtle1/rotate_absolute的类型。 在终端中输入以下命令和行动类型: ros2 interface show turtlesim/action/RotateAbsolute.action   返回:     该消息的位于---上方的第一部分,是目标请求结构(数据类型和名称)。中间部分是结果的结构。 最下面一部分是反馈的结构。   3.6 命令行发布行动   现在,使用以下语法从命令行发送一个目标行动: ros2 action send_goal <action_name> <action_type> <values>   <values>必须为YAML格式。   密切注意turtlesim窗口,并在终端中输入以下命令: ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: 1.57"}   显示如下:     所有目标都有唯一的ID,如返回消息所示。 还可以看到结果,一个名为delta的字段,它是到起始位置的位移。   要查看此目标的反馈,请将--feedback添加到运行的最后一个命令。 首先,请确保更改theta的值。 运行上一条命令后,乌龟将已经处于1.57弧度的方向,因此除非传递新的theta,否则它不会移动。 ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: -1.57"} --feedback   过程1:     过程2:     将继续收到剩余弧度值的反馈,直到完成目标。   4. 小结   行动类似服务,实现执行长时间运行的任务,提供定期反馈并可以取消。   机器人系统可能会使用行动进行导航。 一个行动目标可以告诉机器人去某个位置。 机器人导航到该位置时,可以沿途发送更新(即反馈),一旦到达目的地,它就会发送最终结果消息。   Turtlesim有一个行动服务器,行动客户端可以将目标发送给旋转的乌龟。 在本教程中,对行动/turtle1/rotate_absolute进行了分析,更好地了解什么是行动以及它们如何工作。