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是参数名
posted @ 2022-02-15 00:22  一心如旧  阅读(64)  评论(0)    收藏  举报