以共享的方式实现不同节点之间数据交互的通信模式。
参数服务器是基于服务实现的,包含客户端和服务器端,服务端节点可以存储数据,客户端节点可以访问服务端节点操作数据,这个过程虽然基于请求响应的,但是无需自己实现请求与响应,此过程已经被封装,调用者只需要通过比较简单友好的API就可以实现参数操作。
作用
存储一些多节点共享的数据,类似于全局变量
需求
创建两个节点A与B,节点A作为参数服务端,节点B作为参数客户端,在节点A存储数据(车辆参数),节点B操作数据。
流程
1.创建参数服务器服务端
2.创建参数服务器客户端
3.编译并执行
参数说明
Cyber RT 中通过apollo::cyber.:.Parameter封装参数,下列表格列出了所支持的参数类型,以及对应的 C++ 和 protobuf 中的数据类型。
除了上述5种类型之外,Parameter 还支持以 protobuf 对象作为传入参数的接口。执行后的序列化处理对象
并将其转换为 STRING 类型以进行传输。
C++ 实现
1.参数服务端
demo_cc 目录下新建 C++ 文件 demo05_param_server.cc,输入如下内容:
/*需求:参数服务端设置数据(服务端也可以操作数据),客户端操作数据实现:1.创建头文件2.初始化i 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 const *argv[])
{apollo::cyber::Init(argv[0]);std::shared_ptr<apollo::cyber::Node>server_node = apollo::cyber::CreateNode("car_param");auto server = std::make_shared<ParameterServer>(server_node);//zengserver->SetParameter(Parameter("car_type","apollo"));server->SetParameter(Parameter("height",1.65));server->SetParameter(Parameter("lasers",4));//cha//1.获取指定参数Parameter temp;server->GetParameter("car_type",&temp);AINFO<<temp.Name()<<"=="<<temp.AsString();server->GetParameter("height",&temp);AINFO<<temp.Name()<<"=="<<temp.AsDouble();server->GetParameter("lasers",&temp);AINFO<<temp.Name()<<"=="<<temp.AsInt64();//2.获取所有参数std::vector<Parameter>ps;server->ListParameters(&ps);for(auto &&p : ps){AINFO<<p.Name()<<"---------"<<p.TypeName();AINFO<<p.DebugString();}//gai 当设置的参数建已经存在时,会覆盖server->SetParameter(Parameter("lasers",100));server->GetParameter("lasers",&temp);AINFO<<temp.Name()<<"=="<<temp.AsInt64();apollo::cyber::WaitForShutdown();/* code */return 0;
}
BUILD 文件
cc_binary(name="demo05_param_server",srcs=["demo05_param_server.cc"],deps=["//cyber","//cyber/parameter",]
)
编译
执行
2.参数客户端
demo_cc 目录下新建 C++ 文件 demo06_param_client.cc,输入如下内容:
/*需求:参数服务端设置数据(服务端也可以操作数据),客户端操作数据实现:1.创建头文件2.初始化i cyber 框架3.创建节点4.创建参数客户端5.操作参数(增,查,改),没有删除实现6.等待节点关闭,释放资源
*/
#include "cyber/cyber.h"
#include "cyber/parameter/parameter_client.h"using apollo::cyber::ParameterClient;
using apollo::cyber::Parameter;int main(int argc, char const *argv[])
{apollo::cyber::Init(argv[0]);std::shared_ptr<apollo::cyber::Node>client_node = apollo::cyber::CreateNode("param_client");auto client = std::make_shared<ParameterClient>(client_node,"car_param"); //这里的就是服务端的节点名称,他把话题通信封装了//zeng// client->SetParameter(Parameter("car_type","apollo"));// client->SetParameter(Parameter("height",1.65));// client->SetParameter(Parameter("lasers",4));//cha//1.获取指定参数Parameter temp;client->GetParameter("car_type",&temp);AINFO<<temp.Name()<<"=="<<temp.AsString();client->GetParameter("height",&temp);AINFO<<temp.Name()<<"=="<<temp.AsDouble();client->GetParameter("lasers",&temp);AINFO<<temp.Name()<<"=="<<temp.AsInt64();//2.获取所有参数std::vector<Parameter>ps;client->ListParameters(&ps);for(auto &&p : ps){AINFO<<p.Name()<<"---"<<p.TypeName()<<"---"<<p.DebugString();}//gai 当设置的参数建已经存在时,会覆盖client->SetParameter(Parameter("height",2.0));client->GetParameter("height",&temp);AINFO<<temp.Name()<<"=="<<temp.AsDouble();apollo::cyber::WaitForShutdown();return 0;
}
BUILD 文件
cc_binary(name="demo06_param_client",srcs=["demo06_param_client.cc"],deps=["//cyber","//cyber/parameter",]
)
编译执行