ros将参数文件上传到服务器,rosparam与参数服务器

机器人的参数一般会提前设置好,这些参数都会放在 yaml 文件里,但有些参数是需要动态改变的,调试导航时尤其如此。于是 ROS 提供了 rosparam 命令和参数服务器这两个工具。rosparam命令的方便之处在于它可以直接读取 yaml 文件中的参数,而不必自己找第三方库去文件中读取。

一般在 package 的文件夹里会建一个param文件夹,也就是与launch和msg同一级,yaml 文件就放在这个param文件夹里。

rosparam dump # 保存参数到一个文件

使用rosparam load file.yaml命令将多个参数加载到参数服务器,在用到时会从服务器中获取。但实际上,这个命令直接用得不多。要将一个 yaml 文件中的参数在节点启动时都加载到参数服务器,一般是在 launch 文件中使用rosparam标签:1

2

加载完成后,可以使用一些调试性的命令了。用rosparam list查看所有参数。可以用rosparam get param查看某参数的值,用rosparam set param value设定参数的值。另外还可以用rosparam delete param删除某个参数。

使用rosparam get时要注意,参数名称不只是 yaml 文件中的名称,而是一个完整名称,比如.yaml中是这样的:1

2

3

TrajectoryPlannerROS:

int_param: 2

max_vel_x: 0.15

要获得max_vel_x的值,命令是rosparam get /move_base/TrajectoryPlannerROS/max_vel_x,也就是/node/tag/param

ros将参数文件上传到服务器,rosparam与参数服务器_第1张图片

特性

启动 ROS 节点后, 用rosparam get param可获知各个参数值,而且发现在关掉所有节点后,仍然能用rosparam get获得参数值,可见它被存到参数服务器里了

程序中的 param

加载参数的方法其实有三种,除了上面说的直接用rosparam load命令和 launch 文件中使用 load 外,还可以在程序中使用param和setParam,getParam函数,这里和 yaml 文件就没关系了。1

2

3

4

5

6

7

8

9

10

std::string s;

int num;

n.getParam("string_param", s);

pn.getParam("int_param", num);

n.setParam("string_param", "hehe");

pn.setParam("int_param", 222);

n.param<:string>("string_param", s, "haha");

pn.param("int_param", num, 666)

getParam() 函数可以从参数服务器获取参数值。如果成功,变量 s 和 num 的值将会被修改为参数值,函数返回 true;如果不成功(譬如参数服务器没有设置这个参数),变量 s 和 num 将保持原值,函数会返回 false。setParam() 就是设置参数的值了。param() 函数从参数服务器取参数值给变量。如果无法获取,则将默认值赋给变量,和 param() 函数的区别是还提供了一个默认值。

还有ros::NodeHandle::hasParam()和ros::NodeHandle::deleteParam()函数,不过用的不多

注意

使用 yaml 文件时,一定要注意格式的正确,但是最好不要用 - 符号,也就是不要用数组项,否则可能出问题,之前尝试使用一个第三方库读取 yaml 文件时,总是读取失败,发现只有加上 - 符号,也就是将参数作为数组项后才能正常读取。但再用rosparam get读取这个文件中的参数就会出错,结果获得的全是默认值,不是当前值。用rosparam list会发现加载的参数不全,原因是 yaml 文件中这样编辑:1

2

3

4

TrajectoryPlannerROS:

-name: value

int_param: 2

max_vel_x: 0.15

不要加-name一行,也就是反而不能使用标准的 yaml 格式

你可能感兴趣的:(ros将参数文件上传到服务器)