ROS参数服务器 & 如何向节点传递参数


一、ROS中Parameter server机制

     用于存储节点参数,以键值对的形式存储,全局共享

二、Parameter server中参数维护方式
2.1 命令行维护

2.2 launch文件进行读写

    写入单个参数到参数服务器 <param>

    <!--直接定义参数并赋值-->
    <param name="velodyne_frame_id" type="string" value="velodyne"/>
     
    <!--定义参数并通过arg给参数赋值-->
    <arg name="velodyne_frame_id" default="velodyne"/>
    <param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>

    从.yaml文件批量写入参数到参数服务器 <rosparam>

    <!--从../config/params.yaml文件中加载参数 -->
    <rosparam command="load" file="$(find *package_name)/config/params.yaml" />

2.3 节点源码内进行读写

C++节点中实现参数服务器的读写有两套API系统:

    ros::NodeHandle

   

 /**
     * C++中分别通过ros::NodeHandle实现参数服务器中参数的读写  
     **/
     
    #include "ros/ros.h"
     
    int main(int argc, char *argv[])
    {
        //初始化ros节点
        ros::init(argc,argv,"param_demo_node");
        
        //创建ros节点句柄
        ros::NodeHandle nh;
        string node_param;
        std::vector<std::string> param_names;
        
        // 新增参数到参数服务器中
        nh.setParam("param_1", 1.0);
     
        // 读取参数
        // 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
        nh.param<std::string>("param_2",node_param,"hahaha");
     
        // 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
        nh.getParam("param_2", node_param);
     
        //其他功能
        nh.getParamNames(param_names);
        nh.hasParam("param_2");
        nh.searchParam("param_2",node_param);
    }

    ros::param

 

   /**
     * C++中分别通过ros::param实现参数服务器中参数的读写  
     **/
     
    #include "ros/ros.h"
     
    int main(int argc, char *argv[])
    {
        //初始化ros节点
        ros::init(argc,argv,"param_demo_node");
        
        string node_param;
        std::vector<std::string> param_names;
        
        // 新增参数到参数服务器中
        ros::param::set("param_1", 1.0);
     
        // 读取参数
        // 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
        node_param = ros::param::param("param_2","hahaha");
     
        // 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
       ros::param::get("param_2", node_param);
     
        //其他功能
        ros::param::getParamNames(param_names);
        ros::param::has("param_2");
        ros::param::search("param_2",node_param);
    }

三、如何向ROS节点传递参数
3.1 通过参数服务器的方式传递

    通过launch文件启动节点

   

 <launch>
        <node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" output="screen" >
            <param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
        </node>
    </launch>

    通过rosrun启动节点,param前面加_

   

 rosrun process_velodyne velodyne_sub_pub _velodyne_frame_id:="velodyne"

    节点中读取参数

见2.3节内容
3.2 通过main()函数参数的形式传递

    通过launch文件启动节点

   

 <launch>
        <node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" args="arg1 arg2" output="screen"/>
    </launch>

    通过rosrun启动节点,参数通过空格隔开

    rosrun proess_velodyne velodyne_sub_pub arg1 arg2

    节点中读取参数

在节点中main()函数内,argv[0]是节点名称,argv[1], argv[2]...依次是输入的参数

Q:在使用rosrun/launch向main()函数传递参数时,-d, -r, --hz这类是什么意思?是指定名名称的参数么?

   

 <launch>
        <node name="rosplay"pkg="rosbag"type="play"args="−s 5 −r 1 −−clock −−hz=10 (find costmap_2d)/test/simple_driving_test_indexed.bag" />
    </launch>



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值