Apollo Cyber RT下参数服务器实现数据共享

组件的定义&作用

        定义:通过共享的方式实现不同节点之间数据交互,参数服务器通过服务通信机制实现,服务端可以存储数据以供客户端访问,客户端此时并不需要自己实现请求与响应(有可用的API接口)。

        作用:存储一些多节点共享的数据,类似于全局变量。

 

实列分析

        需求:创建两个节点A,B。其中节点A是参数服务端,节点B作为参数客户端,A节点存储数据,B节点操作数据

        实现流程:

        • 创建参数服务器的服务端

        • 创建参数服务器的客户端

        • 编译并执行

参数说明:

        通过调用Parameter封装参数,下列表格给出支持的参数类型,以及对于的C++与protobuf中的数据类型。

参数类型

C++ data type

Protobuf data type

apollo::cyber::proto::ParamType::INT

Int64_t

Int64

apollo::cyber::proto::ParamType::DOUBLE

double

double

apollo::cyber::proto::ParamType::BOOL

bool

bool

apollo::cyber::proto::ParamType::STRING

std::string

string

apollo::cyber::proto::ParamType::PROTOBUF

std::string

string

apollo::cyber::proto::ParamType::NOT_SET

        除了上述的五种类型以外,Parameter支持以protobuf 对象作为传入参数的接口。执行后的序列化处理对象并转为string类型进行传输

        下面进行代码实现,创建主文件夹demo_par,创建demo_cc_ParS.cc与demo_cc_ParC.cc以及BUILD文件。

客户端代码实现:

#include "cyber/cyber.h"
#include "cyber/parameter/parameter_server.h"

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

int main(int argc, char *argv[]) {
    apollo::cyber::Init(argv[0]);
  //创建节点
  std::shared_ptr<apollo::cyber::Node> server_node =
      apollo::cyber::CreateNode("param");
  //创建参数服务端
  auto server = std::make_shared<ParameterServer>(server_node);
  //增加
  server->SetParameter(Parameter("cartype", "apollo_cyber_par"));
  server->SetParameter(Parameter("height", 1.23));
  server->SetParameter(Parameter("laser", 4));

  //查找某个指定函数
  Parameter temp;
  server->GetParameter("cartype", &temp);
  AINFO << temp.Name()
        << " == " << temp.AsString();  //.name操作是显示函数名
                                       //.asstring是强制转换为string类型

  server->GetParameter("height", &temp);
  AINFO << temp.Name() << " == " << temp.AsDouble();

  server->GetParameter("laser", &temp);
  AINFO << temp.Name() << " == " << temp.AsInt64();

  //获取所有的参数
  std::vector<Parameter> ps;

  server->ListParameters(&ps);

  for (auto &&p : ps)  //对PS进行遍历的操作
  {
    AINFO << p.Name() << "............" << p.TypeName() << "............"
          << p.DebugString();  // DebugString()是调试用API会显示P的各项参数
  }

  //修改参数
  server->SetParameter(Parameter("laser", 100));

  //打印观察
  server->GetParameter("laser", &temp);
  AINFO << temp.Name() << " == " << temp.AsInt64();

  apollo::cyber::WaitForShutdown();

  return 0;
}

服务端代码实现:

/**
 * 参数服务被用于节点之间共享的数据,并提供了诸如基本操作set,get和list。
 * 参数服务基于Service实现,并包含服务(service)和客户端(client)。
 */

/**
 *explicit
 *explicit(显式的)的作用是"禁止单参数构造函数"被用于自动型别转换,其中比较典型的例子就是容器类型。
 *在这种类型的构造函数中你可以将初始长度作为参数传递给构造函数。
 **/

#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]);

  //创建节点
  std::shared_ptr<apollo::cyber::Node> param_client_node =
      apollo::cyber::CreateNode("paramclient");

  //创建参数客户端
  auto param_client =
      std::make_shared<ParameterClient>(param_client_node, "param");

  //操作参数
  Parameter temp;

  param_client->GetParameter("cartype", &temp);
  AINFO << temp.Name() << " == " << temp.AsString();

  param_client->GetParameter("height", &temp);
  AINFO << temp.Name() << " == " << temp.AsDouble();

  param_client->GetParameter("laser", &temp);
  AINFO << temp.Name() << " == " << temp.AsInt64();

  param_client->SetParameter(Parameter("laser", 1));
  AINFO << "修改后。。。。。。。。。。。。。。。。。。";
  param_client->GetParameter("laser", &temp);
  AINFO << temp.Name() << " == " << temp.AsInt64();

  //
  std::vector<Parameter> ps;
  param_client->ListParameters(&ps);

  for (auto&& p : ps) {
    AINFO << "参数名陈" << p.Name() << ";参数类型" << p.TypeName();
  }

  apollo::cyber::WaitForShutdown();

  return 0;
}

build文件

#******************参数通信*****************************#
cc_binary(
    name = "ParS",
    srcs = ["par_service.cc"],
    deps = [
        "//cyber",
        "//cyber/parameter",
    ],
)

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

脚本

        parc.sh 客户端

##!/bin/sh

cd  /apollo

source  cyber/setup.bash   

./bazel-bin/demo/cyber/parameter/ParC

         pars.sh 服务端

##!/bin/sh

cd  /apollo

source  cyber/setup.bash   

./bazel-bin/demo/cyber/parameter/ParS

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apollo Cyber RT是基于Apollo自动驾驶开放平台的一种实时仿真工具。它能够对自动驾驶算法进行快速的模拟测试和验证。 Apollo Cyber RT可以在没有物理车辆的情况下,使用虚拟仿真环境对自动驾驶系统进行全面的测试。它提供了高度逼真的虚拟场景,包括各种路况、天气条件、道路标志和交通规则。用户可以在这个仿真环境中,验证自动驾驶算法在各种复杂情况下的性能和稳定性。 Apollo Cyber RT还提供了丰富的仿真工具和API接口,可以进行车辆动力学仿真、传感器数据仿真、车辆控制仿真等。用户可以根据实际需求,快速搭建自己的仿真场景,并通过API接口与自己的自动驾驶算法进行集成。这样,用户就可以在不同场景下进行大规模的仿真测试,测试自动驾驶系统对各种情况的应对能力。 与传统的实地测试相比,Apollo Cyber RT的优势在于它可以大大缩短测试周期和降低测试成本。传统的实地测试需要耗费大量的时间和资源,并且受到地理和气候等限制。而Apollo Cyber RT可以在任何时间和地点进行仿真测试,同时还可以通过调整仿真参数、重复测试等方式,快速地验证和迭代自动驾驶算法。 总之,Apollo Cyber RT是一种基于Apollo开放平台的实时仿真工具,它能够帮助用户快速测试和验证自动驾驶算法。它提供了丰富的虚拟场景和仿真工具,可以满足用户在不同场景下的测试需求,同时还能显著缩短测试周期和降低测试成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值