ROS学习之参数
除 了 前 面 介 绍 过 的 消 息 传 递 , ROS 还 提 供 另 一 种 参 数( parameters )机制用于获取节点的信息。其主要思想是使用集中参数服务器( parameter server )维护一个变量集的值,包括整数、浮点数、字符串以及其他数据类型,每一个变量用一个较短的字符串标识 。由于允许节点主动查询其感兴趣的参数的值,它们适用于配置那些不会随时间频繁变更的信息。
0.1命令行指令
0.1.1参数列表
rosparam list 显示当前所有参数
注意:在当前版本的 ROS 中,参数服务器是节点管理器的一部分,因此,它总是通过 roscore 或者 roslaunch 自动启动。在所有情况下,参数服务器都能在后台正常工作,因此没有必要去花心思考虑它。然而,需要铭记的是,所有的参数都属于参数服务器而不是任何特定的节点。这意味着参数——即使是由节点创建的——在节点终止时仍将继续存在。
0.1.2查询参数
rosparam get parameter_name 查询某个参数值
例如,如下命令将读取参数/rosdistro 的值:
rosparam get /rosdistro
其输出为字符串 indigo,这并不奇怪(译者注:rosdistro 指ROS 的版本,如果读者使用其他的发行版,将产生不同的输出)。
0.1.3设置参数
rosparam set parameter_name parameter_value
该命令可以修改已有参数的值或者创建一个新的参数。例如,以下命令可以创建一系列字符串参数,用以存储一组卡通鸭子的颜色偏好:
rosparam set /duck_colors/huey red
rosparam set /duck_colors/dewey blue
rosparam set /duck_colors/louie green
rosparam set /duck_colors/webby pink
另外,我们可以同时设置同一命名空间中的几个参数:
rosparam set namespace values
这里要以 YAML 字典的形式表示参数和对应值的映射关系。
下面的例子和前面四行命令具有同样的作用:
rosparam set /duck_colors "huey: red
dewey: blue
louie: green
webby: pink"
需要注意的是,这种语法需要在命令中使用换行符。当然,这并不会造成什么问题,因为第一个引号告诉 bash 命令尚未完成。当在引号内按下回车时,终端将插入一个换行符而不是执行命令。
0.1.4创建和加载参数文件
为了以 YAML 文件的形式存储命名空间中的所有参数,可以使用 rosparam dump 命令:
rosparam dump filename namespace
与 dump 相反的命令是 load,它从一个文件中读取参数,并将它们添加到参数服务器:
rosparam load filename namespace
0.2用C++获取参数
使用ROS参数的C++接口是相当简单的:
void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
在这两种情况下,参数名是一个字符串,它可以是全局的、相对的或者是私有的。set 函数中的输入值 input_value 可以是std::string、bool、int 或 double 类型;get 函数的输出值应该是上述某个类型的变量(通过引用传递)。如果参数值读取成功,则get 函数返回 true;如果出现了问题,通常表示所请求的参数还没有被指定一个值,则该函数返回 false。举例如下:
ros::param::set ("background_r" , 255) ; ros::param::set ("background_g" , 255) ; ros::param::set ("background_b" , 0) ;
以上为设置我们的背景颜色参数。
const std::string PARAM_NAME = "~max_vel" ; double maxVel ; bool ok = ros::param::get (PARAM_NAME, maxVel) ;
以上为读取“~max_vel”参数值,并存储到本地变量maxvel中。
0.3在启动文件中设置参数
0.3.1设置参数
可以使用param元素请求roslaunch设置参数值 :<param name="param-name" value="param-value" />这个元素,正如你所猜测的,将给定的值赋给给定名称的参数。通常,这个参数名是相对的。例如,下面的启动文件片段相当于第 129 页的 rosparam 命令集:
<group ns="duck_colors">
<param name="huey" value="red" />
0.3.2私有参数
设置私有参数 另一个可选方法是在节点元素中包含 param 元素。
<node . . . >
<param name="param-name" value="param-value" />
. . .
</node>
在该结构下,参数名将被当做该节点的私有名称。
0.3.3在文件中读取参数
最后,启动文件也支持 与rosparam load等价的命令,可以一次性从文件中加载多个参数 7 :
<rosparam command="load" file="path-to-param-file" />
这里列出的参数文件通常是通过 rosparam dump 命令创建的。与其他特定文件的引用相同(例如 6.5.1 节的 include 元素),使用查找替换来指定功能包的相对路径是常见做法:
<rosparam
file="$(find package-name)/param-file"
/>
与 rosparam load 一样,这个功能有助于测试,因为它允许用
户重现在过去的某个时间有效的参数。