ROS-节点参数param

 

摘自:https://blog.csdn.net/qq_35358125/article/details/107023972

ROS-节点参数param

嵌入式小白woods 2020-06-29 17:03:32 275 收藏 5

分类专栏: ROS 文章标签: c++ 自动驾驶

版权

简介

ROS中提供了的参数服务器机制,用户可以将参数以yaml文件格式保存在本地,程序运行(运行launch文件)时动态载入,修改参数并不需要重新编译。而且,ROS中更为人性化的一点就是支持程序运行时动态修改参数,实时的观测参数对运行结果的影响,极大地方便了参数调试。

载入参数

Ros通过launch文件载入参数,载入完成后可以通过rosparam list在命令行中查看。
1.通过param标签载入参数:
该方法适用于少量参数的载入,格式为:

<param name="parameter_name" type="double" value="10.0" />
  • 1

2.通过rosparam标签导入.yam文件载入参数:

该方法适用于大量载入参数,格式为:

<rosparam command="load" file="$(find examle_pkg)/example.yaml" />
  • 1

重新运行launch文件,参数就会更新。私有参数放在节点中。

ROS中有如下3种获取参数的方式,2中设置参数的方式

在这里插入图片描述在这里插入图片描述

include "ros/ros.h" 
#include <cstdlib> 

using namespace std; 

int main(int argc,char** argv) 
{ 
    //initial and name node 
    ros::init(argc,argv,"node_param"); 
    if(argc!=2) 
    { 
        cout<<"Error command paramter! Please run command eg:\n"\ 
            <<"rosrun book_param book_param 1\n"\ 
            <<"help information:\n"\ 
            <<" 1 ------ set param mode(ros::param::set())\n"\ 
            <<" 2 ------ set param mode(ros::NodeHandle::setParam())\n"\ 
            <<" 3 ------ get param mode(ros::param::get())\n"\ 
            <<" 4 ------ get param mode(ros::NodeHandle::getParam())\n"\ 
            <<" 5 ------ get param mode(ros::NodeHandle::param())\n"\ 
            <<endl; 
        return 1; 
    } 
    //create node handle 
    ros::NodeHandle nh; 
    //param variable 
    int IntParam; 
    string StrParam; 
    bool isIntParam, isStrParam; 
    //mode flag 
    int flag = atoi(argv[1]); 
     // set or get param with different ways 
    switch(flag) 
    { 
        case 1: 
            ROS_INFO("set param mode(ros::param::set()):"); 
            ros::param::set("IntParam",1); 
            ros::param::set("StrParam","stringdemo"); 
            break; 
        case 2: 
            ROS_INFO("set param mode(ros::NodeHandle::setParam()):"); 
            nh.setParam("IntParam",1); 
            nh.setParam("StrParam","stringdemo"); 
            break; 
        case 3: 
            ROS_INFO("get param mode(ros::param::get()):"); 
            isIntParam = ros::param::get("IntParam",IntParam); 
            isStrParam = ros::param::get("StrParam",StrParam); 

            if(isIntParam){ 
                ROS_INFO("The IntParam is:%d",IntParam); 
            }else{ 
                ROS_INFO("Get IntParam fail!"); 
            } 

            if(isIntParam){ 
                ROS_INFO("The StrParam is:%s",StrParam.c_str()); 
            }else{ 
                ROS_INFO("Get StrParam fail!"); 
            } 
            break; 
        case 4: 
            ROS_INFO("get param mode(ros::NodeHandle::getParam()):"); 
            isIntParam = nh.getParam("IntParam",IntParam); 
            isStrParam = nh.getParam("StrParam",StrParam); 

            if(isIntParam){ 
                ROS_INFO("The IntParam is:%d",IntParam); 
            }else{ 
                ROS_INFO("Get IntParam fail!"); 
            } 

            if(isIntParam){ 
                ROS_INFO("The StrParam is:%s",StrParam.c_str()); 
            }else{ 
                ROS_INFO("Get StrParam fail!"); 
            } 
            break; 
        case 5: 
            ROS_INFO("get param mode(ros::NodeHandle::param()):"); 
            //warning: this way will set default value when get no param! 
            nh.param("IntParam",IntParam,11); 
            // be careful when use ros::NodeHandle::param get string param! 
            nh.param<std::string>("StrParam",StrParam,"stringdemo_default"); 
            ROS_INFO("\nThe IntParam is:%d\nThe StrParam is:%s",IntParam,StrParam.c_str()); 
            break; 
        default: 
            ROS_INFO("flag value is not in range: [1,5]"); 
    } 
    return 0;
    }

在这里插入图片描述

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过ROS参数服务器来实现节点持续运行并等待参数输入。 首先,在节点的初始化中,需要声明需要使用的参数,可以使用`ros::param::declare()`方法,例如: ``` ros::NodeHandle nh("~"); std::string my_param; nh.param<std::string>("my_param", my_param, "default_value"); ``` 上述代码中,我们声明了一个名为`my_param`的参数,并设置了它的默认值为`default_value`。在运行节点时,如果没有设置`my_param`的值,将使用默认值。 接着,在节点的主循环中,可以使用`ros::param::get()`方法来获取参数的值。如果参数未被设置,则该方法会一直阻塞,直到参数被设置。例如: ``` while (ros::ok()) { std::string my_param; ros::param::get("my_param", my_param); // 阻塞,直到my_param被设置 ROS_INFO("my_param: %s", my_param.c_str()); // 发布消息 ros::spinOnce(); } ``` 上述代码中,我们在主循环中获取`my_param`参数的值,并将其发布出去。如果`my_param`未被设置,代码将一直阻塞在`ros::param::get()`方法中,直到参数被设置。 最后,需要在运行节点时设置参数的值,可以使用`rosparam`命令行工具或者在启动文件中设置参数。例如: ``` rosrun my_package my_node _my_param:=new_value ``` 上述命令将`my_node`节点的`my_param`参数设置为`new_value`。 综上,通过使用ROS参数服务器,可以实现节点持续运行并等待参数输入,并在获取到参数后发布消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值