ROS--参数服务器

本文详细介绍了在ROS(Robot Operating System)中使用C++进行参数的增、改、查操作,包括NodeHandle与ros::param API的使用示例,以及如何查询、设置和删除参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++

一、增与改(“覆盖”)

ros::NodeHandle
setParam(“键”,值)
ros::param
set(“键”,值)
修改:只需要继续调用 setParam 或 set 函数,保证键是已经存在的

#include "ros/ros.h"
/*
    需要实现参数的新增与修改:
    需求:首先设置机器人的共享参数,类型,半径
        再修改半径(0.15->0.2m)
    实现:
    ros::NodeHandle
        setParam("键",值)
    ros::param
        set("键",值)
    修改:只需要继续调用 setParam 或 set 函数,保证键是已经存在的,
*/

int main(int argc, char *argv[])
{
    //初始化ROS节点
    ros::init(argc,argv,"set_param_c");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数增---------------------------------------------
    //方案1:nh
    nh.setParam("type","xiaoHuang");
    nh.setParam("radius",0.15);
    //方案2:ros::param
    ros::param::set("type_param","xiaoBai");
    ros::param::set("radius_param",0.15);
    //参数改---------------------------------------------
    //参数覆盖,相当于修改
    //方案1:nh
    nh.setParam("radius",0.2); 
    //方案2:ros::param
    ros::param::set("radius_param",0.25);
    return 0;
}

修改前:
在这里插入图片描述修改后:
在这里插入图片描述

二、查询:

注:2与3只需要用一个
2.1 ros::NodeHandle----代码

#include "ros/ros.h"
/*
    演示参数的查询:
    实现:
    ros::NodeHandle----------------------------------------------
        param(键,默认值) 
            存在,返回对应结果,否则返回默认值

        getParam(键,存储结果的变量)
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

        getParamCached(键,存储结果的变量)--提高变量获取效率
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

        getParamNames(std::vector<std::string>)
            获取所有的键,并存储在参数 vector 中 

        hasParam(键)
            是否包含某个键,存在返回 true,否则返回 false

        searchParam(参数1,参数2)
            搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
*/

int main(int argc, char *argv[])
{
    //设置编码
    setlocale(LC_ALL,"");
    //初始化ROS节点
    ros::init(argc,argv,"set_param_c");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //ros::NodeHandle---------------------------------------------
    
    //1. param
    //正常获取为真实值,异常为0.5
    double radius = nh.param("radius",0.5); 
    ROS_INFO("1 radius = %.2f",radius);
    
    // 2. getParam (bool返回true或false,因返回浮点类型,故需声明double)
    // double radius2 = 0.0;
    // bool result = nh.getParam("radius",radius2);
    // if (result)
    // {
    //     ROS_INFO("获取的半径是: %.2f",radius2);
    // } else{
    //     ROS_INFO("被查询的变量不存在。");
    // }

    //3. getParamCached(键,存储结果的变量)--提高变量获取效率
    //getParamCached与getParam类似,只是性能上有提升,一般测试下看不出来
    double radius2 = 0.0;
    bool result = nh.getParamCached("radius",radius2);
    if (result)
    {
        ROS_INFO("3 获取的半径是: %.2f",radius2);
    } else{
        ROS_INFO("3 被查询的变量不存在。");
    }

    //4. getParamNames(std::vector<std::string>) 获取所有的键,并存储在参数 vector 中
    std::vector<std::string> names;
    nh.getParamNames(names);
    for (auto &&name : names)
    {
        ROS_INFO("4 遍历到的元素:%s",name.c_str());
    }
    
    //5. hasParam(键) 是否包含某个键,存在返回 true,否则返回 false
    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("radiusxxx");
    ROS_INFO("5 radius存在吗? %d",flag1);
    ROS_INFO("5 radiusxxx存在吗? %d",flag2);

    //6. searchParam(参数1,参数2) 搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
    std::string key;
    nh.searchParam("radius",key);
    ROS_INFO("6 搜索的结果: %s",key.c_str());
    return 0;
}

2.1.2 输出:
在这里插入图片描述

2.2 ros::param---------------------------------------------------

2.2.1 上面的大框架下补充修改(2个例子,其余类似):

    double radius_param = ros::param::param("radius",100.5); //否:输出100.5
    ROS_INFO("2-1 radius_param = %.2f",radius_param);

    std::vector<std::string> names_param;
    ros::param::getParamNames(names_param);
    for (auto &&name : names_param)
    {
        ROS_INFO("2-2 键: %s",name.c_str());
    }

如:
在这里插入图片描述
2.2.2 输出:
在这里插入图片描述

2.3 删除

注:删除后再次执行会提示:删除失败

#include "ros/ros.h"
/*
    演示参数的删除:
    实现:
        ros::NodeHandle
            deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

        ros::param
            del("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"set_param_c");
    ros::NodeHandle nh;
    //删除:ros::NodeHandle-----------------------------------------
    bool flag1 = nh.deleteParam("radius");
    if (flag1)
    {
        ROS_INFO("删除成功!");
    } else {
        ROS_INFO("删除失败!");
    }
    //删除:ros::param----------------------------------------------
    bool flag2 = ros::param::del("radius_param");
    if (flag2)
    {
        ROS_INFO("radius_param删除成功!");
    } else {
        ROS_INFO("radius_param删除失败!");
    }
    
    return 0;
}

输出:

在这里插入图片描述
*

Python:

一、增与改

#! usr/bin/env python
import rospy
"""
    演示参数的新增与修改
    需求:在参数服务器中设置机器人属性,型号,半径
    实现:
        rospy.set_param()
"""

if __name__ == "__main__":
    #初始化ROS节点
    rospy.init_node("param_set_p")
    #新增参数
    rospy.set_param("type_p","xiaoHuangChe")
    rospy.set_param("radius_p",0.5)
    #修改参数
    rospy.set_param("radius_p",2)
    pass

输出:

(修改后重新运行rosrun,再get,之前的值会被覆盖 [即修改] )
在这里插入图片描述

二、查

#! usr/bin/env python

import rospy
"""
    演示参数的查询
        get_param(,默认值)
            当键存在时,返回对应的值,如果不存在返回默认值
        get_param_cached
            和get_param 使用一致,只是效率更高
        get_param_names
            获取所有的参数的键的集合
        has_param
            判断是否包含某个键
        search_param
            查找某个参数的键,并返回完整的键名
"""

if __name__ == "__main__":
    #初始化ROS节点
    rospy.init_node("get_param_p")
    #根据键获取参数的值:
    #1.get_param
    radius = rospy.get_param("radius_p",0.5) #不存在则返回0.5
    rospy.loginfo("1.radius = %.2f",radius)
    #2.get_param_cached 效率提高了
    radius2 = rospy.get_param("radius_p",0.5) #不存在则返回0.5
    rospy.loginfo("2.radius2 = %.2f",radius2)
    #3.get_param_names 获取所有参数键的集合
    names = rospy.get_param_names()
    for name in names:
        rospy.loginfo("3.name = %s",name)
    #4.has_param
    flag1 = rospy.has_param("radius_p")
    if flag1:
        rospy.loginfo("4.radius_p 存在")
    else:
        rospy.loginfo("4.radius_p 不存在")

    flag2 = rospy.has_param("radius_p_xxx")
    if flag2:
        rospy.loginfo("4.radius_p_xxx 存在")
    else:
        rospy.loginfo("4.radius_p_xxx 不存在")
    #5.search_param
    key = rospy.search_param("radius_p")
    rospy.loginfo("5.key = %s",key)

    pass

输出:

在这里插入图片描述

三、删除

3.1 注:
只用指令时重复执行时抛异常,故改用try优化

#! usr/bin/env python
import rospy
"""
    演示参数的删除
    实现:
        delete_param()
"""

if __name__ =="__main__":
    rospy.init_node("get_param_p")
    #删除参数
    #rospy.delete_param("radius_p")

    #优化(使二次删除不抛异常)
    try:
        rospy.delete_param("radius_p")
    except Exception as e:
        rospy.loginfo("被删除的参数不存在")

3.2 输出:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值