【ROS2】Beginner : CLI tools - 理解 ROS 2 动作

理解 ROS 2 动作

目标:了解 ROS 2 中动作(Actions)的概念,以及如何通过命令行工具查看和交互动作。
难度级别:初学者
预计时间:15 分钟

目录

  • 背景
  • 前提条件
  • 任务
    1. 设置
    2. 使用动作
    3. ros2 node info
    4. ros2 action list
    5. ros2 action type
    6. ros2 action info
    7. ros2 interface show
    8. ros2 action send_goal
    9. ros2 action echo
  • 总结

背景

动作是 ROS 2 中的一种通信类型,专门用于长时间运行的任务。它由三部分组成:目标(goal)、反馈(feedback)和结果(result)。

动作基于话题和服务构建,功能与服务类似,但具有两个关键优势:支持任务取消,且能提供持续的反馈(服务仅返回单次响应)。

动作采用客户端-服务器模型(类似话题的发布者-订阅者模型):“动作客户端”节点向“动作服务器”节点发送目标,服务器确认目标后,会持续返回反馈,并在任务结束时返回结果。
在这里插入图片描述

前提条件

本教程基于前序教程中介绍的节点、话题等概念展开,且需使用 turtlesim 功能包。

和往常一样,每个新打开的终端都需先执行 ROS 2 的环境配置文件(source setup 文件)。

任务

1. 设置

启动 turtlesim 的两个节点(/turtlesim/teleop_turtle),用于演示动作功能:

  1. 打开新终端,运行 turtlesim 主节点:
    ros2 run turtlesim turtlesim_node
    
  2. 再打开一个新终端,运行键盘控制节点:
    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 ServersAction 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:启动启用监听的动作服务器和客户端
  1. 启动斐波那契动作服务器,并启用监听配置:
    ros2 run action_tutorials_cpp fibonacci_action_server --ros-args -p action_server_configure_introspection:=contents
    
  2. 启动斐波那契动作客户端,并启用监听配置:
    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 查看日志》开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值