如何在ROS2中启动带有参数的节点?

时间:2018-12-24 20:32:44

标签: ros ros2

将ros1包迁移到ros2,无法确定如何在ros2中使用参数启动。

在ros1中,我有一个启动文件,该启动文件引用了配置文件,从cpp代码中,我使用了node.getParam

启动文件:

<launch>
    <arg name="node_name" default="collector" />
    <arg name="config_file" default="" />
    <node name="$(arg node_name)" pkg="collector" type="collector" respawn="true">
      <rosparam if="$(eval config_file!='')" command="load" file="$(arg config_file)"/>
    </node>
</launch>

配置文件:

my_param: 5

cpp代码:

double my_param = 0;
n.getParam("my_param", my_param);

我的问题是,它将如何转换为ROS2?

2 个答案:

答案 0 :(得分:1)

对于ROS2,请参阅herethis link

作为参考,截至本文,ROS2已经发布了三个版本。虽然Crystal Clemmens支持Python节点,但先前的版本Bouncy Bolson不支持。同样,未来的发行版可能会增加对如何/在何处输入配置文件的支持。

ROS2 Wiki使用.yaml配置文件引用来存储参数,并在运行ROS2节点时将配置文件作为命令行参数传递。

ROS2 Wiki:this link

示例demo_params.yaml文件:

talker:
    ros__parameters:
        some_int: 42
        a_string: "Hello world"
        some_lists:
            some_integers: [1, 2, 3, 4]
            some_doubles : [3.14, 2.718]`

然后运行以下命令:

ros2 run demo_nodes_cpp talker __params:=demo_params.yaml

答案 1 :(得分:1)

我想扩展@PSA的答案,这真的很好。

如前所述,将您的参数放入.yaml文件中

talker:
    ros__parameters:
        some_int: 42
        a_string: "Hello world"
        some_lists:
            some_integers: [1, 2, 3, 4]
            some_doubles : [3.14, 2.718]

要在现在已使用Python构建的ROS2启动文件中使用它,请像以下https://github.com/ros2/launch/blob/master/launch_ros/launch_ros/actions/node.py所述,将.yaml文件路径作为参数parameters传递,如下所示:

ld = LaunchDescription([
        launch_ros.actions.Node(
            package='nmea_navsat_driver', node_executable='nmea_serial_driver_node', output='screen',
            parameters=["config.yaml"])
    ])

此处config.yaml是参数文件。

如果要手动启动节点,请按照@PSA答案中所述启动它: ros2 run demo_nodes_cpp talker __params:=demo_params.yaml

更新:参数需要配置文件列表。