< >
Home » ROS与C++入门教程 » ROS与C++入门教程-参数服务器

ROS与C++入门教程-参数服务器

ROS与C++入门教程-参数服务器

说明:

  • 介绍roscpp的参数服务器及参数的使用

参数服务器

  • ROS参数服务器能保存数据类型包括:strings, integers, floats, booleans, lists, dictionaries, iso8601 dates, and base64-encoded data。Dictionaries则必需有字符串key值。
  • roscpp参数API能支持全部类型,多数情况容易使用的类型有:strings, integers, floats and booleans,使用其他类型参考XmlRpc::XmlRpcValue class
  • roscpp有两个版本的API接口:bare版和handle版。
  • bare版:在 ros::param 命令空间下。
  • handle版:通过ros::NodeHandle接口使用。

获取参数

  • 从参数服务器获取值,每个版本都支持strings, integers, doubles, booleans 和XmlRpc::XmlRpcValue
  • 返回 false代表参数不存在或不是正确的类型,同样有版本是返回默认值。

(1)NodeHandle版本

  • ros::NodeHandle::getParam()
  • NodeHandle版本:参数相对于NodeHandle的命名空间进行解析。查阅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))
{
...
}

// Default value version
nh.param<std::string>("default_param", default_param, "default_value");

(2)bare版本

  • ros::param::get()
  • bare版本:参数相对于节点的命名空间进行解析。
  • 代码示例:
std::string global_name, relative_name, default_param;
if (ros::param::get("/global_name", global_name))
{
  ...
}

if (ros::param::get("relative_name", relative_name))
{
...
}

// Default value version
ros::param::param<std::string>("default_param", default_param, "default_value");

参数缓存

  • ros::NodeHandle::getParamCached() 和 ros::param::getCached() 能提供本地的缓存功能。
  • 使用这些版本通知参数服务器在更改参数时希望通知该节点的参数服务器,并防止节点在随后的调用中重新使用参数服务器查找值。
  • 缓存的参数是一个显着的速度增长(在第一次调用),但应谨慎使用,避免超载的主节点。缓存参数在当前节点和主节点之间的间歇性连接问题的情况下也不可靠。

设置参数

(1)NodeHandle版本

  • ros::NodeHandle::setParam()
  • NodeHandle版本:参数相对于NodeHandle的命名空间进行解析。查阅NodeHandle详细信息
  • 代码示例:
ros::NodeHandle nh;
nh.setParam("/global_param", 5);
nh.setParam("relative_param", "my_string");
nh.setParam("bool_param", false);

(2)bare版本

  • ros::param::set()
  • bare版本:参数相对于节点的命名空间进行解析。
  • 代码示例:
ros::param::set("/global_param", 5);
ros::param::set("relative_param", "my_string");
ros::param::set("bool_param", false);

检查参数是否存在

  • handle版:ros::NodeHandle::hasParam()
  • 示例代码:
ros::NodeHandle nh;
if (nh.hasParam("my_param"))
{
  ...
}
  • bare版:ros::param::has()
  • 示例代码:
if (ros::param::has("my_param"))
{
  ...
}

删除参数

  • handle版:ros::NodeHandle::deleteParam()
  • 示例代码:
ros::NodeHandle nh;
nh.deleteParam("my_param");
  • bare版:ros::param::del()
  • 示例代码:
ros::param::del("my_param");

访问私有参数

  • handle版:创建的ros::NodeHandle实例,并提供私有的命名空间作为其命名空间
  • 示例代码:
ros::NodeHandle nh("~");
std::string param;
nh.getParam("private_name", param);
  • bare版:您可以访问用于描述它们的相同符号的私有参数
  • 示例代码:
std::string param;
ros::param::get("~private_name", param);

搜索参数

  • 有时需要从最近命名空间中获取参数。

  • 例如,如果你有一个“robot_name”参数,你只想搜索向上从你的私人空间直到你找到一个匹配的参数。

  • 类似地,如果你有一组相机节点,你可能希望在共享命名空间中设置一些参数,但是通过将它们设置为私有(~name)命名空间来重写其他参数。

  • 注意:为了有效地使用搜索,你应该使用它的相对名称,而不是/global 或~private 名

  • handle版:ros::NodeHandle::searchParam()

  • 示例代码:

std::string key;
if (nh.searchParam("bar", key))
{
  std::string val;
  nh.getParam(key, val);
}
  • bare版:ros::param::search()
  • 示例代码:
std::string key;
if (ros::param::search("bar", key))
{
  std::string val;
  ros::param::get(key, val);
}

列表参数

  • 在groovy版新增
  • 你可以获取或设置lists、dictionaries和strings作为std::vector 和std::map 容器的模板值
  • 这些模板值类型包括:
    • bool
    • int
    • float
    • double
    • string
  • 获取或设置方法:
    • handle版: ros::NodeHandle::getParam / ros::NodeHandle::setParam
    • bare版:ros::param::get / ros::param::set
  • 代码示例:
// Create a ROS node handle
ros::NodeHandle nh;

// Construct a map of strings
std::map<std::string,std::string> map_s, map_s2;
map_s["a"] = "foo";
map_s["b"] = "bar";
map_s["c"] = "baz";

// Set and get a map of strings
nh.setParam("my_string_map", map_s);
nh.getParam("my_string_map", map_s2);

// Sum a list of doubles from the parameter server
std::vector<double> my_double_list;
double sum = 0;
nh.getParam("my_double_list", my_double_list);
for(unsigned i=0; i < my_double_list.size(); i++) {
  sum += my_double_list[i];
}
  • 在Fuerte版本之前,列表参数只能通过XmlRpc::XmlRpcValue类获取
  • 代码示例:
XmlRpc::XmlRpcValue my_list;
nh.getParam("my_list", my_list);
ROS_ASSERT(my_list.getType() == XmlRpc::XmlRpcValue::TypeArray);

for (int32_t i = 0; i < my_list.size(); ++i) 
{
  ROS_ASSERT(my_list[i].getType() == XmlRpc::XmlRpcValue::TypeDouble);
  sum += static_cast<double>(my_list[i]);
}

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ROS与C++入门教程