ROS服务器参数实例
一、参数预设
- #include "ros/ros.h"
- int main(int argc,char *argv[])
- {
- ros::init(argc,argv,"set_update_param");
- std::vector<std::string> stus;
- stus.push_back("zhangsan");
- stus.push_back("lisi");
- stus.push_back("wangwu");
- stus.push_back("sundanaodai");
- std::map<std::string,std::string> friends;
- friends["guo"]="huang";
- friends["yuang"]="xiao";
- //方法1:通过调用节点实例设置参数
- ros::NodeHandle nh;
- nh.setParam("nh_int",10);
- nh.setParam("nh_double",3.1415926);
- nh.setParam("nh_bool",true);
- nh.setParam("nh_string","Hello world!");
- nh.setParam("nh_vector",stus);
- nh.setParam("nh_map",friends);
- //修改参数
- nh.setParam("nh_int",100);
- //方法2:通过ros定义的param类实例化参数
- ros::param::set("param_int",20);
- ros::param::set("param_double",3.14);
- ros::param::set("param_string","Hello Param");
- ros::param::set("param_bool",false);
- ros::param::set("param_vector",stus);
- ros::param::set("param_map",friends);
- //修改参数
- ros::param::set("param_bool",true);
- return 0;
- }
复制代码 题目:
1.std::vector< std::string> stus;
stus.push_back(“zhangsan”);
stus.push_back(“lisi”);
stus.push_back(“wangwu”);
stus.push_back(“sundanaodai”);
这几行代码啥意思?
这几行代码使用 C++ 标准库中的 std::vector 类型来创建一个动态数组,并向其中添加几个字符串元素。
std::vector< std::string> stus;
- 这里声明了一个 std::vector 类型的变量 stus,
- 这个 vector 存储 std::string 类型的元素,也就是一组字符串。
- std::vector<std::string> 是一个模板类,
- 表示一个存储字符串的动态数组。
- vector 是 C++ 标准库提供的一个可以动态改变大小的容器类。
复制代码 stus.push_back(“zhangsan”);
- push_back 是 std::vector 类的一个成员函数,
- 用于在 vector 的末尾添加一个新的元素。
- 这里将字符串 "zhangsan" 添加到 stus 这个 vector 中。
复制代码 stus.push_back(“lisi”);
- 同样地,push_back 将字符串 "lisi" 添加到 stus 这个 vector 的末尾。
复制代码 2. std::map< std::string,std::string> friends;
friends[“guo”]=“huang”;
friends[“yuang”]=“xiao”;
这几行代码啥意思?
这段代码是使用 C++ 标准库中的 std::map 来创建一个键值对容器,并向其中添加了两个元素。
让我们逐行分析这段代码:
std::map<std::string, std::string> friends;
- 这里声明了一个 std::map 类型的变量 friends,
- 它是一个映射容器,用于存储键值对。
- std::map<std::string, std::string> 表示这个 map 的
- 键(key)是 std::string 类型,值(value)也是 std::string 类型。
- std::map 是 C++ 标准库提供的一种关联容器,
- 通常用于存储一组键值对,并且每个键在容器中是唯一的。
- 内部会自动按键的顺序排序。
复制代码 friends[“guo”] = “huang”;
- 这行代码向 friends 这个 map 中插入一个键值对,
- 其中键(key)是 "guo",值(value)是 "huang"。
- 如果 guo 这个键在 map 中已经存在,值会被更新为 "huang",
- 如果不存在,新的键值对就会被插入到 map 中。
复制代码 friends[“yuang”] = “xiao”;
- 这行代码向 friends 中添加另一个键值对,其中键是 "yuang",值是 "xiao"。
复制代码 执行完这两行代码后,friends 这个 map 中会包含以下两个键值对:
- 键 "guo" 对应的值是 "huang"。
- 键 "yuang" 对应的值是 "xiao"。
复制代码 可以通过键来访问对应的值:
std::cout << friends[“guo”] << std::endl; // 输出 “huang”
std::cout << friends[“yuang”] << std::endl; // 输出 “xiao”
3.总结给服务器设置参数的两种方法
方法1:通过调用节点实例设置参数
- ros::NodeHandle nh;
- nh.setParam("nh_int",10);
- nh.setParam("nh_double",3.1415926);
- nh.setParam("nh_bool",true);
- nh.setParam("nh_string","Hello world!");
- nh.setParam("nh_vector",stus);
- nh.setParam("nh_map",friends);
复制代码 方法2:通过ros界说的param类实例化参数
- ros::param::set("param_int",20);
- ros::param::set("param_double",3.14);
- ros::param::set("param_string","Hello Param");
- ros::param::set("param_bool",false);
- ros::param::set("param_vector",stus);
- ros::param::set("param_map",friends);
复制代码 二、参数获取、打印
- #include "ros/ros.h"
- int main(int argc,char *argv[])
- {
- setlocale(LC_ALL,"");
- ros::init(argc,argv,"getParam");
- ROS_INFO("++++++++++++++++++++++++++++++++++++");
- int res3 = ros::param::param("param_int",20);
- int res4 = ros::param::param("param_int2",20);
- ROS_INFO("param获取结果:%d, %d",res3,res4);
- int param_int_value;
- double param_double_value;
- bool param_bool_value;
- std::string param_string_value;
- std::vector<std::string> param_stus;
- std::map<std::string,std::string> param_friends;
- ros::param::get("param_int",param_int_value);
- ros::param::get("param_double",param_double_value);
- ros::param::get("param_bool",param_bool_value);
- ros::param::get("param_string",param_string_value);
- ros::param::get("param_vector",param_stus);
- ros::param::get("param_map",param_friends);
- ROS_INFO("getParam获得的结果为:%d,%.2f,%s,%d。",
- param_int_value,
- param_double_value,
- param_string_value.c_str(),
- param_bool_value
- );
- for(auto &&stu : param_stus)
- {
- ROS_INFO("stus 元素:%s",stu.c_str());
- }
- for(auto &&f : param_friends)
- {
- ROS_INFO("map元素: %s = %s",f.first.c_str(),f.second.c_str());
- }
- ros::param::getCached("param_int",param_int_value);
- ROS_INFO("通过缓存获取数据:%d",param_int_value);
- std::vector<std::string> param_names2;
- ros::param::getParamNames(param_names2);
- for(auto &&name :param_names2)
- {
- ROS_INFO("名称解析name=%s",name.c_str());
- }
- ROS_INFO("-----------------------------------------");
- ROS_INFO("存在 param_int 吗? %d",ros::param::has("param_int"));
- ROS_INFO("存在 param_inttttt 吗? %d",ros::param::has("param_inttttt"));
- std::string key;
- ros::param::search("param_int",key);
- ROS_INFO("搜索键:%s",key.c_str());
- return 0;
- }
复制代码 题目:
1. int res3 = ros::param::param(“param_int”,20);
int res4 = ros::param::param(“param_int2”,20);
这里的res3是干嘛用?
- 如果参数 "param_int" 在参数服务器中已经设置了值,res3 将获取该值。
- 如果没有设置 "param_int" 参数,res3 会被赋值为默认值 20。
复制代码 2. ros::param::get(“param_int”,param_int_value);啥意思?
这行代码是使用 ROS (Robot Operating System) 中的 ros::param::get 函数来从参数服务器获取一个名为 “param_int” 的参数值,并将其存储在 param_int_value 变量中。
3.for (auto &&stu : param_stus)
{
ROS_INFO(“stus 元素:%s”, stu.c_str());
}
啥意思?
- auto &&:
auto 是 C++11 引入的类型推断关键字。它允许编译器根据右侧表达式的类型自动推导变量 stu 的类型。
&& 是 右值引用。当你使用 auto && 时,它表示一个 万能引用,即:
假如 param_stus 中的元素是右值(临时对象),它会将其绑定为右值引用;
假如是左值(比如变量或引用),它会将其绑定为左值引用。
auto && 的目标是确保最优的性能,避免不须要的复制或移动操作。
例如,假如容器是一个 std::vectorstd::string,而元素是 std::string 类型,auto &&stu 会将每个 std::string 绑定为引用,从而避免复制整个字符串。具体是左值引用照旧右值引用,会根据容器元素的实际类型来决定。
- stu:
stu 是循环中的循环变量,表示当前遍历到的元素。stu 绑定到容器中当前元素的引用上。
- 如果容器中存储的是值类型(例如 std::string),那么 stu 就是该值的引用。
- 如果容器元素是复杂类型(比如对象或结构体),stu 就是该对象的引用。
复制代码 param_stus 是待遍历的容器,可以是任何支持范围-based for 循环的类型,比如 std::vector、std::list、std::array<T, N> 等。
冒号是范围-based for 循环的关键部分,用来表示遍历容器中的每一个元素。它将 param_stus 中的每个元素逐一绑定到 stu 上,并在循环体中使用。
当使用 for (auto &&stu : param_stus) 时,步伐会遍历 param_stus 中的每个元素,并根据元素的类型决定怎样绑定它:
- 如果是左值(常规元素),stu 会作为左值引用绑定;
- 如果是右值(临时元素),stu 会作为右值引用绑定。
复制代码 这种方式联合了 完美转发(perfect forwarding),即尽大概避免不须要的复制,确保性能最优。
举个例子:
假设我们有一个 std::vector< std::string>,内里存储了几个字符串:
std::vector< std::string> param_stus = {“Alice”, “Bob”, “Charlie”};
使用 for (auto &&stu : param_stus) 循环:
for (auto &&stu : param_stus)
{
std::cout << stu << std::endl;
}
- 在第一次循环中,stu 会绑定为 "Alice" 的引用。
- 第二次循环,stu 会绑定为 "Bob" 的引用。
- 第三次循环,stu 会绑定为 "Charlie" 的引用。
复制代码 3. for(auto &&f : param_friends)
{
ROS_INFO(“map元素: %s = %s”,f.first.c_str(),f.second.c_str());
}
f.first.c_str(),f.second.c_str() 啥意思?
在 map 或 unordered_map 中,元素是键值对(std::pair)。每个元素都有两个部分:
- f.first:代表 map 中的 键。
- f.second:代表 map 中的 值。
复制代码 4. ros::param::getCached(“param_int”,param_int_value);
啥意思?
这行代码用于从 ROS 参数服务器获取一个参数的值,并将其存储到变量 param_int_value 中。
ros::param::getCached 是 ROS 中用于获取参数的函数。它从 参数服务器 中读取指定参数的值,并将其存储在给定的变量中。
与 ros::param::get 不同,getCached 仅会在参数第一次获取时与参数服务器通信,之后的哀求会直接从本地缓存中读取该参数值,从而提高服从。
5.ros::param::getParamNames(param_names2);
啥意思?
ros::param::getParamNames:
ros::param::getParamNames 是 ROS 中用于获取全部参数名称的函数,这里就是指参数服务器里全部的参数的名称。
它会从 参数服务器 获取当前全部已设置的参数的名称(即参数的键名),
并将这些名称以字符串的形式存储到指定的容器中。
这个函数返回的是参数名的列表。
param_names2:
param_names2 是一个容器(通常是 std::vector< std::string> 类型的容器),用于存储获取到的参数名称。
在函数调用之后,param_names2 将包含全部参数的名称,类型为 std::vector< std::string>,每个元素是一个 string 类型的参数名。
6.ros::param::has(“param_int”);
ros::param::search(“param_int”,key);
啥意思?
ros::param::has(“param_int”):检查参数 param_int 是否存在于参数服务器上,返回一个布尔值(true 或 false)。
ros::param::search(“param_int”, key):查找参数 param_int,并将其完备路径(包括名称空间)存储到 key 中。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |