帮助文档
专业提供香港服务器、香港云服务器、香港高防服务器租用、香港云主机、台湾服务器、美国服务器、美国云服务器vps租用、韩国高防服务器租用、新加坡服务器、日本服务器租用 一站式全球网络解决方案提供商!专业运营维护IDC数据中心,提供高质量的服务器托管,服务器机房租用,服务器机柜租用,IDC机房机柜租用等服务,稳定、安全、高性能的云端计算服务,实时满足您的多样性业务需求。 香港大带宽稳定可靠,高级工程师提供基于服务器硬件、操作系统、网络、应用环境、安全的免费技术支持。
服务器资讯 / 香港服务器租用 / 香港VPS租用 / 香港云服务器 / 美国服务器租用 / 台湾服务器租用 / 日本服务器租用 / 官方公告 / 帮助文档
ROS参数服务器 理论+实操(C++)
发布时间:2024-03-06 22:03:10   分类:帮助文档
ROS参数服务器 理论+实操(C++) 目录 1.概念 2.作用 3.机制  注意!!! 4.数据类型 注意!!! 5.实操  1.参数服务器新增(修改)参数  2.参数服务器获取参数 3.参数服务器删除参数 1.概念 以共享的方式实现不同节点之间数据交互的通信模式。 2.作用 存储一些多节点共享的数据,类似于全局变量。 3.机制  1.Talker设置变量 Talker使用RPC向ROSMaster发送参数设置数据,包含参数名和参数值;ROS Master会将参数名和参数值保存到参数列表中。 2.Listener查询参数值 Listener通过RPC向ROSMaster发送参数查找请求,包含所要查找的参数名 3.ROS Master向Listener发送参数值 Master根据Listener的查找请求从参数列表中进行查找,查找到参数后,使用RPC将参数值发送给Listener。 注意!!! 如果Talker向Master更新参数值,Listener在不重新查询参数值的情况下是无法知晓参数值已经被更新的。所以在很多应用场景中,需要一种动态参数更新的机制 4.数据类型 参数可使用数据类型: 32-bit integers booleans strings doubles iso8601 dates lists base64-encoded binary data 字典 注意!!! 参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据 5.实操 实现参数增删改查操作 ps: 1.先进行功能包的建立(详情参见: ROS话题通信 理论+实操(C++)-博客) 2.在src/下建立实操(增改删查)cpp文件 3.配置CMake.Lists.txt文件 (详情参见:ROS话题通信 理论+实操(C++)-博客) 在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现: ros::NodeHandle ros::param  1.参数服务器新增(修改)参数  参数服务器操作之新增与修改(二者API一样)_C++实现:    在 roscpp 中提供了两套 API 实现参数操作     ros::NodeHandle         setParam("键",值)     ros::param         set("键","值")     示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数         修改(相同的键,不同的值) #include "ros/ros.h" int main(int argc, char *argv[]) { ros::init(argc,argv,"set_update_param"); std::vector stus; stus.push_back("zhangsan"); stus.push_back("李四"); stus.push_back("王五"); stus.push_back("孙大脑袋"); std::map friends; friends["guo"] = "huang"; friends["yuang"] = "xiao"; //NodeHandle-------------------------------------------------------- ros::NodeHandle nh; nh.setParam("nh_int",10); //整型 nh.setParam("nh_double",3.14); //浮点型 nh.setParam("nh_bool",true); //bool nh.setParam("nh_string","hello NodeHandle"); //字符串 nh.setParam("nh_vector",stus); // vector nh.setParam("nh_map",friends); // map //修改演示(相同的键,不同的值) nh.setParam("nh_int",10000); //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_int",20000); return 0; } 效果呈现:   PS !!! 查询参数列表命令:rosparam list 查询具体参数值:rosparam get  /nh_int(举了个栗子)  2.参数服务器获取参数  参数服务器操作之查询_C++实现:    在 roscpp 中提供了两套 API 实现参数操作     ros::NodeHandle         param(键,默认值)             存在,返回对应结果,否则返回默认值         getParam(键,参数)            存在,返回 true,且将值赋值给参数             若果键不存在,那么返回值为 false,且不为参数赋值         getParamCached(键,参数)--提高变量获取效率            存在,返回 true,且将值赋值给参数             若果键不存在,那么返回值为 false,且不为参数赋值         getParamNames(std::vector)            获取所有的键,并存储在参数 vector 中          hasParam(键)            是否包含某个键,存在返回 true,否则返回 false         searchParam(参数1,参数2)            搜索键,参数1是被搜索的键,参数2存储搜索结果的变量     ros::param ----- 与 NodeHandle 类似 #include "ros/ros.h" int main(int argc, char *argv[]) { setlocale(LC_ALL,"");//防止中文乱码 ros::init(argc,argv,"get_param"); //NodeHandle-------------------------------------------------------- ros::NodeHandle nh; // param 函数 int res1 = nh.param("nh_int",100); // 键存在 int res2 = nh.param("nh_int2",100); // 键不存在 ROS_INFO("param获取结果:%d,%d",res1,res2); // getParam 函数 int nh_int_value; double nh_double_value; bool nh_bool_value; std::string nh_string_value; std::vector stus; std::map friends; nh.getParam("nh_int",nh_int_value); nh.getParam("nh_double",nh_double_value); nh.getParam("nh_bool",nh_bool_value); nh.getParam("nh_string",nh_string_value); nh.getParam("nh_vector",stus); nh.getParam("nh_map",friends); ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d", nh_int_value, nh_double_value, nh_string_value.c_str(), nh_bool_value ); for (auto &&stu : stus) { ROS_INFO("stus 元素:%s",stu.c_str()); } for (auto &&f : friends) { ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str()); } // getParamCached() nh.getParamCached("nh_int",nh_int_value); ROS_INFO("通过缓存获取数据:%d",nh_int_value); //getParamNames() std::vector param_names1; nh.getParamNames(param_names1); for (auto &&name : param_names1) { ROS_INFO("名称解析name = %s",name.c_str()); } ROS_INFO("----------------------------"); ROS_INFO("存在 nh_int 吗? %d",nh.hasParam("nh_int")); ROS_INFO("存在 nh_intttt 吗? %d",nh.hasParam("nh_intttt")); std::string key; nh.searchParam("nh_int",key); ROS_INFO("搜索键:%s",key.c_str()); */ //param-------------------------------------------------------- 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); // getParam 函数 int param_int_value; double param_double_value; bool param_bool_value; std::string param_string_value; std::vector param_stus; std::map 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()); } // getParamCached() ros::param::getCached("param_int",param_int_value); ROS_INFO("通过缓存获取数据:%d",param_int_value); //getParamNames() std::vector 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_intttt 吗? %d",ros::param::has("param_intttt")); std::string key; ros::param::search("param_int",key); ROS_INFO("搜索键:%s",key.c_str()); return 0; } 3.参数服务器删除参数  参数服务器操作之删除_C++实现:     ros::NodeHandle         deleteParam("键")         根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false     ros::param         del("键")         根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false #include "ros/ros.h" int main(int argc, char *argv[]) { setlocale(LC_ALL,""); ros::init(argc,argv,"delete_param"); ros::NodeHandle nh; bool r1 = nh.deleteParam("nh_int"); ROS_INFO("nh 删除结果:%d",r1); bool r2 = ros::param::del("param_int"); ROS_INFO("param 删除结果:%d",r2); return 0; } ps:参数的查和删就不演示了,记得还是要重新编写cpp文件,在CMake.lists.txt里配置,编译(Ctrl+Shift+B)之后再进行操作
香港云服务器租用推荐
服务器租用资讯
·广东云服务有限公司怎么样
·广东云服务器怎么样
·广东锐讯网络有限公司怎么样
·广东佛山的蜗牛怎么那么大
·广东单位电话主机号怎么填写
·管家婆 花生壳怎么用
·官网域名过期要怎么办
·官网邮箱一般怎么命名
·官网网站被篡改怎么办
服务器租用推荐
·美国服务器租用
·台湾服务器租用
·香港云服务器租用
·香港裸金属服务器
·香港高防服务器租用
·香港服务器租用特价