1. Actions

Actions 动作是ROS 2中的通信类型之一,适用于长时间运行的任务
它们由三部分组成:目标、反馈结果,操作基于话题和服务
它们的功能类似于服务,只是可以取消操作;还提供稳定的反馈(话题),而不是返回单一响应的服务

操作使用客户端-服务器模型,类似于发布-订阅模型(和话题类似)
“行动客户端”节点向“行动服务器”节点发送目标,该节点确认目标并返回 反馈流结果

指令 功能
ros2 action info 按照类型查找服务
ros2 action list 列出当前活动的服务
ros2 action send_goal /action type values 显示服务的消息类型


2. 动作

还是启动海龟及其遥控节点为例:

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

当启动 turtle_teleop_key 时,将在终端中看到以下消息:

使用箭头键移动乌龟,使用G|B|V|C|D|E|R|T键旋转到绝对方向,F’取消旋转。
这里旋转到绝对方向实际用小写的,例如按 “e” 就会转到右上角,在旋转的过程中按 “f” 就会立即停下来。

每次按下其中一个键时,都会向/turtlesim节点中的动作服务器发送一个目标,目标是旋转乌龟以面向特定方向


海龟完成旋转后,注意/turtlesim节点正在运行的终端显示了一条动作结果的消息:

[INFO] [turtlesim]: Rotation goal completed successfully


3. 中止目标

试着按 c 键,然后在过程中按 f 键,将看到消息:

[INFO] [turtlesim]: Rotation goal canceled

不仅客户端(在远程操作中的输入)可以停止目标
服务器端(/turtlesim节点)自身也可以中止目标

再尝试按 d 键,然后按 g 键,将看到消息:

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal

此操作服务器选择中止第一个目标,因为它获得了一个新目标


4. 动作类型

查看动作信息:

ros2 action list

# /turtle1/rotate_absolute

就一个动作,旋转绝对值 rotate_absolute,控制着海龟的旋转角度绝对值

查看两个节点信息关于动作的信息:

1.节点 /turtlesim 的 动作 /turtle1/rotate_absolute 位于 动作服务器 Action Servers 下,响应动作并为其提供反馈

ros2 node info /turtlesim

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

2.节点 /teleop_turtle 的 动作 /turtle1/rotate_absolute 位于 动作客户端 Action Clients 下,发送该动作名称的目标

ros2 node info /teleop_turtle

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

从上还可以看出 动作类型,即 turtlesim/action/RotateAbsolute

ros2 action info /turtle1/rotate_absolute

# Action: /turtle1/rotate_absolute
# Action clients: 1
#     /teleop_turtle
# Action servers: 1
#     /turtlesim

也可以查到动作服务器和客户端对应的节点和数量

再具体看看动作类型

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

最上面的是目标请求的结构(数据类型和名称),接下来是结果,最后是反馈


5. 动作请求

发布一个动作目标可以通过:

ros2 action send_goal <动作名称> <动作类型> <目标数据>

目标数据需要采用YAML格式

例如:

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

可以看到目标有一个唯一的ID,显示在返回消息中
还可以看到当前角度反馈,和最终结果(起始角度delta
将持续收到反馈,剩余的弧度,直到目标完成


动作就像服务,允许执行长期运行的任务,提供定期反馈,并且可以取消
机器人系统可能会使用动作进行导航

动作目标可以告诉机器人移动到某个位置
当机器人导航到该位置时,它可以沿途发送更新(即反馈)
然后在到达目的地后发送最终结果消息


谢谢