ROS參數(shù)調(diào)用

param就像一個(gè)中央注冊(cè)表,可以進(jìn)行參數(shù)的增刪改查。roscpp提供了兩套參數(shù)調(diào)用方法,一套是放在ros::param namespace,另一套放在ros::NodeHandle下,這兩套API的操作基本一樣。推薦使用ros::param給人感覺,增刪改查參數(shù)是靜態(tài)的,實(shí)例無關(guān)的。

1. launch文件中載入?yún)?shù)

代碼修改參數(shù),必須重新編譯,launch文件可以方便的修改參數(shù)。

<launch>
    <!--全局參數(shù)-->
    <!--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" />
        <!--局部參數(shù)-->
        <!--rosparam 載入方式-->
        <param name="serial" value="10" />
    </node>
</launch>

2. CPP文件引用參數(shù)

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;
    
    // 獲取參數(shù)
    bool ifget1 = ros::param::get("param1", parameter1);
    
    
    // 設(shè)置參數(shù)
    parameter4 = 4;
    ros::param::set("param4", parameter4);
    
    
    // 檢查參數(shù)
    bool ifparam6 = ros::param::has("param6");
    if(ifparam6) { 
        ROS_INFO("Param6 exists"); 
    }
    else { 
        ROS_INFO("Param6 doesn't exist"); 
    }
    

    // 刪除參數(shù)
    bool ifdeleted6 = ros::param::del("param6");
    if(ifdeleted6) { 
        ROS_INFO("Param6 deleted"); 
    } 
    else { 
        ROS_INFO("Param6 not deleted"); 
    }
    
    // 獲取參數(shù)名
    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;
    
    // 方法一:獲取參數(shù)
    bool ifget2 = nh.getParam("param2",parameter2);
    
    // 方法二:獲取參數(shù),具備默認(rèn)值
    nh.param("param3", parameter3, 33333);


    // 設(shè)置參數(shù)
    parameter5 = 5;
    nh.setParam("param5",parameter5);


    // 檢查參數(shù)
    bool ifparam5 = nh.hasParam("param5");
    if(ifparam5) {
        ROS_INFO("Param5 exists");
    }
    else {
        ROS_INFO("Param5 doesn't exist");
    }
    

    // 刪除參數(shù)
    bool ifdeleted5 = nh.deleteParam("param5");
    if(ifdeleted5) {
        ROS_INFO("Param5 deleted");
    }
    else {
        ROS_INFO("Param5 not deleted");
    }
    
    // 獲取所有參數(shù)名
    std::vector<std::string> keys;
    nh.getParamNames(keys);
    
    return 0;
}

3. 命名空間

在ROS項(xiàng)目文件中,有時(shí)會(huì)看到ros::NodeHandle nros::NodeHandle nh("~")兩種用法,兩種命名空間句柄獲取全局和局部參數(shù)的用法也存在不同。

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

  • launch文件
    <launch>
    <!-- 全局參數(shù): serial -->
    <param name="serial" value="5" />
    <node name="name_demo" pkg="name_demo" type="name_demo" output="screen">
        <!-- 局部參數(shù): 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("~");
    
        // 全局命名空間句柄獲取全局參數(shù)和局部參數(shù)
        nh_global.getParam("serial", serial_number);                // get global serial    
        nh_global.getParam("name_demo/serial", serial_number);      // get local serial. add "name_demo/"
    
        
        // 局部命名空間句柄獲取全局參數(shù)和局部參數(shù)
        nh_local.getParam("serial", serial_number);                 // get local serial
        nh_local.getParam("/serial", serial_number);                // get global serial. add "/"
    
        ros::spin();
        return 0;
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容