介绍
- ros参数服务器能保存的数据类型包括:字符串 整型 浮点型 布尔型 列表 词典等
- ROS提供了两种管理参数的API,一个是在ros::param 命名空间,一个是通过ros::NodeHandle接口,在底层,参数服务器基于XMLRPC与节点进行通信。
- 参数根据类型不同可分为:全局参数 相对参数 私有参数等。其中以“/”开头的为全局参数,以“~”开头的参数为私有参数,其他的为相对参数。
- 在roslaunch文件中,当param作为launch标签的子标签出现时,参数为全局参数,当param标签作为node标签的子标签出现时,参数为相对参数。示例代码如下:
<launch>
<param name="serial" value="5"/>
<node name="client" pkg="example_3" type="client" output="screen">
<param name="client_x" type="int" value="1">
</node>
</launch>
操作参数
ROS提供了获取,设置,缓存,检查,删除,搜索等多种参数的操作方法
获取参数
参数的返回值目前支持int double std::string bool XmlRpc::XmlRpcValue等。
通过NodeHandle获取参数的示例代码如下:
ros::NodeHandle nh("~");
bool unreliable=false;
nh.getParam("unreliable",unreliable);
通过ros::param 命令空间获取参数:
const std::string param_name=argv[1];
ROS_INFO_STREAM("Loooking for TF in parameter: "<<param_name);
XmlRpc::XmlRpcValue tf_data;
ros::param::get(param_name,tf_data)
在ROS Groovy之后,开发者可以获取std::vector std::map 等作为容器的列表参数
ros::NodeHandle nh;
std::map<std::string,std::string> map_s,map_s2;
std::map<std::string,std::string>::iterator iter;
std::string mapStr;
map_s["a"]="foo";
map_s["b"]="bar";
map_s["c"]="baz";
nh.setParam("map_string",map_s);
nh.getParam("map_string",map_s2);
for(iter=map_s2.begin();iter!=map_s2.end();iter++)
{
mapStr+=iter->second;
}
设置参数
通过Nodehandle设置参数
ros::NodeHandle nh;
nh.setParam("/user_sim_time",true); //全局参数
通过ros::param命令空间设置参数
ros::param::set("~filename",argv[1]); //私有参数
参数缓存
为了避免每次参数获取都需要访问参数服务器,ROS还提供了参数缓存功能
通过NodeHandle进行参数缓存:
ros::NodeHandle nh;
bool disable_file_logging=false;
nh.getParamCached("/rosout/disable_file_logging",disable_file_logging);
通过ros::param进行参数缓存:
bool diable_topics_;
ros::param::getCached("/rosout_disable_topics_generation",disable_topics_);
检查参数
NodeHandle:
ros::NodeHandle private_node("~");
if(!private_node.hasParam("turtle"))
{
}
ros::param
const std::string param_name=argv[1];
ROS_INFO_STREAM("Looking for TF in parameter: "<<param_name);
XmlRpc::XmlRpcValue tf_data;
if(!ros::param::has(param_name)||!rps::get(param_name,tf_data))
{
ROS_FATAL_STREAM("Could not read TF from parameter server: "<<param_name);
return -1;
}
删除参数
NodeHandle:
ros::NodeHandle nh;
nh.deleteParam("my_param");
ros::param
ros::param::del("my_param");
搜索参数
NodeHandle
std::string searched_param;
std::string tf_prefix;
ros::NodeHandle local_nh("~");
local_nh.searchParam("tf_prefix",searched_param);
ros::param
std::string key;
if(ros::param::search("bar",key))
{ }