Cyber-参数服务

 

/*
    参数服务
        存储多节点的共享数据,类似于全局变量
        用于通用数据(车辆型号、尺寸、最大速度、最小速度等)模块之间的共享
        参数服务器包含客户端和服务端,服务端节点存储数据,客户端节点可以访问数据
    需求:
        创建两个节点A和B,节点A作为参数服务端,节点B作为参数客户端,在节点A存储数据(车辆参数),
        节点B操作数据
    
    流程:
        创建参数服务器服务端
        创建参数服务器客户端
        编译并执行
    CyberRT中通过apollo::cyber::Parameter封装参数
    支持类型
        Patameter type INT      DOUBLE   BOOL   STRING   PROTOBUF   NOT_SET
        C++ type       int64_t  double   bool   string   string      -
        protobuf type  int64    double   bool   string   string      -
*/

///////////////////////////服务端cpp/////////////////////////////////////////
/*
    demo_cc目录下新建C++文件demo05_param_server.cc
    需求:
        服务端设置参数,客户端操作参数
    实现:
        1.包含头文件
        2.初始化cyber框架
        3.创建节点
        4.创建参数服务器
        5.设置参数
        6.等待关闭
*/
#include "cyber/cyber.h"
#include "cyber/parameter/parameter_server.h"

using apollo::cyber::ParameterServer;
using apollo::cyber::Parameter;

int main(int argc, char* argv[])
{

    apollo::cyber::Init(argv[0]);
    AINFO << "Init success";
    // 创建节点
    // 使用auto默认情况下返回的是unique_ptr
    // 在参数服务器中要使用shared_ptr,具体原因待定
    std::shared_ptr<apollo::cyber::Node> param_server_node = apollo::cyber::CreateNode("param_server_node");
    // 创建参数服务端
    // 没有显示指定话题名称,底层通过服务通信实现,封装了话题名称 = 节点名称
    // 所以在客户端指定话题名称时,令其 = 服务端节点名称  即可
    auto param_server = std::make_shared<ParameterServer>(param_server_node);
    // 设置参数,key-value形式
    // 修改也直接用setParameter即可
    param_server->SetParameter(Parameter("type", "apollo"));
    param_server->SetParameter(Parameter("speed", 30.0));
    param_server->SetParameter(Parameter("size", 10));
    // 获取指定参数

    Parameter temp;

    param_server->GetParameter("type", &temp);
    AINFO << "type: " << temp.AsString();
    param_server->GetParameter("speed", &temp);
    AINFO << "speed: " << temp.AsDouble();
    param_server->GetParameter("size", &temp);
    AINFO << "size: " << temp.AsInt64();
    // 获取所有参数

    std::vector<Parameter> params;

    param_server->ListParameters(&params);
    for(auto &&param : params)
    {
        AINFO << "name = " << param.Name() << ", typename = " << param.TypeName() << 
        ", value = " << param.DebugString();
        // DebugString()会输出当前元素的key and value

    }

    apollo::cyber::WaitForShutdown();

    return 0;
}

 

//////////////////////////////////////////////////////////////////////////

///////////////////////////服务端BUILD///////////////////////////////////

cc_binary(
    name = "demo05_param_server_cc",
    srcs = ["demo05_param_server.cc"],
    deps = [
            "//cyber",
            "//cyber/parameter"
    ]
)
/////////////////////////////////////////////////////////////////////////

// bezal build cyber/demo_cc/...
// ./cyber-bin/cyber/demo_cc/demo05_param_server

/////////////////////////////////客户端cpp///////////////////////////////
/*
    在demo_cc目录下新建c++文件demo06_param_client.cc
    需求:
        服务端设置参数,客户端操作参数
    实现:
        1.包含头文件
        2.初始化cyber狂减
        3.创建节点
        4.创建客户端
        5.操作参数
        6.等待关闭
*/
#include "cyber/cyber.h"
#include "cyber/parameter/parameter_client.h"

using apollo::cyber::Parameter;
using apollo::cyber::ParameterClient;

int main(int argc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "初始化...";

    // 创建节点
    std::shared_ptr<apollo::cyber::Node> client_node = apollo::cyber::CreateNode("client_node");
    // 创建客户端
    auto client = std::make_shared<ParameterClient>(client_node, "param"); // 话题名称 = 服务端节点名称

    // 操作参数
    Parameter temp;
    client->GetParameter("type", &temp);
    AINFO << "type: " << temp->AsString();

    client->GetParameter("height", &temp);
    AINFO << "height: " << temp->AsDouble();

    client->GetParameter("laser", &temp);

    AINFO << "laser: " << temp->AsInt64();

    // 批量操作参数
    std::vector<Parameter> params;
    client->ListParameter(&params);

    for(auto &&param_temp : params){

        AINFO << "type: " << param_temp->Name() << "  " << param_temp->DebugString();


    }

    apollo::cyber::WaitForShutDown();

    return 0;
}
////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////客户端BUILD////////////////////////////////////

cc_binary(
    name = "demo06_param_client_cc",
    srcs = ["demo06_param_client.cc"],
    deps = [
            "//cyber",
            "//cyber/parameter"
    ]
)
//////////////////////////////////////////////////////////////////////////////

// bezal cyber/demo_cc/...
// ./bezal-bin/cyber/demo_cc/demo06_param_client_cc

 

posted @ 2023-07-10 21:02  WTSRUVF  阅读(91)  评论(0)    收藏  举报