Cyber RT 服务通信

news2024/11/22 10:18:33

场景: 用户乘坐无人出租车过程中,可能临时需要切换目的地,用户可以通过车机系统完成修改,路径规划模块需要根据新的目的地信息重新规划路径,并反馈修正后的结果给用户,那么用户的修正请求数据与修正结果是如何被传输的呢?
上述场景下便可以使用服务通信实现数据传输。

概念
以请求响应的方式实现不同节点之间数据交互的通信模式。

作用
用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景。

需求
客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端。

流程
1.编写消息载体(protobuf文件)并配置;
2.编写服务端配置;
3.编写客户端配置;
4.编译执行。

准备
在 demo_base_proto 目录下,新建文件 addints.proto,内容如下:

syntax = "proto2";

package apollo.cyber.demo_basee_proto;

message AddInts_Request {
    required int64 num1 = 1;
    required int64 num2 = 2;
}

message AddInts_Reponse {
    required  int64 sum = 1;
}

上述文件中,包含两种消息类型,AddInts_Request 是用于客户端向服务端发送请求的数据类型,AddInts_Response 是用于服务端向客户端发送响应的数据类型。

BUILD 文件添加如下内容:

proto_library(
    name="addints_proto",
    srcs=["addints.proto"]
)

cc_proto_library(
    name = "addints_cc",
    deps = [":addints_proto"],
)

py_proto_library(
    name = "addints_py",
    deps = [":addints_proto"]
)

验证文件编写是否正确,先编译:

bazel build cyber/demo_base_proto/...

在这里插入图片描述

C++ 实现

1.服务端实现
demo_cc 目录下新建 C++ 文件 demo03_server.cc,输入如下内容:

BUILD文件:

cc_binary(
    name="demo03_server",
    srcs=["demo03_server.cc"],
    deps=[
        "//cyber",
        "//cyber/demo_base_proto:addints_cc"
    ]
)

2.客户端实现
在 demo_cc 目录下新建 C++ 文件 demo04_client.cc,输入如下内容:

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/addints.pb.h"

using apollo::cyber::demo_base_proto::AddInts_Request;
using apollo::cyber::demo_base_proto::AddInts_Reponse;

int main(int argc,char const *argv[]){
    apollo::cyber::Init(argv[0]);

    if(3 != argc){
        AINFO <<"请提交2个整型参数。。。";
        return 1;
    }
    auto client_node = apollo::cyber::CreateNode("addIntsClient_node");

    auto client = client_node->CreateClient<AddInts_Request, AddInts_Reponse>("addints");
    auto req = std::make_shared<AddInts_Request>();
    req->set_num1(atoll(argv[1]));
    req->set_num2(atoll(argv[2]));

    AINFO <<"请求数据为 num1: " << req->num1() << " and num2: "<<req->num2();

    auto reponse = client -> SendRequest(req);
    AINFO<<"reponse -->sum = "<< reponse ->sum();


    apollo::cyber::WaitForShutdown();


    return 0;
}

BUILD文件:

cc_binary(
    name="demo04_client",
    srcs=["demo04_client.cc"],
    deps=[
        "//cyber",
        "//cyber/demo_base_proto:addints_cc"
    ]
)

3.执行
在这里插入图片描述

python 实现

1.服务端实现
demo_py 目录下新建 python 文件 demo03_server_py.py,输入:

#!/usr/bin/env python3

from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponse

def  cb(req):
    num1 = req.num1
    num2 = req.num2
    print("num1: %d, num2: %d"%(num1,num2))
    sum = num1 + num2
    response = AddInts_Reponse()
    response.sum  = sum
    return response

if __name__ == "__main__":
    cyber.init()
    print("server------")
    server_node = cyber.Node("addIntsServer_node_py")
    server = server_node.create_service("addints", AddInts_Request,AddInts_Reponse, cb)
    server_node.spin()

    cyber.shutdown()


BUILD 文件

py_binary(
    name = "demo03_server_py",
    srcs = ["demo03_server_py.py"],
    deps = [
        "//cyber/python/cyber_py3:cyber",
        "//cyber/demo_base_proto:addints_py"
    ],
)

2.客户端实现
demo_py 目录下新建 python 文件 demo03_client_py.py,输入:

#!/usr/bin/env python3

from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponse
import sys


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("input two numbers:")
        sys.exit(1)

    cyber.init()
    print("client------")
    client_node = cyber.Node("client_node_py")
    client = client_node.create_client("addints", AddInts_Request,AddInts_Reponse)
    
    req = AddInts_Request()
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2])
    response = client.send_request(req)
    print("reponse sum = %d"%response.sum)

    cyber.shutdown()

BUILD 文件

py_binary(
    name = "demo04_client_py",
    srcs = ["demo04_client_py.py"],
    deps = [
        "//cyber/python/cyber_py3:cyber",
        "//cyber/demo_base_proto:addints_py"
    ],
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LINUX服务之YUM仓库

1. YUM概述 YUM基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 YUM支持软件源 搭建yum支持的的软件源主要有以下三种&#xff1a; 本地yum&#xff1a;file&#xff1a;//… 网络yum&#xff0c;又分为HTTP服务器&#xff1a;http…

【开源项目】经典开源项目数字孪生智慧楼宇,分享revit数据

智慧楼宇IBMS可视化运营平台&#xff0c;一个集综合态势、能耗管理、智慧安防和设备运维于一体的智慧管理中心。飞渡科技数字孪生平台集结构、系统、服务、管理及它们之间的最优化组合&#xff0c;使冰冷的混凝土结构演变为智慧化、高效率以及安全性更强的生活和工作空间。 在综…

深度解析Oladance、韶音、南卡开放式耳机:选购指南与天花板级推荐

​随着开放式耳机在日常生活中越来越受欢迎&#xff0c;许多品牌纷纷降低材料品质以迎合大众需求&#xff0c;导致耳机的性能和音质严重下滑。这让消费者在选择优质开放式耳机时感到困惑。作为一名专业的耳机评测人员&#xff0c;我近期对多款热门开放式耳机进行了深入的测评&a…

postman测试导入文件

01 上传文件参数 1.选择请求方式 选择post请求方式&#xff0c;输入请求地址 2.填写Headers Key&#xff1a;Content-Type &#xff1b; Value&#xff1a;multipart/form-data 如下图 3.填写body 选择form-data&#xff0c;key选择file类型后value会出现按钮&#xff0…

2024三掌柜赠书活动第四期: Next.js实战,构建现代化的可扩展Web应用

目录 摘要前言Next.js简介关于《 Next.js实战》实战示例最佳实践和进阶应用编辑推荐内容简介作者简介图书目录书中前言/序言《Next.js实战》全书速览结束语 摘要&#xff1a;本文将介绍Next.js&#xff0c;一个流行的React框架&#xff0c;以及如何在实际项目中使用Next.js构…

vue中封装使用svg图片

vue中封装使用svg图片 svg的优点 &#xff1a; 可以无损放大或缩小&#xff0c;支持多种滤镜和效果&#xff0c;易于修改和编辑 封装组件更加方便使用 1、封装SvgIcon组件 <template><svg :class"svgClass" aria-hidden"true"><use :xli…

Pytorch自动求导机制

PyTorch框架可以帮我们计算好反向传播&#xff0c;需要求导的&#xff0c;可以手动定义 示例&#xff1a; #先构造一个随机的三行四列矩阵&#xff0c;两种方法都可以#方法1 x torch.randn(3,4,requires_gradTrue) x#方法2 x torch.randn(3,4) x.requires_gradTrue x #再构…

路由器配置虚拟服务器

文章目录 路由器配置虚拟服务器1.前言2.配置流程2.1 进入路由器的登录页面2.2 找到端口映射功能2.3 添加虚拟服务器2.4 查找路由器的动态IP2.5 SSH连接 路由器配置虚拟服务器 1.前言 局域网下面连接着路由器&#xff0c;路由器下面连接着服务器&#xff0c;我们自己的电脑想要…

专业Python集成开发 -- Wing Pro 9

Wing Pro 9是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为专业开发人员设计。它提供了丰富的功能和工具&#xff0c;旨在提高Python开发人员的生产力。 Wing Pro 9的核心特点包括高级代码编辑器、调试器、重构工具、版本控制等。高级代码编辑…

buffer pool和查询缓存的区别

在学习buffer pool的时候我产生了疑问&#xff0c;buffer pool和查询缓存是一个东西吗&#xff1f; 结论&#xff1a;不是一回事。 buffer pool buffer pool我之前介绍过&#xff0c;它的出现是为了提高查找效率&#xff0c;缓存磁盘上的数据页。 buffer pool虽说是内存中的一…

速锐得解码匹配吉利枫叶80V/60S远程控制汽车应用B端市场

吉利枫叶80V/60S这两款车平时是不多见的&#xff0c;因为吉利枫叶的定位就的B端市场&#xff0c;包括了公务用车、共享出行、网约车、大客户定制&#xff0c;所以&#xff0c;好风凭借力&#xff0c;送我上青云&#xff0c;吉利在默默地发着一笔小财&#xff0c;或者说拓宽了更…

java遍历(for和forEach)

1.dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {r…

宝塔FTP文件传输服务结合cpolar内网穿透实现远程连接本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固…

成都首个大型直播基地天府锋巢直播产业基地,诚邀考察

天府锋巢直播产业基地是由德商产投与无锋科技联袂打造的以直播产业为核心的产业园区。天府锋巢直播产业基地是一个包含电商直播、娱乐直播、跨境直播等多种直播业态的全域直播基地。该基地将通过围绕直播产业上下游链的搭建&#xff0c;以整合资源的方式实现产业生态圈的形成&a…

【好用的AI工具Kimi Chat】帮助提高面试效率

一、背景 年前裁员潮&#xff0c;不少人离职找工作&#xff0c;以及年后金三银四&#xff0c;也是求职高峰期。如何更高效的复习技术知识&#xff0c;以及特别是横纵向比对有总结性的问题。本文以面试【测试开发】的岗位为例&#xff0c;对面试题进行拓展&#xff0c;让AI帮助…

InnoDB的Buffer Pool

前置概念&#xff1a;一个数据页16KB&#xff0c;一个数据页可能有多个记录&#xff0c;即使我们只需要访问一条记录&#xff0c;需要把整个数据页加载到内存中&#xff0c;加载到内存后不是直接释放&#xff0c;而是缓存到内存当中&#xff08;当然对于buffer pool的缓存是在存…

layui 自定义日期选择器今日、昨日 、本周、本月、上个月等

1、layui 日期选择器 laydate日期选择器 <div class"layui-input-inline"><input class"layui-input" id"dateTime" placeholder"日期范围"> </div><script> layui.use([laydate], function () {laydate.ren…

为什么MOS管很容易失效?有哪些失效?

在电子元件中&#xff0c;金属-氧化物半导体场效应晶体管&#xff08;MOS管&#xff09;是独特且重要&#xff0c;然而相比其他元件&#xff0c;MOS管很容易失效&#xff0c;导致电路无法正常运行&#xff0c;因此工程师必须查找原因并解决问题。 1、MOS管为什么很容易失效&…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

文章目录 1. 415. 字符串相加题目详情代码1思路1代码2思路2 2. 125. 验证回文串题目详情代码1&#xff08;按照要求修改后放到新string里&#xff09;思路1代码2(利用双指针/索引)思路2 3. 541. 反转字符串 II题目详情代码1思路1 4. 557. 反转字符串中的单词 III题目详情代码1&…