理解 ROS 2 动作
目标:了解 ROS 2 中动作(Actions)的概念,以及如何通过命令行工具查看和交互动作。
难度级别:初学者
预计时间:15 分钟
目录
- 背景
- 前提条件
- 任务
- 设置
- 使用动作
- ros2 node info
- ros2 action list
- ros2 action type
- ros2 action info
- ros2 interface show
- ros2 action send_goal
- ros2 action echo
- 总结
背景
动作是 ROS 2 中的一种通信类型,专门用于长时间运行的任务。它由三部分组成:目标(goal)、反馈(feedback)和结果(result)。
动作基于话题和服务构建,功能与服务类似,但具有两个关键优势:支持任务取消,且能提供持续的反馈(服务仅返回单次响应)。
动作采用客户端-服务器模型(类似话题的发布者-订阅者模型):“动作客户端”节点向“动作服务器”节点发送目标,服务器确认目标后,会持续返回反馈,并在任务结束时返回结果。

前提条件
本教程基于前序教程中介绍的节点、话题等概念展开,且需使用 turtlesim 功能包。
和往常一样,每个新打开的终端都需先执行 ROS 2 的环境配置文件(source setup 文件)。
任务
1. 设置
启动 turtlesim 的两个节点(/turtlesim 和 /teleop_turtle),用于演示动作功能:
- 打开新终端,运行
turtlesim主节点: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.
- 第一行(方向键控制移动)对应前序教程中介绍的
cmd_vel话题,此处暂不关注; - 第二行(字母键控制旋转)对应动作功能,是本教程的核心内容。
动作功能说明
在美式 QWERTY 键盘上,G|B|V|C|D|E|R|T 这 8 个键围绕 F 键分布,每个键的位置对应乌龟在 turtlesim 中的一个绝对朝向(非 QWERTY 键盘用户可参考此链接适配)。例如,按下 E 键会让乌龟旋转到左上角方向。
实际操作验证
- 完成目标:观察运行
/turtlesim节点的终端,每次按下上述字母键(如C),都会向/turtlesim节点中的动作服务器发送一个“旋转目标”。当乌龟完成旋转后,终端会输出结果提示:[INFO] [turtlesim]: Rotation goal completed successfully - 取消目标:按下
F键可中途取消正在执行的目标。例如,按下C键后,在乌龟完成旋转前按下F键,/turtlesim终端会显示:[INFO] [turtlesim]: Rotation goal canceled - 中止目标:除客户端(键盘输入)可取消目标外,服务器(
/turtlesim节点)也可能主动“中止”任务。例如,按下D键触发旋转后,在旋转完成前按下G键发送新目标,服务器会中止第一个目标并执行新目标,终端提示:[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal注意:不同动作服务器对“新目标与未完成目标”的处理逻辑可能不同(如拒绝新目标、排队执行等),并非所有服务器都会中止当前目标。
3. ros2 node info
通过 ros2 node info 命令可查看节点提供的动作(服务器/客户端)列表。以 /turtlesim 节点为例:
ros2 node info /turtlesim
输出结果中,动作相关信息位于 Action Servers 和 Action Clients 部分:
/turtlesim
...(省略订阅者、发布者、服务等信息)
Action Servers:
/turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsolute
Action Clients:
/turtlesim节点在Action Servers下包含/turtle1/rotate_absolute,说明它是该动作的服务器,负责接收目标、执行旋转并返回反馈/结果;- 同理,查看
/teleop_turtle节点的信息,会发现它在Action Clients下包含/turtle1/rotate_absolute,说明它是该动作的客户端,负责发送旋转目标:
关键输出:ros2 node info /teleop_turtle/teleop_turtle ...(省略其他信息) Action Clients: /turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsolute
4. ros2 action list
通过 ros2 action list 命令可查看当前 ROS 图中所有活跃的动作:
ros2 action list
当前系统中仅存在一个动作,输出如下:
/turtle1/rotate_absolute
4.1 ros2 action list -t
与话题、服务类似,动作也有“类型”,用于定义目标、反馈和结果的数据结构。通过 -t(--show-types 缩写)选项可查看动作类型:
ros2 action list -t
输出:
/turtle1/rotate_absolute [turtlesim_msgs/action/RotateAbsolute]
括号中的 turtlesim_msgs/action/RotateAbsolute 即为 /turtle1/rotate_absolute 动作的类型,后续通过命令行或代码执行动作时需用到该类型。
5. ros2 action type
若已知动作名称,可通过 ros2 action type 直接查询其类型,无需列出所有动作:
ros2 action type /turtle1/rotate_absolute
输出:
turtlesim_msgs/action/RotateAbsolute
6. ros2 action info
通过 ros2 action info 命令可查看动作的详细信息,包括对应的客户端和服务器节点:
ros2 action info /turtle1/rotate_absolute
输出:
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
结果与 ros2 node info 的查询结论一致:/teleop_turtle 是动作客户端,/turtlesim 是动作服务器。
7. ros2 interface show
在发送动作目标前,需了解动作类型定义的数据结构(目标、反馈、结果分别包含哪些字段)。通过 ros2 interface show 命令,结合动作类型即可查看:
ros2 interface show turtlesim_msgs/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
- 第一部分(第一个
---上方):目标(goal) 结构,theta表示乌龟需要旋转到的目标角度(单位:弧度); - 第二部分(两个
---之间):结果(result) 结构,delta表示乌龟从初始位置到目标角度的角位移(单位:弧度); - 第三部分(第二个
---下方):反馈(feedback) 结构,remaining表示仍需旋转的角度(单位:弧度)。
8. ros2 action send_goal
通过命令行发送动作目标的语法如下:
ros2 action send_goal <动作名称> <动作类型> <目标参数(YAML 格式)>
基础用法:发送旋转目标
保持 turtlesim 窗口可见,执行以下命令,让乌龟旋转到 1.57 弧度(约 90 度):
ros2 action send_goal /turtle1/rotate_absolute turtlesim_msgs/action/RotateAbsolute "{theta: 1.57}"
终端输出如下,同时可观察到乌龟在窗口中旋转:
Waiting for an action server to become available...
Sending goal:
theta: 1.57
Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444
Result:
delta: -1.568000316619873
Goal finished with status: SUCCEEDED
Goal accepted with ID:每个目标都有唯一 ID,用于标识任务;Result:任务完成后返回的结果,delta为实际角位移;status: SUCCEEDED:表示目标执行成功。
进阶用法:查看实时反馈
添加 --feedback 选项,可在目标执行过程中实时查看反馈(剩余旋转角度):
ros2 action send_goal /turtle1/rotate_absolute turtlesim_msgs/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
9. ros2 action echo
通过 ros2 action echo 命令可监听动作客户端与服务器之间的所有通信数据(目标、反馈、结果等)。但需注意:
- 动作的“通信监听”功能默认关闭,需先为客户端和服务器启用
configure_introspection配置; - 以下演示使用
action_tutorials功能包中的斐波那契动作示例(需提前安装该功能包)。
步骤 1:启动启用监听的动作服务器和客户端
- 启动斐波那契动作服务器,并启用监听配置:
ros2 run action_tutorials_cpp fibonacci_action_server --ros-args -p action_server_configure_introspection:=contents - 启动斐波那契动作客户端,并启用监听配置:
ros2 run action_tutorials_py fibonacci_action_client --ros-args -p action_client_configure_introspection:=contents
步骤 2:监听动作通信数据
执行以下命令,监听 /fibonacci 动作的所有通信数据(--flow-style 选项使输出格式更紧凑):
ros2 action echo /fibonacci example_interfaces/action/Fibonacci --flow-style
输出示例(包含目标请求、反馈、结果等完整通信过程):
interface: GOAL_SERVICE
info:
event_type: REQUEST_SENT
stamp:
sec: 1742070798
nanosec: 400435819
client_gid: [1, 15, 165, 231, 194, 197, 167, 157, 0, 0, 0, 0, 0, 0, 20, 4]
sequence_number: 1
request: [{goal_id: {uuid: [230, 96, 12, 6, 100, 69, 69, 70, 220, 205, 135, 251, 210, 2, 231, 110]}, goal: {order: 10}}]
response: []
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [230, 96, 12, 6, 100, 69, 69, 70, 220, 205, 135, 251, 210, 2, 231, 110]
feedback:
sequence: [0, 1, 1]
---
interface: STATUS_TOPIC
status_list: [{goal_info: {goal_id: {uuid: [230, 96, 12, 6, 100, 69, 69, 70, 220, 205, 135, 251, 210, 2, 231, 110]}, stamp: {sec: 1742070798, nanosec: 401146752}}, status: 2}]
---
...
注意:该监听功能仅在 ROS 2 Kilted Kaiju 及后续版本中支持。
总结
动作是 ROS 2 中用于长时间任务的通信类型,支持任务取消和持续反馈,核心特点如下:
- 采用客户端-服务器模型,包含目标、反馈、结果三部分;
- 适用于机器人导航、机械臂运动等需实时反馈且可能需取消的场景(例如,让机器人前往某个位置,途中返回实时坐标反馈,到达后返回最终结果)。
本教程通过 turtlesim 的 /turtle1/rotate_absolute 动作,演示了动作的基本用法和相关命令行工具,帮助理解动作的工作原理。
下一步
至此,你已掌握 ROS 2 的所有核心概念。后续教程将介绍实用工具和技巧,帮助更高效地使用 ROS 2,首先从《使用 rqt_console 查看日志》开始。
300

被折叠的 条评论
为什么被折叠?



