ROS参数调用

param就像一个中央注册表,可以进行参数的增删改查。roscpp提供了两套参数调用方法,一套是放在ros::param namespace,另一套放在ros::NodeHandle下,这两套API的操作基本一样。推荐使用ros::param给人感觉,增删改查参数是静态的,实例无关的。

1. launch文件中载入参数

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


    
    
    
    

    
       
        param3: 3
        param4: 4
        param5: 5
    
    
    
        
        
        
    

2. CPP文件引用参数

2.1. ros:param方式

#include

int main(int argc, char **argv)
{
    ros::init(argc, argv, "param_demo");
    ros::NodeHandle nh;
    int parameter1, parameter2, parameter3, parameter4, parameter5;
    
    // 获取参数
    bool ifget1 = ros::param::get("param1", parameter1);
    
    
    // 设置参数
    parameter4 = 4;
    ros::param::set("param4", parameter4);
    
    
    // 检查参数
    bool ifparam6 = ros::param::has("param6");
    if(ifparam6) { 
        ROS_INFO("Param6 exists"); 
    }
    else { 
        ROS_INFO("Param6 doesn't exist"); 
    }
    

    // 删除参数
    bool ifdeleted6 = ros::param::del("param6");
    if(ifdeleted6) { 
        ROS_INFO("Param6 deleted"); 
    } 
    else { 
        ROS_INFO("Param6 not deleted"); 
    }
    
    // 获取参数名
    std::vector keys;
    ros::param::search(keys);
    
    return 0;
}

2.2. ros:NodeHandle方式

#include

int main(int argc, char **argv)
{
    ros::init(argc, argv, "param_demo");
    ros::NodeHandle nh;
    int parameter1, parameter2, parameter3, parameter4, parameter5;
    
    // 方法一:获取参数
    bool ifget2 = nh.getParam("param2",parameter2);
    
    // 方法二:获取参数,具备默认值
    nh.param("param3", parameter3, 33333);


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


    // 检查参数
    bool ifparam5 = nh.hasParam("param5");
    if(ifparam5) {
        ROS_INFO("Param5 exists");
    }
    else {
        ROS_INFO("Param5 doesn't exist");
    }
    

    // 删除参数
    bool ifdeleted5 = nh.deleteParam("param5");
    if(ifdeleted5) {
        ROS_INFO("Param5 deleted");
    }
    else {
        ROS_INFO("Param5 not deleted");
    }
    
    // 获取所有参数名
    std::vector keys;
    nh.getParamNames(keys);
    
    return 0;
}

3. 命名空间

在ROS项目文件中,有时会看到ros::NodeHandle nros::NodeHandle nh("~")两种用法,两种命名空间句柄获取全局和局部参数的用法也存在不同。

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

  • launch文件
    
    
    
    
        
        
    
    
    
  • cpp文件
    #include 
    
    int main(int argc, char* argv[])
    {
        int serial_number = -1;
        ros::init(argc, argv, "name_demo");
    
        ros::NodeHandle nh_global;
        ros::NodeHandle nh_local("~");
    
        // 全局命名空间句柄获取全局参数和局部参数
        nh_global.getParam("serial", serial_number);                // get global serial    
        nh_global.getParam("name_demo/serial", serial_number);      // get local serial. add "name_demo/"
    
        
        // 局部命名空间句柄获取全局参数和局部参数
        nh_local.getParam("serial", serial_number);                 // get local serial
        nh_local.getParam("/serial", serial_number);                // get global serial. add "/"
    
        ros::spin();
        return 0;
    }
    

你可能感兴趣的:(ROS参数调用)