ROS服务器参数实例

打印 上一主题 下一主题

主题 936|帖子 936|积分 2808

ROS服务器参数实例

一、参数预设

  1. #include "ros/ros.h"
  2. int main(int argc,char *argv[])
  3. {
  4.     ros::init(argc,argv,"set_update_param");
  5.     std::vector<std::string> stus;
  6.     stus.push_back("zhangsan");
  7.     stus.push_back("lisi");
  8.     stus.push_back("wangwu");
  9.     stus.push_back("sundanaodai");
  10.     std::map<std::string,std::string> friends;
  11.     friends["guo"]="huang";
  12.     friends["yuang"]="xiao";
  13.     //方法1:通过调用节点实例设置参数
  14.     ros::NodeHandle nh;
  15.     nh.setParam("nh_int",10);
  16.     nh.setParam("nh_double",3.1415926);
  17.     nh.setParam("nh_bool",true);
  18.     nh.setParam("nh_string","Hello world!");
  19.     nh.setParam("nh_vector",stus);
  20.     nh.setParam("nh_map",friends);
  21.     //修改参数
  22.     nh.setParam("nh_int",100);
  23.     //方法2:通过ros定义的param类实例化参数
  24.     ros::param::set("param_int",20);
  25.     ros::param::set("param_double",3.14);
  26.     ros::param::set("param_string","Hello Param");
  27.     ros::param::set("param_bool",false);
  28.     ros::param::set("param_vector",stus);
  29.     ros::param::set("param_map",friends);
  30.     //修改参数
  31.     ros::param::set("param_bool",true);
  32.     return 0;
  33. }
复制代码
题目:
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;
  1. 这里声明了一个 std::vector 类型的变量 stus,
  2. 这个 vector 存储 std::string 类型的元素,也就是一组字符串。
  3. std::vector<std::string> 是一个模板类,
  4. 表示一个存储字符串的动态数组。
  5. vector 是 C++ 标准库提供的一个可以动态改变大小的容器类。
复制代码
stus.push_back(“zhangsan”);
  1. push_back 是 std::vector 类的一个成员函数,
  2. 用于在 vector 的末尾添加一个新的元素。
  3. 这里将字符串 "zhangsan" 添加到 stus 这个 vector 中。
复制代码
stus.push_back(“lisi”);
  1. 同样地,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::map<std::string, std::string> friends;
  1. 这里声明了一个 std::map 类型的变量 friends,
  2. 它是一个映射容器,用于存储键值对。
  3. std::map<std::string, std::string> 表示这个 map 的
  4. 键(key)是 std::string 类型,值(value)也是 std::string 类型。
  5. std::map 是 C++ 标准库提供的一种关联容器,
  6. 通常用于存储一组键值对,并且每个键在容器中是唯一的。
  7. 内部会自动按键的顺序排序。
复制代码

  • 向 map 添加键值对:
friends[“guo”] = “huang”;
  1. 这行代码向 friends 这个 map 中插入一个键值对,
  2. 其中键(key)是 "guo",值(value)是 "huang"。
  3. 如果 guo 这个键在 map 中已经存在,值会被更新为 "huang",
  4. 如果不存在,新的键值对就会被插入到 map 中。
复制代码
friends[“yuang”] = “xiao”;
  1. 这行代码向 friends 中添加另一个键值对,其中键是 "yuang",值是 "xiao"。
复制代码

  • friends 中的内容:
执行完这两行代码后,friends 这个 map 中会包含以下两个键值对:
  1. 键 "guo" 对应的值是 "huang"。
  2. 键 "yuang" 对应的值是 "xiao"。
复制代码

  • 访问元素:
可以通过键来访问对应的值:
std::cout << friends[“guo”] << std::endl; // 输出 “huang”
std::cout << friends[“yuang”] << std::endl; // 输出 “xiao”
3.总结给服务器设置参数的两种方法

方法1:通过调用节点实例设置参数
  1. ros::NodeHandle nh;
  2. nh.setParam("nh_int",10);
  3. nh.setParam("nh_double",3.1415926);
  4. nh.setParam("nh_bool",true);
  5. nh.setParam("nh_string","Hello world!");
  6. nh.setParam("nh_vector",stus);
  7. nh.setParam("nh_map",friends);
复制代码
方法2:通过ros界说的param类实例化参数
  1. ros::param::set("param_int",20);
  2. ros::param::set("param_double",3.14);
  3. ros::param::set("param_string","Hello Param");
  4. ros::param::set("param_bool",false);
  5. ros::param::set("param_vector",stus);
  6. ros::param::set("param_map",friends);
复制代码
二、参数获取、打印

  1. #include "ros/ros.h"
  2. int main(int argc,char *argv[])
  3. {
  4.     setlocale(LC_ALL,"");
  5.     ros::init(argc,argv,"getParam");
  6.     ROS_INFO("++++++++++++++++++++++++++++++++++++");
  7.     int res3 = ros::param::param("param_int",20);
  8.     int res4 = ros::param::param("param_int2",20);
  9.     ROS_INFO("param获取结果:%d, %d",res3,res4);
  10.     int param_int_value;
  11.     double param_double_value;
  12.     bool param_bool_value;
  13.     std::string param_string_value;
  14.     std::vector<std::string> param_stus;
  15.     std::map<std::string,std::string> param_friends;
  16.     ros::param::get("param_int",param_int_value);
  17.     ros::param::get("param_double",param_double_value);
  18.     ros::param::get("param_bool",param_bool_value);
  19.     ros::param::get("param_string",param_string_value);
  20.     ros::param::get("param_vector",param_stus);
  21.     ros::param::get("param_map",param_friends);
  22.     ROS_INFO("getParam获得的结果为:%d,%.2f,%s,%d。",
  23.     param_int_value,
  24.     param_double_value,
  25.     param_string_value.c_str(),
  26.     param_bool_value
  27.     );
  28.     for(auto &&stu : param_stus)
  29.     {
  30.         ROS_INFO("stus 元素:%s",stu.c_str());
  31.     }
  32.     for(auto &&f : param_friends)
  33.     {
  34.         ROS_INFO("map元素: %s = %s",f.first.c_str(),f.second.c_str());
  35.     }
  36.     ros::param::getCached("param_int",param_int_value);
  37.     ROS_INFO("通过缓存获取数据:%d",param_int_value);
  38.     std::vector<std::string> param_names2;
  39.     ros::param::getParamNames(param_names2);
  40.     for(auto &&name :param_names2)
  41.     {
  42.         ROS_INFO("名称解析name=%s",name.c_str());
  43.     }
  44.     ROS_INFO("-----------------------------------------");
  45.     ROS_INFO("存在 param_int 吗? %d",ros::param::has("param_int"));
  46.     ROS_INFO("存在 param_inttttt 吗? %d",ros::param::has("param_inttttt"));
  47.     std::string key;
  48.     ros::param::search("param_int",key);
  49.     ROS_INFO("搜索键:%s",key.c_str());
  50.     return 0;
  51. }
复制代码
题目:
1. int res3 = ros::param::param(“param_int”,20);

int res4 = ros::param::param(“param_int2”,20);

这里的res3是干嘛用?

  1. 如果参数 "param_int" 在参数服务器中已经设置了值,res3 将获取该值。
  2. 如果没有设置 "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 绑定到容器中当前元素的引用上。
  1. 如果容器中存储的是值类型(例如 std::string),那么 stu 就是该值的引用。
  2. 如果容器元素是复杂类型(比如对象或结构体),stu 就是该对象的引用。
复制代码

  • param_stus:
param_stus 是待遍历的容器,可以是任何支持范围-based for 循环的类型,比如 std::vector、std::list、std::array<T, N> 等。

  • “:” :
冒号是范围-based for 循环的关键部分,用来表示遍历容器中的每一个元素。它将 param_stus 中的每个元素逐一绑定到 stu 上,并在循环体中使用。

  • 团体明白:
当使用 for (auto &&stu : param_stus) 时,步伐会遍历 param_stus 中的每个元素,并根据元素的类型决定怎样绑定它:
  1. 如果是左值(常规元素),stu 会作为左值引用绑定;
  2. 如果是右值(临时元素),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;
}
  1. 在第一次循环中,stu 会绑定为 "Alice" 的引用。
  2. 第二次循环,stu 会绑定为 "Bob" 的引用。
  3. 第三次循环,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)。每个元素都有两个部分:
  1. f.first:代表 map 中的 键。
  2. 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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表