Skip to content

节点参数

所有 ROS 节点都接受一组参数,用于在运行时重新配置各种属性。例如,可以配置节点名称/命名空间、使用的话题/服务名称以及节点上的参数。所有 ROS 特定参数都必须在 --ros-args 标志之后指定:

Terminal window
$ ros2 run my_package node_executable --ros-args ...

有关更多详情,请参阅此设计文档。

节点内的名称(如话题/服务)可通过语法 -r <旧名称>:=<新名称> 进行重映射。节点本身的名称/命名空间可通过 -r __node:=<新节点名> 和 -r __ns:=<新命名空间> 重映射。

注意,这些属于「静态」重映射,在节点整个生命周期内有效。节点启动后的「动态」重映射目前尚不支持。

有关重映射参数的更多详细信息,请参阅此设计文档(并非所有功能都已可用)。

以下调用将使 talker 节点以 my_talker 为节点名启动,并在名为 my_topic 的话题上发布消息,而非默认的 chatter。命名空间必须以正斜杠开头,此处设置为 /demo,这意味着话题将在该命名空间下创建(/demo/my_topic),而非全局创建(/my_topic)。

Terminal window
$ ros2 run demo_nodes_cpp talker --ros-args -r __ns:=/demo -r __node:=my_talker -r chatter:=my_topic

如果在单个进程中运行多个节点(例如使用 Composition),可以通过节点名前缀将重映射参数传递给特定节点。例如,以下命令将重映射参数传递给指定节点:

Terminal window
$ ros2 run composition manual_composition --ros-args -r talker:__node:=my_talker -r listener:__node:=my_listener

以下示例同时更改节点名并重映射话题(节点和命名空间的更改总是在话题重映射之前应用):

Terminal window
$ ros2 run composition manual_composition --ros-args -r talker:__node:=my_talker -r my_talker:chatter:=my_topic -r listener:__node:=my_listener -r my_listener:chatter:=my_topic

可以使用 --log-level 命令行参数指定每个节点的日志级别。可执行文件的日志文件名前缀(包含该可执行文件中的所有节点)可通过 --log-file-name 命令行参数指定。更多信息请参阅日志页面。

可以使用以下语法直接从命令行设置参数:

Terminal window
$ ros2 run package_name executable_name --ros-args -p param_name:=param_value

例如,可以运行:

Terminal window
$ ros2 run demo_nodes_cpp parameter_blackboard --ros-args -p some_int:=42 -p "a_string:=Hello world" -p "some_lists.some_integers:=[1, 2, 3, 4]" -p "some_lists.some_doubles:=[3.14, 2.718]"

其他节点即可获取参数值,例如:

Terminal window
$ ros2 param list parameter_blackboard
a_string
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
some_int
some_lists.some_doubles
some_lists.some_integers
use_sim_time

可以通过命令行以 YAML 文件形式设置参数。

有关 YAML 文件语法的示例,请参阅此处。

例如,将以下内容保存为 demo_params.yaml:

parameter_blackboard:
ros__parameters:
some_int: 42
a_string: "Hello world"
some_lists:
some_integers: [1, 2, 3, 4]
some_doubles : [3.14, 2.718]
/**:
ros__parameters:
wildcard_full: "Full wildcard for any namespaces and any node names"
/**/parameter_blackboard:
ros__parameters:
wildcard_namespace: "Wildcard for a specific node name under any namespace"
/*:
ros__parameters:
wildcard_nodename_root_namespace: "Wildcard for any node names, but only in root namespace"

注意:通配符可用于节点名和命名空间。* 匹配由斜杠(/)分隔的单个标记。** 匹配由斜杠分隔的零个或多个标记。不允许部分匹配(例如 foo*)。

然后,在节点中使用 declare_parameter 或 declare_parameters 声明参数;如果参数是通过命令行覆盖传入的,也可以将节点设置为自动声明参数。

然后运行以下命令:

Terminal window
$ ros2 run demo_nodes_cpp parameter_blackboard --ros-args --params-file demo_params.yaml

其他节点即可获取参数值,例如:

Terminal window
$ ros2 param list parameter_blackboard
a_string
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
some_int
some_lists.some_doubles
some_lists.some_integers
use_sim_time
wildcard_full
wildcard_namespace
wildcard_nodename_root_namespace