ROS实践笔记8
参数服务器的具体实现
在c++中实现增删改查可以使用两套API实现
ros::NodeHandle
ros::param
c++
# include"ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"Talker_c");
ros::NodeHandle nh;
//添加参数 ----------------->
//方案一:ros::NodeHandle
nh.setParam("type_nh","xiaohuang");
nh.setParam("radius_nh/m",0.15);
//方案二:ros::param
ros::param::set("type_pa","xiaobai");
ros::param::set("radius_pa/m",0.13);
//修改参数------------------>
//实际是覆盖
//方案一:ros::NodeHandle
nh.setParam("radius_nh/m",0.19);
//方案二:ros::param
ros::param::set("radius_pa/m",0.17);
//删除参数------------------>
//方案一:ros::NodeHandle
bool flag1=nh.deleteParam("type_nh");
if(flag1) ROS_INFO("删除成功!");
else ROS_INFO("删除失败");
//方案2:ros::param
bool flag2=ros::param::del("type_pa");
if(flag2) ROS_INFO("删除成功!");
else ROS_INFO("删除失败");
return 0;
}
# include"ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"Listener_c");
ros::NodeHandle nh;
//查询参数:
//方案一:ros::NodeHandle
//1.param
double radius1 =nh.param("radius_nh/m",-1.00);
//若不存在则返回默认值-1.00,默认值应与参数值格式相同;
if(radius1==-1.00) ROS_INFO("参数不存在!");
else ROS_INFO("radius_nh = %.2fm",radius1);
//2.getParam
double radius2=0.0;
bool flag1=nh.getParam("radius_nh/m",radius2);\
//也可以用bool flag=nh.getParamCached("radius_nh/m",radius2);
//从缓存中获取数据,提高性能
if(flag1) ROS_INFO("radius_nh = %.2fm",radius2);
else ROS_INFO("参数不存在!");
//4.getParamNames
std::vector<std::string> names;
nh.getParamNames(names);
for(std::string &name:names) ROS_INFO("获取参数的名称是:%s",name.c_str());
//5.hasParam
bool flag2=nh.hasParam(names[0]);
if(flag2) ROS_INFO("存在:%s",names[0].c_str());
else ROS_INFO("不存在:%s",names[0].c_str());
//6.searchParam
std::string key;
nh.searchParam(names[0],key);
ROS_INFO("查找到的值为 : %s",key.c_str());
//方案二:ros::param与上面的函数有一一对应关系。不再编写
return 0;
}
python
#! /usr/bin/env python
import rospy
if __name__=="__main__":
rospy.init_node("Talker_p")
# 添加和修改
rospy.set_param("type_p","xiaohuangche")
rospy.set_param("radius_p",11.5)
# 删除,重复删除会产生异常
try:
rospy.delete_param("type_p")
except Exception as e:
rospy.loginfo("被删除的节点不存在!")
#! /usr/bin/env python
from ast import For
import rospy
if __name__=="__main__":
rospy.init_node("Listener_p")
# 方式一:get_param
type=rospy.get_param("type_p","NO")
if type!="NO":
rospy.loginfo("type_p = %s",type)
else:
rospy.loginfo("type_p不存在!")
# 方式二:get_param_cached,和一相同格式,效率更高
# 方式三:get_param_names 获取所有key的值
names = rospy.get_param_names()
for name in names:
rospy.loginfo("name = %s",name)
# 方式四:has_param
flag1 = rospy.has_param("type_p")
if flag1 :
rospy.loginfo("YES!")
else:
rospy.loginfo("NO!")
# 方式五:search_param,不存在返回None
key = rospy.search_param("type_p")
rospy.loginfo("key = %s",key)
查看参数列表
rosparam list
获取参数值
rosparam get /type_nh
# type_nh是参数名

浙公网安备 33010602011771号