参数/动作通信
目标
- 学习如何在 ROS 2 中获取、设置、保存和重新加载参数(Parameters)。
- 深入了解 ROS 2 中的动作。
理解 ROS2 参数 (Parameters)
参数是节点的配置值。可以将参数视为节点设置。一个节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在 ROS 2 中,每个节点维护其自己的参数。
本教程使用 turtlesim 包。一如既往,在你打开的每个新终端中不要忘记加载 ROS 2 环境变量。
1. 设置
启动两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。
打开一个新的终端并运行:
ros2 run turtlesim turtlesim_node
再打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
2. ros2 param list
要查看属于你的节点的参数,打开一个新的终端并输入命令:
ros2 param list
上述命令会在终端中打印当前的参数列表,如下:
/teleop_turtle:
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
scale_angular
scale_linear
start_type_description_service
use_sim_time
/turtlesim:
background_b
background_g
background_r
holonomic
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
start_type_description_service
use_sim_time
你会看到节点命名空间,/teleop_turtle 和 /turtlesim,接着是每个节点的参数。
参数的命名空间及其名称使用点 . 分隔,如parameter_events.publisher.depth所示。
每个节点都有参数use_sim_time;这并不是 turtlesim 独有的。
根据它们的名字,看起来/turtlesim的参数通过 RGB 颜色值确定了 turtlesim 窗口的背景色。
要确定参数的类型,你可以使用ros2 param get。
3. ros2 param get
要显示参数的类型和当前值,使用命令:
ros2 param get <node_name> <parameter_name>
让我们找出/turtlesim的参数background_g的当前值:
ros2 param get /turtlesim background_g
上述命令的输出是:
Integer value is: 86
现在你知道background_g持有一个整数值。
如果你对background_r和background_b运行相同的命令,你将分别得到值69和255。
4. ros2 param set
要在运行时更改参数的值,使用命令:
ros2 param set <node_name> <parameter_name> <value>
让我们改变/turtlesim的背景颜色:
ros2 param set /turtlesim background_r 150
上述命令的输出是:
Set parameter successful
你的 turtlesim 窗口的背景应该会变色:

使用set命令设置参数只会更改它们在当前会话中的值,而不是永久地更改。但是,你可以保存你的设置并在下次启动节点时重新加载它们。
5. ros2 param dump
你可以使用命令查看节点的所有当前参数值:
ros2 param dump <node_name>
该命令默认打印到标准输出(stdout),但你也可以将参数值重定向到文件中以供以后保存。要将/turtlesim的当前参数配置保存到文件turtlesim.yaml中,请输入命令:
ros2 param dump /turtlesim > turtlesim.yaml
你将在当前工作目录中找到一个新文件。如果打开这个文件,你会看到以下内容:
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 150
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
use_sim_time: false
导出参数在将来重新加载具有相同参数的节点时非常方便。
6. ros2 param load
你可以使用命令从文件加载参数到当前运行的节点:
ros2 param load <node_name> <parameter_file>
要将使用ros2 param dump生成的turtlesim.yaml文件加载到/turtlesim节点的参数中,请输入命令:
ros2 param load /turtlesim turtlesim.yaml
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter holonomic successful
Set parameter qos_overrides./parameter_events.publisher.depth failed: parameter 'qos_overrides./parameter_events.publisher.depth' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.durability failed: parameter 'qos_overrides./parameter_events.publisher.durability' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.history failed: parameter 'qos_overrides./parameter_events.publisher.history' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.reliability failed: parameter 'qos_overrides./parameter_events.publisher.reliability' cannot be set because it is read-only
Set parameter start_type_description_service failed: parameter 'start_type_description_service' cannot be set because it is read-only
Set parameter use_sim_time successful
注意:只读参数只能在启动时修改,而不能在之后修改,这就是为什么对于“qos_overrides”参数有一些警告。
7. 节点启动时加载参数文件
要使用保存的参数值启动同一个节点,使用:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
这是你通常用来启动 turtlesim 的相同命令,添加了标志--ros-args和--params-file,后面跟着你想加载的文件。
停止你正在运行的 turtlesim 节点,并尝试使用保存的参数重新加载它,使用:
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
turtlesim 窗口应该像往常一样出现,但带有你之前设置的紫色背景。
小结
节点有参数来定义它们的默认配置值。你可以从命令行获取和设置参数值。你还可以将参数设置保存到文件中,以便在未来的会话中重新加载它们。
下一步
回到 ROS 2 通信方法,在下一个教程中,你将学习action 。
理解 ROS2 动作 (Action)
动作是 ROS 2 中的一种通信类型,用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
动作建立在话题和服务之上。它们的功能类似于服务,但动作可以被取消。与返回单一响应的服务不同,动作提供持续的反馈。
动作采用客户端 - 服务器模型,类似于发布者 - 订阅者模型(如话题教程所述)。一个“动作客户端”节点向一个“动作服务器”节点发送目标,该服务器确认目标并返回一系列反馈和结果。

本教程基于之前教程中涵盖的概念,如节点和话题。本教程使用turtlesim包。请记得在每次打开新终端时都要配置 ROS 2 环境 (配置 ROS 2 环境) 。
1. 设置
启动两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。
打开一个新的终端并运行:
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.
'q' to quit.
我们重点关注第二行,它对应于一个动作。(第一行指令对应于"cmd_vel"话题,已在话题教程中讨论过。)
请注意,字母键G|B|V|C|D|E|R|T在美国 QWERTY 键盘上围绕F键形成一个“框”。每个键相对于F的位置对应于 turtlesim 中的那个方向。例如,E将使乌龟的方向旋转到左上角。
注意/turtlesim节点运行的终端。每次你按下这些键之一,你都会向作为/turtlesim节点一部分的动作服务器发送一个目标。目标是让乌龟旋转以面对特定方向。一旦乌龟完成旋转,应显示一条传达结果的消息:
[INFO] [1767684260.264484190] [turtlesim]: Rotation goal completed successfully
F键将在执行过程中取消目标。
尝试按D键,然后在乌龟完成旋转之前按G键。在/turtlesim节点运行的终端中,你会看到消息:
[INFO] [1767684360.904106614] [turtlesim]: Rotation goal completed successfully
不仅客户端(你在 teleop 中的输入)可以停止目标,服务器端(/turtlesim节点)也可以。当服务器端选择停止处理目标时,称其为“中止”目标。
尝试按D键,然后在第一次旋转完成之前按G键。在/turtlesim节点运行的终端中,你会看到消息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
这个动作服务器选择中止第一个目标,因为它得到了一个新的目标。它也可以选择其他方式,比如拒绝新目标或在第一个目标完成后执行第二个目标。不要假设每个动作服务器在收到新目标时都会选择中止当前目标。
3. ros2 node info
要查看节点提供的动作列表,在这种情况下为/turtlesim,打开一个新终端并运行命令:
ros2 node info /turtlesim
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim_msgs/msg/Color
/turtle1/pose: turtlesim_msgs/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim_msgs/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim_msgs/srv/Spawn
/turtle1/set_pen: turtlesim_msgs/srv/SetPen
/turtle1/teleport_absolute: turtlesim_msgs/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim_msgs/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/get_type_description: type_description_interfaces/srv/GetTypeDescription
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsolute
Action Clients:
该命令返回/turtlesim的订阅者、发布者、服务、动作服务器和动作客户端列表。
请注意,/turtle1/rotate_absolute动作位于Action Servers下。这意味着/turtlesim响应并提供关于/turtle1/rotate_absolute动作的反馈。
/teleop_turtle节点在Action Clients下有名称/turtle1/rotate_absolute,意味着它发送该动作名称的目标。要查看这一点,请运行:
ros2 node info /teleop_turtle
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsolute
4. ros2 action list
要识别 ROS 图中的所有动作,请运行命令:
ros2 action list
上述命令的输出是:
/turtle1/rotate_absolute
这是 ROS 图中目前唯一的动作。它控制乌龟的旋转,正如你之前看到的。你还已经知道有一个动作客户端(/teleop_turtle的一部分)和一个动作服务器(/turtlesim的一部分)通过使用ros2 node info <node_name>命令来实现这一动作。
4.1 ros2 action list -t
动作有类型,类似于话题和服务。要找到/turtle1/rotate_absolute的类型,请运行命令:
ros2 action list -t
上述命令的输出是:
/turtle1/rotate_absolute [turtlesim_msgs/action/RotateAbsolute]
在每个动作名称右侧的方括号中(在这种情况下只有/turtle1/rotate_absolute),是动作类型turtlesim_msgs/action/RotateAbsolute。当你想从命令行或代码中执行动作时需要这个信息。
5. ros2 action type
如果你想检查动作的动作类型,请运行命令:
ros2 action type /turtle1/rotate_absolute
上述命令的输出是:
turtlesim_msgs/action/RotateAbsolute
6. ros2 action info
你可以使用以下命令进一步深入研究/turtle1/rotate_absolute动作:
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节点有一个针对/turtle1/rotate_absolute动作的动作服务器。
7. ros2 interface show
在你自己发送或执行动作目标之前,你需要的最后一项信息是动作类型的结构。
回想一下,你在运行ros2 action list -t命令时确定了/turtle1/rotate_absolute的类型。在你的终端中输入以下命令以及动作类型:
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
此消息的第一条---上方的部分是目标请求的结构(数据类型和名称)。下一部分是结果的结构。最后一部分是反馈的结构。
8. ros2 action send_goal
现在让我们使用以下语法从命令行发送一个动作目标:
ros2 action send_goal <action_name> <action_type> <values>
<values>需要是 YAML 格式。
留意 turtlesim 窗口,并在终端中输入以下命令:
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: ac7e7c00399140c6ba707d0020ef7a81
Result:
delta: -1.5679999589920044
Goal finished with status: SUCCEEDED
你应该会看到乌龟旋转。
所有目标都有一个唯一的 ID,显示在返回消息中。你还可以看到结果,一个名为delta的字段,它是相对于起始位置的位移。
要查看此目标的反馈,请在ros2 action send_goal命令中添加--feedback:
ros2 action send_goal /turtle1/rotate_absolute turtlesim_msgs/action/RotateAbsolute "{theta: -1.57}" --feedback
Waiting for an action server to become available...
Sending goal:
theta: -1.57
Feedback:
remaining: -0.018000006675720215
Goal accepted with ID: 64e857c4c6514a1b9d0ca4946025860e
Result:
delta: 0.0
Goal finished with status: SUCCEEDED
在目标完成之前,你将继续接收反馈,即剩余的弧度数。
9. ros2 action echo
要查看动作客户端和动作服务器之间的数据通信,可以使用以下命令回显动作数据:
ros2 action echo <action_name> <optional arguments/action_type>
ros2 action echo依赖于动作客户端和服务器的动作内省功能,默认情况下该功能是禁用的。要启用它,用户必须在创建动作客户端或服务器后调用configure_introspection。
启动fibonacci_action_server和fibonacci_action_client,启用action_server_configure_introspection参数进行演示。
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
现在我们可以通过ros2 action echo看到fibonacci_action_server和fibonacci_action_client之间的动作通信。
ros2 action echo /fibonacci example_interfaces/action/Fibonacci --flow-style
部署输出如下所示:
interface: STATUS_TOPIC
status_list: [{goal_info: {goal_id: {uuid: [94, 182, 156, 186, 68, 212, 79, 217, 182, 145, 137, 35, 130, 118, 18, 224]}, stamp: {sec: 1767685042, nanosec: 200079607}}, status: 4}]
---
interface: GOAL_SERVICE
info:
event_type: REQUEST_SENT
stamp:
sec: 1767685073
nanosec: 65537230
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 19, 4]
sequence_number: 1
request: [{goal_id: {uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]}, goal: {order: 10}}]
response: []
---
interface: GOAL_SERVICE
info:
event_type: REQUEST_RECEIVED
stamp:
sec: 1767685073
nanosec: 65767205
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 19, 4]
sequence_number: 1
request: [{goal_id: {uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]}, goal: {order: 10}}]
response: []
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1]
---
interface: STATUS_TOPIC
status_list: [{goal_info: {goal_id: {uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]}, stamp: {sec: 1767685073, nanosec: 66056750}}, status: 2}]
---
interface: GOAL_SERVICE
info:
event_type: RESPONSE_SENT
stamp:
sec: 1767685073
nanosec: 65983840
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 19, 4]
sequence_number: 1
request: []
response: [{accepted: true, stamp: {sec: 0, nanosec: 0}}]
---
interface: GOAL_SERVICE
info:
event_type: RESPONSE_RECEIVED
stamp:
sec: 1767685073
nanosec: 66368225
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 19, 4]
sequence_number: 1
request: []
response: [{accepted: true, stamp: {sec: 0, nanosec: 0}}]
---
interface: RESULT_SERVICE
info:
event_type: REQUEST_SENT
stamp:
sec: 1767685073
nanosec: 83879027
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 23, 4]
sequence_number: 1
request: [{goal_id: {uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]}}]
response: []
---
interface: RESULT_SERVICE
info:
event_type: REQUEST_RECEIVED
stamp:
sec: 1767685073
nanosec: 83943836
client_gid: [1, 15, 165, 41, 248, 108, 182, 90, 0, 0, 0, 0, 0, 0, 23, 4]
sequence_number: 1
request: [{goal_id: {uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]}}]
response: []
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2]
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2, 3]
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2, 3, 5]
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2, 3, 5, 8]
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2, 3, 5, 8, 13]
---
interface: FEEDBACK_TOPIC
goal_id:
uuid: [48, 118, 60, 203, 159, 24, 79, 50, 173, 194, 68, 131, 242, 184, 115, 33]
feedback:
sequence: [0, 1, 1, 2, 3, 5, 8, 13, 21]
---
...
...
注意: 此功能在
Kilted Kaiju或更高版本中可用。
小结
动作就像允许你执行长时间运行任务的服务,提供定期反馈,并且可以取消。
机器人系统可能会使用动作来进行导航。一个动作目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),并在到达目的地后发送最终结果消息。
Turtlesim 有一个动作服务器,动作客户端可以向其发送目标以旋转乌龟。在本教程中,你深入了解了该动作/turtle1/rotate_absolute,以更好地了解动作是什么以及它们如何工作。
下一步
现在你已经涵盖了所有核心 ROS 2 概念。本系列的最后几个教程将介绍一些工具和技术,使使用 ROS 2 更容易,从使用 rqt_console开始。