通过命令行向节点传递ROS参数

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

ros2 run my_package node_executable --ros-args ...

更多详细信息,请参阅`这个设计文档 <https://design.ros2.org/articles/ros_command_line_arguments.html>`__。

名称重映射

可以使用语法``-r <旧名称>:=<新名称>``对节点内的名称(例如:topics/services)进行重映射。节点本身的名称/命名空间可以使用``-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

向特定节点传递重新映射参数

如果在单个进程中运行多个节点(例如使用 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_topic

参数

直接从命令行设置参数

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

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_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文件的形式通过命令行设置。

有关yaml文件语法的示例,请参阅此处 <https://github.com/ros2/rcl/tree/humble/rcl_yaml_param_parser>。

例如,将以下内容保存为 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]

然后,您可以在节点内使用 declare_parameter``declare_parameters``(请参阅 文档 了解函数签名)声明参数,或者如果通过命令行覆盖传递了参数,则可以 设置节点自动声明参数

然后运行以下命令:

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

其他节点将能够检索参数值,例如:

$ 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