节点参数
所有 ROS 节点都接受一组参数,用于在运行时重新配置各种属性。例如,可以配置节点名称/命名空间、使用的话题/服务名称以及节点上的参数。所有 ROS 特定参数都必须在 --ros-args 标志之后指定:
$ 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)。
$ ros2 run demo_nodes_cpp talker --ros-args -r __ns:=/demo -r __node:=my_talker -r chatter:=my_topic向特定节点传递重映射参数
Section titled “向特定节点传递重映射参数”如果在单个进程中运行多个节点(例如使用 Composition),可以通过节点名前缀将重映射参数传递给特定节点。例如,以下命令将重映射参数传递给指定节点:
$ ros2 run composition manual_composition --ros-args -r talker:__node:=my_talker -r listener:__node:=my_listener以下示例同时更改节点名并重映射话题(节点和命名空间的更改总是在话题重映射之前应用):
$ 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_topicLogger 配置
Section titled “Logger 配置”可以使用 --log-level 命令行参数指定每个节点的日志级别。可执行文件的日志文件名前缀(包含该可执行文件中的所有节点)可通过 --log-file-name 命令行参数指定。更多信息请参阅日志页面。
直接从命令行设置参数
Section titled “直接从命令行设置参数”可以使用以下语法直接从命令行设置参数:
$ ros2 run package_name executable_name --ros-args -p param_name:=param_value例如,可以运行:
$ 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]"其他节点即可获取参数值,例如:
$ ros2 param list parameter_blackboarda_stringqos_overrides./parameter_events.publisher.depthqos_overrides./parameter_events.publisher.durabilityqos_overrides./parameter_events.publisher.historyqos_overrides./parameter_events.publisher.reliabilitysome_intsome_lists.some_doublessome_lists.some_integersuse_sim_time从 YAML 文件设置参数
Section titled “从 YAML 文件设置参数”可以通过命令行以 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 声明参数;如果参数是通过命令行覆盖传入的,也可以将节点设置为自动声明参数。
然后运行以下命令:
$ ros2 run demo_nodes_cpp parameter_blackboard --ros-args --params-file demo_params.yaml其他节点即可获取参数值,例如:
$ ros2 param list parameter_blackboarda_stringqos_overrides./parameter_events.publisher.depthqos_overrides./parameter_events.publisher.durabilityqos_overrides./parameter_events.publisher.historyqos_overrides./parameter_events.publisher.reliabilitysome_intsome_lists.some_doublessome_lists.some_integersuse_sim_timewildcard_fullwildcard_namespacewildcard_nodename_root_namespace