action 是 ROS 2 中的一种通信类型,适用于长时间运行的任务。 它们由三个部分组成:目标(goal)、反馈(feedback)和结果(result)。
action 建立在主题(topic)和服务(service)之上。 它们的功能类似于服务(service),除了操作是可抢占的(您可以在执行时取消它们)。 它们还提供稳定的反馈,而不是返回单一响应的服务。
action 使用客户端(Client)-服务器(Server)模型,类似于发布者(publisher)-订阅者(subscriber)模型(在主题(topic)教程中描述)。 “actionClient客户端”节点将目标(goal)发送到“动作服务器(action server)”节点,该节点确认目标并返回反馈流(stream of feedback)和结果(result)。
1.打开小海龟和海龟控制器
2.使用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.
让我们关注第二行,它对应一个action。 (第一行指令对应于“cmd_vel”主题,之前在topic教程中讨论过。)
请注意,字母键 G|B|V|C|D|E|R|T 在键盘上的 F 键周围形成一个“框”。 每个键在 F 周围的位置对应于 turtlesim 中的方向。 例如,E 会将海龟的方向旋转到左上角。
注意运行 /turtlesim 节点的终端。 每次按下其中一个键时,都会向作为 /turtlesim 节点一部分的操作服务器发送一个目标。 目标是旋转乌龟以面向特定方向。 一旦海龟完成其旋转,应在打开小海龟的终端中显示一条中继目标结果的消息:
[INFO] [turtlesim]: Rotation goal completed successfully
F 键会在执行过程中取消一个目标,展示动作的可抢占特性。
尝试按 C 键,然后在海龟完成旋转之前按 F 键。 在 /turtlesim 节点正在运行的终端中,您将看到以下消息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
服务器端中止了第一个目标,因为它被中断了。
3.ros2 node info
运行ros2 node info 可以看到/turtlesim节点的动作(action)信息:
ros2 node info /turtlesim
可以获取节点的subscriber,publisher, service, action server,action client的列表,结果如下:
可以看到节点/turtlesim的动作(action)/turtle1/rotate_absolute是在Action Servers之下的,也就是说/turtlesim响应该动作(action /turtle1/rotate_absolute)并提供反馈。
而/teleop_turtle节点的动作(action)/turtle1/rotate_absolute(和上面的/turtlesim节点动作名字相同),是在Action Clients下面的,也就是说这个动作只是发送这个动作名字的结果
通过运行:ros2 node info /teleop_turtle
可以得到返回值:
4. ros2 action list
执行命令:ros2 action list可以获得所有动作列表,执行后返回:
/turtle1/rotate_absolute
这是目前的ROS图中唯一的动作,这个动作控制海龟的旋转。也可以看到,存在一个action client(属于/teleop_turtle),一个action server(属于/turtlesim)
5.ros2 action list -t
通过ros2 action list -t可以获取动作信息,运行后返回值如下:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在action名字后面的方括号里是action 类型,turtlesim/action/RotateAbsolute,当需要从命令行执行动作时,需要这些信息。
5.ros2 action info
运行命令:ros2 action info /turtle1/rorate_absolute,可以得到返回值:
这里也可以看到之间的信息,存在一个action client(属于/teleop_turtle),一个action server(属于/turtlesim)
6.ros2 interface show
在发送和执行动作前,还需要知道动作的数据类型的结构,运行命令:
ros2 interface show turtlesim/action/RotateAbsolute
可以得到:
---上方的是目标反馈的数据结构,---下方的是结果的数据类型,最后的部分是反馈的数据类型()
7.ros2 action send_goal
目前可以通过命令行发送一个action目标,命令如下:
ros2 action send_goal <action_name> <action_type> <values>
<values>需要时YAML格式
根据上面得到的action_name,action_type,输入下面的指令:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
可以看到小海龟转向头朝正上方,同时返回值如下:
在返回值可以看到,每个目标都有一个独特的ID,返回值中的delta是从起始点的位移值。
在上面的命令行后面加上 --feedback 可以看到反馈值,如:
总结:action和服务比较像,允许执行一个长时间运行的任务,提供反馈,可以取消。
一个机器人系统更适合action进行导航,一个action可以告诉机器人朝一个方向运行,当机器人导航时,可以发送沿途的更新数据和一个最终的结果信息(一旦抵达最终目的地)