ros参数服务器调用_ROS与C++入门教程-参数服务器

本文介绍了ROS参数服务器的使用,包括参数类型、API接口、获取和设置参数、缓存、检查存在性、删除参数、访问私有参数以及搜索参数的方法。示例代码展示了如何通过NodeHandle和bare版本进行操作。
摘要由CSDN通过智能技术生成

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<: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<: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<: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 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(my_list[i]);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值