ROS理解参数服务器param demo

本文深入讲解了在ROS中如何使用param_demo.cpp进行参数获取、设置、检查和删除操作。通过示例代码,详细展示了ros::param::get(), ros::NodeHandle::getParam(), ros::NodeHandle::param(), ros::param::set(), ros::NodeHandle::setParam(), ros::NodeHandle::hasParam(), ros::param::has(), ros::NodeHandle::deleteParam()和ros::param::del()等方法的使用,并解释了如何在param_demo_cpp.launch中配置参数。

param_demo.cpp

// param_demo.cpp
#include<ros/ros.h>

int main(int argc, char **argv){
        ros::init(argc, argv, "param_demo");
        ros::NodeHandle nh;
        int parameter1, parameter2, parameter3, parameter4, parameter5;

        //Get Param的三种方法
        //① ros::param::get()获取参数“param1”的value,写入到parameter1上
        bool ifget1 = ros::param::get("param1", parameter1);

        //② ros::NodeHandle::getParam()获取参数,与①作用相同
        bool ifget2 = nh.getParam("param2",parameter2);

        //③ ros::NodeHandle::param()类似于①和②
        //但如果get不到指定的param,它可以给param指定一个默认值(如33333)
        nh.param("param3", parameter3, 33333);

        if(ifget1)
                ROS_INFO("Get param1 = %d", parameter1);
        else
                ROS_WARN("Didn't retrieve param1");
       if(ifget2)
                ROS_INFO("Get param2 = %d", parameter2);
        else
                ROS_WARN("Didn't retrieve param2");
        if(nh.hasParam("param3"))
                ROS_INFO("Get param3 = %d", parameter3);
        else
                ROS_WARN("Didn't retrieve param3");


    //Set Param的两种方法
        //① ros::param::set()设置参数
        parameter4 = 4;
        ros::param::set("param4", parameter4);

        //② ros::NodeHandle::setParam()设置参数
        parameter5 = 5;
        nh.setParam("param5",parameter5);

        ROS_INFO("Param4 is set to be %d", parameter4);
        ROS_INFO("Param5 is set to be %d", parameter5);


        //Check Param的两种方法
        //① ros::NodeHandle::hasParam()
        bool ifparam5 = nh.hasParam("param5");

        //② ros::param::has()
        bool ifparam6 = ros::param::has("param6");

        if(ifparam5)
                ROS_INFO("Param5 exists");
        else
                ROS_INFO("Param5 doesn't exist");
        if(ifparam6)
                ROS_INFO("Param6 exists");

        else
                ROS_INFO("Param6 doesn't exist");


        //Delete Param的两种方法
        //① ros::NodeHandle::deleteParam()
        bool ifdeleted5 = nh.deleteParam("param5");

        //② ros::param::del()
        bool ifdeleted6 = ros::param::del("param6");


        if(ifdeleted5)
                ROS_INFO("Param5 deleted");
        else
                ROS_INFO("Param5 not deleted");

        if(ifdeleted6)
                ROS_INFO("Param6 deleted");
        else
                ROS_INFO("Param6 not deleted");


        ros::Rate rate(0.3);
        while(ros::ok()){
                int parameter = 0;

                ROS_INFO("=============Loop==============");
                //roscpp中尚未有ros::param::getallparams()之类的方法
                if(ros::param::get("param1", parameter))
                        ROS_INFO("parameter param1 = %d", parameter);
                if(ros::param::get("param2", parameter))
                        ROS_INFO("parameter param2 = %d", parameter);
                if(ros::param::get("param3", parameter))
                        ROS_INFO("parameter param3 = %d", parameter);
                if(ros::param::get("param4", parameter))
                        ROS_INFO("parameter param4 = %d", parameter);
                if(ros::param::get("param5", parameter))
                        ROS_INFO("parameter param5 = %d", parameter);
                if(ros::param::get("param6", parameter))
                        ROS_INFO("parameter param6 = %d", parameter);
                rate.sleep();
        }
}

 

param_demo_cpp.launch

<launch>
    <!--param参数配置-->
    <param name="param1" value="1" />
    <param name="param2" value="2" />
    <!--param name="table_description" command="$(find xacro)/xacro.py $(find gazebo_worlds)/objects/table.urdf.xacro" /-->

    <!--rosparam参数配置-->
    <rosparam>   
        param3: 3
        param4: 4
        param5: 5
    </rosparam>
    <!--以上写法将参数转成YAML文件加载,注意param前面必须为空格,不能用Tab,否则YAML解析错误-->
    <!--rosparam file="$(find robot_sim_demo)/config/xbot-u_control.yaml" command="load" /-->
    <node pkg="param_demo" type="param_demo" name="param_demo" output="screen" />

    

</launch>

 

<think>好的,我需要帮助用户了解ROS参数服务器的使用方法和相关配置。首先,我应该回顾用户提供的引用资料,从中提取关键信息。 用户提供的引用1提到参数服务器用于动态设置和获取参数,启动ROS主节点使用roscore,设置参数rosparam set命令。引用3说明参数服务器是全局的,支持动态调整,方便节点间共享参数。引用2和4提到了C++实操,包括增删改查参数的方法。 接下来,我需要组织这些信息,按照用户要求的格式,分步骤说明参数服务器的用法。需要包括启动主节点、设置参数、获取参数、删除参数,并给出示例代码。同时,要确保所有数学表达式用$...$,独立公式用$$...$$,但这里可能涉及代码较多,数学公式可能较少。 然后,生成相关问题,参考示例中的结构,例如询问参数服务器的工作原理、如何动态调整参数、在C++中的实现等。 需要检查LaTeX语法是否正确,使用中文回答,结构清晰。最后,确认引用的标注是否正确,每个引用来源的末尾加上对应的标识符,如[^1]、[^2]等。</think>### ROS参数服务器使用说明 #### 1. 参数服务器概述 ROS参数服务器是一个集中存储和管理全局配置参数的组件,支持动态增删改查操作,适用于节点间共享配置(如传感器阈值、控制参数等)[^3]。 #### 2. 基本配置步骤 **步骤1:启动ROS主节点** ```bash $ roscore ``` **步骤2:设置参数** 通过命令行设置参数: ```bash $ rosparam set /my_param_name 42 # 设置整型参数[^1] $ rosparam set /robot_speed 0.5 # 设置浮点型参数 ``` **步骤3:获取参数** ```bash $ rosparam get /my_param_name # 输出:42[^1] ``` **步骤4:删除参数** ```bash $ rosparam delete /my_param_name # 删除指定参数[^4] ``` #### 3. C++节点操作示例 **新增/修改参数** ```cpp #include <ros/ros.h> int main(int argc, char **argv) { ros::init(argc, argv, "param_demo"); ros::NodeHandle nh; // 设置参数 nh.setParam("/control_gain", 1.2); // 浮点型参数 } ``` **获取参数** ```cpp double gain; if (nh.getParam("/control_gain", gain)) { ROS_INFO("Gain value: %.2f", gain); // 输出:1.20 } ``` **删除参数** ```cpp nh.deleteParam("/control_gain"); // 删除参数[^4] ``` #### 4. 动态调整参数示例 通过`ros::param::set`实现运行时动态修改: ```cpp ros::param::set("/sensor_threshold", 75); // 更新传感器阈值 ``` #### 5. YAML文件批量加载 将参数存储在YAML文件中并批量导入: ```bash $ rosparam load config.yaml # 加载文件中的所有参数 ``` 示例`config.yaml`内容: ```yaml camera_fps: 30 max_velocity: 2.0 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值