参考 roscpp/Overview/Parameter Server
0. 概述
ROS参数服务器能够保存 string, int, float, double, bool, list, dictionaries, base64 encoded类型的数据,如果需要保存其他类型可以使用 XmlRpc::XmlRpcValue class
roscpp 有两种不同的参数API
1. bare 版本 ros::param 接口
2. handle 版本 ros::NodeHandle 接口
1. 在参数服务器获取参数
ros::NodeHandle::getParam()
获得的参数相对节点句柄(NodeHandle)名称空间解析
ros::NodeHandle nh;
std::string global_name, relative_name, default_param;
if (nh.getParam("/global_name", global_name))
{
...
} if (nh.getParam("relative_name", relative_name))
{
...
} // 默认值
nh.param<std::string>("default_param", default_param, "default_value");
1.2 ros::param::get()
获得的参数相对node名称空间进行解析
std::string global_name, relative_name, default_param;
if (ros::param::get("/global_name", global_name))
{
...
} if (ros::param::get("relative_name", relative_name))
{
...
} // 默认值
ros::param::param<std::string>("default_param", default_param, "default_value");
1.3 缓存参数
ros::NodeHandle::getParamCached()
ros::param::getCached()
这两个函数可以完成本地参数的缓存,命令参数服务器一旦参数变化就立即通知这个节点。可以大大提高速度(首次调用之后),但是为了防止重载,应该谨慎使用。
2. 设置参数
ros::NodeHandle::setParam()
通过NodeHandle版本检索的参数相对于NodeHandle的名称空间来解析。
ros::NodeHandle nh;
nh.setParam("/global_param", 5);
nh.setParam("relative_param", "my_string");
nh.setParam("bool_param", false);
ros::param::set()
通过“bare”版本检索的参数将相对于节点的名称空间解析。
ros::param::set("/global_param", 5);
ros::param::set("relative_param", "my_string");
ros::param::set("bool_param", false);
3. 检查参数是否存在
ros::NodeHandle::hasParam()
ros::NodeHandle nh;
if (nh.hasParam("my_param"))
{
...
}
ros::param::has()
if (ros::param::has("my_param"))
{
...
}
4. 删除参数
ros::NodeHandle::deleteParam()
ros::NodeHandle nh;
nh.deleteParam("my_param");
ros::param::del()
ros::param::del("my_param");
5. 访问私有参数
handle 接口必须创建一个新的 ros::NodeHandle 以一个私有名称空间作为其名称空间。
ros::NodeHandle nh("~");
std::string param;
nh.getParam("private_name", param);
ros::param 版本
std::string param; ros::param::get("~private_name", param);
6.
有时候你需要从最近的工作空间获取参数。比如,如果你有一个名为 “robot_name” 的参数,你只想从自己的私有名称空间开始向上搜索知道找到匹配参数。
类似的,如果你有一组摄像机节点,你可能希望在一个公共的名称空间里共同设置一些参数但是在私有名称空间里重写其他参数。
注意: 为了使搜索更加高效, you should use it with relative names instead of /global and ~private names.
ros::NodeHandle::searchParam()
std::string key;
if (nh.searchParam("bar", key))
{
std::string val;
nh.getParam(key, val);
}
ros::param::search()
std::string key;
if (ros::param::search("bar", key))
{
std::string val;
ros::param::get(key, val);
}