Skip to content

理解 ROS 2 参数

Parameter(参数)是每个节点在 ROS 计算图中存储的配置值。 本文将带你了解如何使用 ros2 param 命令行工具来查看、修改、保存和重新加载参数。 通过 Turtlesim 的动手练习,你将直观地看到参数如何在运行时控制节点的行为。

领域:Framework | 内容类型:教程 | 经验:初学者

ROS 计算图中的每个节点都存储着自己的一组配置值,称为参数(parameter)。 使用 ros2 param 命令可以在运行时获取、设置、保存和重新加载参数值。

更多信息请参见 关于参数。

你需要安装 turtlesim 功能包。

注意:每打开一个新终端时,不要忘记 source ROS。

更多信息请参见 配置环境。

启动两个 Turtlesim 节点:/turtlesim 和 /teleop_turtle。

打开一个新终端并运行:

Terminal window
$ ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

Terminal window
$ ros2 run turtlesim turtle_teleop_key

要查看节点的参数,打开一个新终端并运行:

Terminal window
$ ros2 param list

你会看到类似如下的输出:

Terminal window
/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
use_sim_time
/turtlesim:
background_b
background_g
background_r
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
use_sim_time

输出会按节点名称对参数进行分组,分别是 /teleop_turtle 和 /turtlesim。 参数的命名空间和名称之间用点号分隔,例如 parameter_events.publisher.depth。

在继续之前,请注意以下参数:

  • use_sim_time:指定节点使用模拟时间还是计算机的时钟。
  • background_r、background_g 和 background_b:定义 Turtlesim 窗口背景颜色的 RGB 值。

要显示参数的类型和当前值,使用以下命令:

Terminal window
$ ros2 param get <node_name> <parameter_name>

你也可以省略节点名称,跨所有节点查询某个参数:

Terminal window
$ ros2 param get <parameter_name>

要查看 /turtlesim 的参数 background_g 的当前值,运行:

Terminal window
$ ros2 param get /turtlesim background_g

终端返回:

Terminal window
Integer value is: 86

这说明 background_g 存储的是一个整数值。

对 background_r 和 background_b 运行相同的命令,应该分别返回值 69 和 255。

你也可以省略节点名称。 例如,你可以尝试查询 use_sim_time,因为每个节点都有这个参数:

Terminal window
$ ros2 param get use_sim_time

该命令会显示每个拥有该参数的节点的值。

注意:省略节点名称仅在 Lyrical、Rolling 及更高版本的发行版中有效。 在较早的发行版中,ros2 param get 需要同时提供节点名称和参数名称。

要在运行时修改参数的值,使用以下命令:

Terminal window
$ ros2 param set <node_name> <parameter_name> <value>

修改 /turtlesim 的背景颜色:

Terminal window
$ ros2 param set /turtlesim background_r 150

终端返回:

Terminal window
Set parameter successful

Turtlesim 窗口的背景颜色应该会发生变化,如下所示:

设置参数

使用 set 命令设置的参数只在当前会话中生效,不会永久保存。 不过,你可以保存设置并在下次启动节点时重新加载。 参见下文的”将节点的参数保存到文件中”和”在节点启动时加载参数文件”两节。

你可以将节点的参数保存到文件中。 当你以后想要使用相同的参数重新加载节点时,这会非常方便。 使用以下命令:

Terminal window
$ ros2 param dump <node_name>

该命令默认输出到标准输出(stdout),但你也可以将参数值重定向到文件中以供日后使用。 要将当前 /turtlesim 的参数配置保存到文件 turtlesim.yaml 中,运行:

Terminal window
$ 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

你可以使用以下命令从文件向当前运行的节点加载参数:

Terminal window
$ ros2 param load <node_name> <parameter_file>

要将使用 ros2 param dump 生成的 turtlesim.yaml 文件加载到 /turtlesim 节点的参数中,运行:

Terminal window
$ ros2 param load /turtlesim turtlesim.yaml

终端返回:

Terminal window
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r 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 use_sim_time successful

注意: 只读参数只能在启动时修改,之后不能更改,这就是为什么 qos_overrides 参数会出现一些 failed 警告。

要使用保存的参数值启动相同的节点,使用:

Terminal window
$ ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

这与启动 Turtlesim 所使用的命令相同,只是添加了 --ros-args 和 --params-file 选项,后跟你想要加载的文件。

停止正在运行的 Turtlesim 节点,然后尝试使用保存的参数重新加载:

Terminal window
$ ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml

Turtlesim 窗口应该像往常一样出现,但背景颜色是你之前设置的紫色。

注意: 在节点启动时使用参数文件时,所有参数都会被更新,包括只读参数。

更多文章:

参数可以保存哪些类型? 参数可以是整数、浮点数、布尔值、字符串和列表。

参数的修改在节点重启后会保留吗? 不会。使用 ros2 param set 所做的修改仅对当前会话有效。 要使其永久保存,请使用 ros2 param dump 将值保存到 YAML 文件中,并在启动节点时加载该文件。

为什么使用 ros2 param load 加载某些参数会失败? 标记为只读的参数只能在节点启动时设置,不能在运行时设置。 qos_overrides 参数就是只读的,这就是为什么在向运行中的节点加载参数文件时会显示 failed 消息。

ros2 param dump 和 ros2 param load 有什么区别? ros2 param dump 将节点当前的参数值保存到 YAML 文件。 ros2 param load 读取 YAML 文件并将值应用到当前运行的节点。