关于ros的参数服务器ros param和命名空间

1.首先

param就是个中央注册表,可以进行参数的增删改查.可以在代码中和在ros launch中都可以设置这个参数,参数的名字要是一样的.并且ros launch中的参数会覆盖代码中的参数.

2.roscpp中的使用

roscpp提供了两套,一套是放在ros::param namespace下,另一套是在ros::NodeHandle下,这两套API的操作基本一样。
推荐使用ros::param的方式,因为ros::param给人感觉,增删改善参数是静态的,实例无关的,这更像参数的本质

3.ros::param 方式
 

#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
    bool ifget1 = ros::param::get("param1", parameter1);
    
    
    // set param
    parameter4 = 4;
    ros::param::set("param4", parameter4);
    
    
    // check param
    bool ifparam6 = ros::param::has("param6");
    if(ifparam6) { 
        ROS_INFO("Param6 exists"); 
    }
    else { 
        ROS_INFO("Param6 doesn't exist"); 
    }
    

    // delete param
    bool ifdeleted6 = ros::param::del("param6");
    if(ifdeleted6) { 
        ROS_INFO("Param6 deleted"); 
    } 
    else { 
        ROS_INFO("Param6 not deleted"); 
    }
    
    // get all param names.     New in ROS indigo
    std::vector<std::string> keys;
    ros::param::search(keys);
    
    return 0;
}

3.2 ros::NodeHandle 方式

#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 1
    bool ifget2 = nh.getParam("param2",parameter2);
    
    // get param 2.  33333 is default value. When no param3, parameter3=33333.
    nh.param("param3", parameter3, 33333);


    // set param
    parameter5 = 5;
    nh.setParam("param5",parameter5);


    // check param
    bool ifparam5 = nh.hasParam("param5");
    if(ifparam5) {
        ROS_INFO("Param5 exists");
    }
    else {
        ROS_INFO("Param5 doesn't exist");
    }
    

    // delete param
    bool ifdeleted5 = nh.deleteParam("param5");
    if(ifdeleted5) {
        ROS_INFO("Param5 deleted");
    }
    else {
        ROS_INFO("Param5 not deleted");
    }
    
    // get all param names.     New in ROS indigo
    std::vector<std::string> keys;
    nh.getParamNames(keys);
    
    return 0;
}

4.命名空间

有时会看到 ros::NodeHandle n;ros::NodeHandle nh("~"); 两种用法。

ros::NodeHandle n;是全局命名空间。
ros::NodeHandle nh("~");是局部命名空间

如下一个lauch文件,有两个serial参数,一个全局的,一个局部

<launch>
    <!-- global serial -->
    <param name="serial" value="5" />
    <node name="name_demo" pkg="name_demo" type="name_demo" output="screen">
        <!-- local serial -->
        <param name="serial" value="10" />
    </node>
</launch>

使用两种命名空间句柄获取全局和局部参数的用法如下:

#include <ros/ros.h>

int main(int argc, char* argv[])
{
    int serial_number = -1;
    ros::init(argc, argv, "name_demo");

    ros::NodeHandle nh_global;
    ros::NodeHandle nh_local("~");

    // global namespace
    nh_global.getParam("serial", serial_number);                // get global serial    
    nh_global.getParam("name_demo/serial", serial_number);      // get local serial. add "name_demo/"

    
    // local namespace
    nh_local.getParam("serial", serial_number);                 // get local serial
    nh_local.getParam("/serial", serial_number);                // get global serial. add "/"

    ros::spin();
    return 0;
}

5.4. 在 launch 文件中载入参数

代码修改参数,必须重新编译。
launch文件可以方便的修改参数。

<launch>
    <!--param-->
    <param name="param1" value="1" />
    <param name="param2" value="2" />

    <!--rosparam-->
    <rosparam>   
        param3: 3
        param4: 4
        param5: 5
    </rosparam>
    
    <node pkg="param_demo" type="param_demo" name="param_demo" output="screen" />
</launch>

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值