美文网首页
ROS参数调用

ROS参数调用

作者: 酵母小木 | 来源:发表于2021-01-22 15:46 被阅读0次

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

    1. 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" />
            <!--局部参数-->
            <!--rosparam 载入方式-->
            <param name="serial" value="10" />
        </node>
    </launch>
    

    2. CPP文件引用参数

    2.1. 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;
        
        // 获取参数
        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<std::string> keys;
        ros::param::search(keys);
        
        return 0;
    }
    

    2.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;
        
        // 方法一:获取参数
        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<std::string> keys;
        nh.getParamNames(keys);
        
        return 0;
    }
    

    3. 命名空间

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

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

    • launch文件
      <launch>
      <!-- 全局参数: serial -->
      <param name="serial" value="5" />
      <node name="name_demo" pkg="name_demo" type="name_demo" output="screen">
          <!-- 局部参数: serial -->
          <param name="serial" value="10" />
      </node>
      </launch>
      
    • cpp文件
      #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("~");
      
          // 全局命名空间句柄获取全局参数和局部参数
          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参数调用

          本文链接:https://www.haomeiwen.com/subject/cczszktx.html