如何在 ROS2 中启动带有参数的节点?
How to launch a node with a parameter in 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?
关于 ROS2,请参阅 this link and this link。
作为参考,截至本 post,ROS2 已经发布了三个版本。虽然 Crystal Clemmens 支持 Python 节点,但之前的版本 Bouncy Bolson 不支持。同样,未来的版本可能会添加对 how/where 输入配置文件的额外支持。
ROS2 Wiki 引用使用 .yaml 配置文件来存储参数,并且当 运行连接 ROS2 节点时,将配置文件作为命令行参数传递。
ROS2 维基:Node Arguments
示例 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
我想扩展一下@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]
要在 ROS2 启动文件中使用它,现在内置于 Python,将 .yaml
文件路径作为参数传递 parameters
,如此处所述 https://github.com/ros2/launch/blob/master/launch_ros/launch_ros/actions/node.py :
ld = LaunchDescription([
launch_ros.actions.Node(
package='nmea_navsat_driver', node_executable='nmea_serial_driver_node', output='screen',
parameters=["config.yaml"])
])
这里config.yaml
是参数文件
如果您想手动启动节点,请按照@PSAs 回答中的说明启动它:
ros2 run demo_nodes_cpp talker __params:=demo_params.yaml
更新:参数需要一个配置文件列表。
正在将 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?
关于 ROS2,请参阅 this link and this link。
作为参考,截至本 post,ROS2 已经发布了三个版本。虽然 Crystal Clemmens 支持 Python 节点,但之前的版本 Bouncy Bolson 不支持。同样,未来的版本可能会添加对 how/where 输入配置文件的额外支持。
ROS2 Wiki 引用使用 .yaml 配置文件来存储参数,并且当 运行连接 ROS2 节点时,将配置文件作为命令行参数传递。
ROS2 维基:Node Arguments
示例 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
我想扩展一下@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]
要在 ROS2 启动文件中使用它,现在内置于 Python,将 .yaml
文件路径作为参数传递 parameters
,如此处所述 https://github.com/ros2/launch/blob/master/launch_ros/launch_ros/actions/node.py :
ld = LaunchDescription([
launch_ros.actions.Node(
package='nmea_navsat_driver', node_executable='nmea_serial_driver_node', output='screen',
parameters=["config.yaml"])
])
这里config.yaml
是参数文件
如果您想手动启动节点,请按照@PSAs 回答中的说明启动它:
ros2 run demo_nodes_cpp talker __params:=demo_params.yaml
更新:参数需要一个配置文件列表。