Protocol Buffers

技术文档丨Apollo控制、路由等模块

感情迁移 提交于 2020-04-07 04:14:30
本文作者:Apollo开发者社区 控制模块 :通过生成控制命令(如加速、刹车和转向)来执行规划模块提供的时空轨迹。控制模块将规划轨迹作为输入,并产生控制指令给Can总线。 路由模块 :告诉自动驾驶车辆如何经过一系列车道或道路到达目的地。要计算出自动驾驶车辆经过的车道和道路,路由模块需要知道起点和终点。 数据 :是计算机与外部物理世界连接的桥梁。数据采集模块由传感器、控制器等其它单元组成。 通用模块 :该模块包含的代码并非专门面向任何模块,但有助于提升Apollo的功能。 以下,ENJOY 控制 简介 根据规划轨迹和汽车的当前状态, Control模块使用不同的控制算法来生成舒适的驾驶体验,Control模块可以在正常模式和导航模式下工作。 输入 规划轨迹。 汽车状态。 定位。 Dreamview AUTO模式更改请求。 输出 发送到底盘的控制命令 (转向、 油门、刹车)。 路由 简介 路由模块根据需求产生更加高级的导航信息。 路由模块依赖一个路由拓扑文件,在Apollo中通常以routing_map.* 方式命名。 可以使用以下命令生成路由地图: bash scripts/generate_routing_topo_graph.sh 输入 地图数据 路由需求(起始和终止位置) 输出 路由导航信息 数据 本模块包含Apollo的数据解决方案, 包括进行数据收集、存储

Tensorflow的gRPC编程(一)

梦想与她 提交于 2020-04-06 17:41:34
首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 比如说,一个方法可能是这样定义的: Employee getEmployeeByName(String fullName) 那么: 首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。 第三,当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。

caffe多GPU上手

狂风中的少年 提交于 2020-04-06 09:30:33
最新的caffe,增加了一个nccl的模块,用于支持多个GPU的运行。只需要在终端的 -gpu 参数加入0,1,2,3 配置环境:Ubuntu14.04 Mate + CUDA8.0 +NVIDIA1080Ti (X2) + matlab2015a +caffe(最新版) 需要安装NCCL $ git clone https://github.com/NVIDIA/nccl.git $ cd nccl $ sudo make install -j4 只需要然后在caffe 的config文件中注释去掉USE_NCCL := 1即可编译。 如果中途出现一些问题,可能原因可以去NCCL的github论坛里面找,还有如果gcc版本太低,也会出现编译错误,gcc需要最低版本4.8。 官方的多GPU的caffe编译成功。 接下来是做分割的Segnet网络的多GPU编译及其使用。 首先原来剑桥大学源码Segnet,https://github.com/alexgkendall 不支持多个GPU训练,很坑爹,batchsize只能设置为4,(480x360)。 然后下载https://github.com/developmentseed/caffe/tree/segnet-multi-gpu 接下来就是编译,其他按照标准的caffe教程安装。 如有想了解中间修改过程的可以参考: https:/

RPC框架实现(一) Protobuf的rpc实现

梦想与她 提交于 2020-04-06 03:58:22
概述 RPC框架是云端服务基础框架之一,负责云端服务模块之间的项目调用,类似于本地的函数调用一样方便。常见的RPC框架配带的功能有: 编解码协议。比如protobuf、thrift等等。 服务发现。指服务提供者更新接口后,服务使用者如何知道该接口更新。Protobuf协议使用的是预编译方式,dubbo中使用的是zk作为媒介。 负载均衡。 流量控制、熔断。 运维工具。 常见RPC框架有 谷歌的GRPC。 百度的BRPC。 阿里的dubbo。 脸书的thrift。 腾讯的tars。 本系列主要教大家如何实现RPC框架,使用的语音是C++,协议使用的是protobuf。 基于protobuf的RPC框架 这里不介绍具体protoc的使用方法,网上很多。在完成protoc编译后,会输出protobuf提供的服务框架中,主要有如下几个类 Controller,主要是rpc通信过程的辅助接口,记录错误状态和简单的控制。 Service,指特定的一个服务。在protobuf中,一个服务(service)可以包含多个方法(method),通过service+method可以唯一确定一个过程。 Channel,指使用者和提供者直接的连接通道,是protobuf的核心,但是rpc框架开发者一般不直接调用该类,而是调用下面的stub(桩/存根)。 Stub,客户端使用的存根,通过该类去发起远程过程调用

Tensorflow的gRPC编程(三)

百般思念 提交于 2020-04-06 03:05:44
这一节主要是python的教程。 here gRPC 基础: Python 本教程提供了 Python 程序员如何使用 gRPC 的指南。 通过学习教程中例子,你可以学会如何: 在一个 .proto 文件内定义服务。 用 protocol buffer 编译器生成服务器和客户端代码。 使用 gRPC 的 Python API 为你的服务实现一个简单的客户端和服务器。 假设你已经阅读了 概览 并且熟悉 protocol buffers 。 注意,教程中的例子使用的是 protocol buffers 语言的 proto3 版本,它目前只是 alpha 版:可以在 proto3 语言指南 和 protocol buffers 的 Github 仓库的 版本注释 发现更多关于新版本的内容。 这算不上是一个在 Python 中使用 gRPC 的综合指南:以后会有更多的参考文档。 为什么使用 gRPC? 我们的例子是一个简单的路由映射的应用,它允许客户端获取路由特性的信息,生成路由的总结,以及交互路由信息,如服务器和其他客户端的流量更新。 有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性。使用

php中使用protobuf之环境配置

 ̄綄美尐妖づ 提交于 2020-04-05 23:22:34
注意:protoc的版本和php-protobuf扩展的版本最好保持一致。比如都是V3.9.1 # 安装protoc 编译器 # 安装 php-protobuf 扩展 进入网址: https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.1 下载 protoc-3.9.1-linux-x86_64.zip + protobuf-php-3.9.1.zip protoc压缩包解压后直接可以使用,可以把二进制文件 ln 到/usr/bin/protoc 或者取命令别名 protobuf-php压缩包解压后,有个专门的php目录,里面有php扩展代码。进入之后就是php扩展安装的常规方法步骤 以上两个都安装好了之后,就可以定义.proto文件,然后使用 protoc --proto_path=/home/vagrant/proto_files --php_out=/home/vagrant/App player.proto 来源: oschina 链接: https://my.oschina.net/u/4496267/blog/3217473

Tensorflow的gRPC编程(二)

不想你离开。 提交于 2020-04-05 20:41:05
gRPC编程()一)是一个简单预览,这一篇是官网的一个概念转载。 here gRPC 概念 本文档通过对于 gRPC 的架构和 RPC 生命周期的概览来介绍 gRPC 的主要概念。本文是在假设你已经读过文档部分的前提下展开的。针对具体语言细节请查看对应语言的快速开始、教程和参考文档(很快就会有完整的文档)。 概览 服务定义 正如其他 RPC 系统,gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。 service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { required string greeting = 1 ; } message HelloResponse { required string reply = 1 ; } gRPC 允许你定义四类服务方法: 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。 rpc SayHello ( HelloRequest ) returns ( HelloResponse ) {

【微服务】序列化协议 In Action

孤街浪徒 提交于 2020-03-25 11:42:02
3 月,跳不动了?>>> 本文就常见的几种序列化协议介绍下简单的实践 ProtoBuf ProtoBuf 是有谷歌开源,可以跨语言,可编译成各种语言。可称之为一个IDL, Interface description language. 下载编译器,protoc protoc-3.11.4-osx-x86_64.zip;可下载不同操作系统的版本, https://github.com/google/protobuf/releases 设置环境变量 vi ~/.bash_profile export PATH=$PATH:/path/to/protoc-3.4.0/bin 在maven项目中引入相关依赖 <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.11.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.googlecode.protobuf-java-format/protobuf

Golang之json操作

主宰稳场 提交于 2020-03-22 14:38:50
3 月,跳不动了?>>> JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。在 类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和 Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、 可读性和流行程度等原因,JSON是应用最广泛的一个。 Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中 的 encoding/json 、 encoding/xml 、 encoding/asn1 等包提供支持并且这类包都有着相似的API接口。本节,我们将对重要的 encoding/json 包的 用法做个概述。 JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象—— Unicode本文编码。它可以用有效可读的方式表示基础数据类型和数组、slice、结 构体和map等聚合数据类型。 基本的JSON类型有数字(十进制或科学记数法)、布尔值(true或false)、字符 串,其中字符串是以双引号包含的Unicode字符序列,支持和Go语言类似的反斜杠 转义特性,不过JSON使用的是 \Uhhhh 转义数字来表示一个UTF-16编码(译注: UTF-16和UTF-8一样是一种变长的编码,有些Unicode码点较大的字符需要用4个 字节表示;而且UTF

gRPC的简介与实例详解

巧了我就是萌 提交于 2020-03-12 12:17:24
什么是gRPC gRPC是什么?可以用官网的一句话来概括: A high-performance, open-source universal RPC framework。 所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。如下图所示就是一个典型的RPC结构图。 ​ gRPC vs Restful API gRPC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说,gRPC使用的http2.0,而restful api则不一定)。不过gRPC还是有些特有的优势,如下: gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。关于protobuf可以参见下期Protobuf简明教程,另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。 gRPC可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS