> 文章列表 > ROS的参数加载机制

ROS的参数加载机制

ROS的参数加载机制

可以使用roslaunch启动ros节点进行yaml文件载参,只需在.launch文件里写上param的相关信息即可,如下:

<launch><arg name="ns" default="" /><node pkg="planning_node" name="planning_node" type="planning_node" output="screen" ns="/$(arg ns)"><rosparam command="load" file="$(find planning_node)/param/planning_node.yaml"></rosparam></node>
</launch>

这里涉及到rosparam的写的位置,如果写在<node></node>中间,则代表加载planning_node.yaml参数到局部命名空间,即/planning_node下,这里的<node>里还有一个ns参数需要注意,这个是局部命名空间的前缀,可以在roslaunch时手动添加,如果设置ns="foo"的话,那么planning_node.yaml的参数将会被加载到/foo/planning_node下。

如果rosparam写在<node></node>的外面的话,如下:

<launch><arg name="ns" default="" /><rosparam command="load" file="$(find planning_node)/param/planning_node.yaml"></rosparam><node pkg="planning_node" name="planning_node" type="planning_node" output="screen" ns="/$(arg ns)"></node>
</launch>

则代表加载planning_node.yaml参数到全局命名空间下,即/下

至此,载参过程结束,载参结果可以通过rosparam list命令查看,注意参数会在roscore里存储,如果想彻底清除参数缓存,需重启roscore。之后需要在程序里读取参数,这里需要用到ros::NodeHandle来进行参数读取。

ros::NodeHandle的初始化基本也有两种写法,一种是调用默认构造函数,即ros::NodeHandle n1,这里n1是全局命名空间下的nodehandle。另一种是用"~"参数进行构造,即ros::NodeHandle n2("~"),这里n2是局部命名空间下的nodehandle。创建完nodehandle之后,就可以使用对象里的getParam方法进行参数读取

n1.getParam("bar", temp_str);
n2.getParam("bar", temp_str);

这里使用n1的get到的是全局命名空间下的参数,即找的是"/bar"下的参数。而n2的get到的是局部命名空间下的参数,即找的是"/planning_node/bar"下的参数,如果ns被设置成"ns=foo",则找的是"/foo/planning/bar"下的参数。

为了避免多个节点命名空间的冲突,推荐载参和读参均采用局部命名空间的写法。