ROSシリーズ:パラメータサーバー(1)

ROSシリーズ

76-80



序文

パラメータサーバーは主に、異なるノード間でのデータストレージとデータ共有を実現するために使用されます。


1. パラメータサーバーの構成

ROS マスター
トーカー: パラメーター設定者
リスナー: パラメーター呼び出し者

2. ステップを使用する

1. データの書き込み: 追加、変更

コードは次のとおりです (C++)。


#include <ros/ros.h>
/**
 * @brief
 *  需要实现参数的新增与修改
 *  需求:首先设置机器人的共享参数,类型、半径(0.15m)
 *      在修改半径(0.2m)
 *  实现:
 *      ros::NodeHandle
 *          setParam("键",值)
 *      ros::param
 *          set("键",值)
 *      修改只需要先查rosparam list / get 获取,然后在程序里set修改即可
 */

int main(int argc, char* argv[])
{
    
    
    // 初始化ros节点
    ros::init(argc, argv, "set_param_c");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数增
    // 方案一
    nh.setParam("type","xiaoHuang");
    nh.setParam("radius", 0.15);

    // 方案二
    ros::param::set("type_param","xiaoBai");
    ros::param::set("radius_param",0.15);
    //参数修改
    // 方案一
    nh.setParam("radius",0.1);
    // 方案二
    ros::param::set("radius_param",0.1);
    return 0;
}

ターミナルでのrosparam操作

rosparam list
rosparam get

効果:
ここに画像の説明を挿入

2. データの読み取り: クエリ

コードは次のとおりです(例)。

#include <ros/ros.h>
/**
 * @brief
 *  演示参数查询

 *  实现:
 *      ros::NodeHandle---------------------------------------
 *          param(键,默认值)
            存在,返回对应结果,否则返回默认值

        getParam(键,存储结果的变量)
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

        getParamCached键,存储结果的变量)--提高变量获取效率
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

        getParamNames(std::vector<std::string>)
            获取所有的键,并存储在参数 vector 中

        hasParam(键)
            是否包含某个键,存在返回 true,否则返回 false

        searchParam(参数1,参数2)
            搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
 *      ros::param
 */
int main(int argc, char* argv[])
{
    
    
    setlocale(LC_ALL,"");
    ros::init(argc, argv, "get_param_c");
    ros::NodeHandle nh;
    // ros::NodeHandle-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
    // 1.param
    double radius = nh.param("radius",0.5);
    ROS_INFO("radius=%.2f",radius);
    // 2.getparam
    double radius2=0.0;
    bool result = nh.getParam("radius_param", radius2);
    if(result){
    
    
        ROS_INFO("radius2 = %.2f", radius2);
    }else{
    
    
        ROS_INFO("查询变量不存在");
    }
    // 3.getParamCached键
    // 4.getParamNames
    std::vector<std::string> names;  //创建一个vector用于保存节点名称 名称类型string
    nh.getParamNames(names);
    for (auto && name : names)       //&&右值引用
    {
    
    
        ROS_INFO("遍历的元素是:%s",name.c_str());//遍历以后转换成c形式字符串
    }
    // 5.hasParam
    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("radiusxxx");
    ROS_INFO("radius 存在与否:%d", flag1);
    ROS_INFO("radiusxxx 存在与否:%d", flag2);
    // 6.
    std::string key;    // 定义一个变量来接收键值
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());
    
    return 0;
}

1. param
param クエリが存在し、対応する結果を返します。それ以外の場合はデフォルト値を返します。この時点のデフォルト値は 0.5 です。つまり、検索パラメータ サーバーに半径がない場合は、パラメータ サーバーが存在することを知るために 0.5 を返します。この名前のデータはありません

   
    double radius = nh.param("radius",0.5);
    ROS_INFO("radius=%.2f",radius);

2. getParam (キー、結果を格納する変数) が
存在する場合、true を返し、パラメータ 2 に値を代入します。
キーが存在しない場合、戻り値は false となり、パラメータ 2 に値は代入されません。

  
    double radius2=0.0;
    bool result = nh.getParam("radius_param", radius2);
    if(result){
    
    
        ROS_INFO("radius2 = %.2f", radius2);
    }else{
    
    
        ROS_INFO("查询变量不存在");
    }

3. getParamCached キー(結果を格納する変数) – 変数取得の効率を向上します
。 存在し、true を返し、パラメータ 2 に値を代入します
。 キーが存在しない場合、戻り値は false になり、値は代入されません。値をパラメータ 2 に設定します。
与2一样,只是提高了性能,但肉眼看不出来
4. getParamNames(std ::vectorstd::string)
すべてのキーを取得し、パラメータ ベクトルに格納します。

	std::vector<std::string> names;  //创建vector用于保存节点名称 
    nh.getParamNames(names);
    for (auto && name : names)       //&&右值引用
    {
    
    
        ROS_INFO("遍历的元素是:%s",name.c_str());//遍历以后转换成c形式字符串
    }

5. hasParam(key) に
特定のキーが含まれているかどうか、存在する場合は true を返し、それ以外の場合は false を返します。

    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("radiusxxx");
    ROS_INFO("radius 存在与否:%d", flag1);
    ROS_INFO("radiusxxx 存在与否:%d", flag2);
  1. searchParam (パラメータ 1、パラメータ 2)
    検索キー、パラメータ 1 は検索するキー、パラメータ 2 は検索結果を格納する変数
    std::string key;    // 定义一个变量来接收键值
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());

実行結果ここに画像の説明を挿入

要約する

グローバル変数と同様に、
高パフォーマンスを目的として設計されていない RPC プロトコル通信を使用して、非バイナリの静的単純データを保存することをお勧めします:
32 ビット
doubles
bool
strings
iso8601 time

おすすめ

転載: blog.csdn.net/TianHW103/article/details/127116914