Apollo星火培训——Cyber RT基础入门与实践

2023-11-23 22:30

本文主要是介绍Apollo星火培训——Cyber RT基础入门与实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一天 Cyber RT基础入门与实践

  • 背景
  • 1.1 Cyber简介
    • 1.1.1 框架优势
    • 1.1.2 框架结构
    • 1.1.3 通信构成
    • 1.1.4 程序构成
    • 1.1.5 系统安装
  • 1.2 Bazel简介
    • 1.2.1 Bazel项目结构
    • 1.2.2 了解BUILD文件
    • 1.2.1 了解 buildtool工具

本文来源于:https://apollo.baidu.com/community/article/1093
仅学习用,若有侵权,可联系删除

背景

Apollo8.0的架构图中,软件核心层中,感知、规划、控制等模块的存在使得汽车具备了类人的驾驶能力,但是这些模块在软件系统中是相互解耦的,Cyber RT就担负起了把自动驾驶中的各个算法模块组织串联的重任,满足了各算法模块之间的数据通信需求,同时也保证在数据通信过程中的实时性与可靠性。这就好比是人的血管、肌肉与大脑的关系。

1.1 Cyber简介

Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架,于2019年与Apollo 3.5开放平台同期发布,它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题,同时还提供了多种通信机制和用户级的协程,在资源有限的情况下会根据任务的优先级来进行调度处理。如下图所示,Cyber RT通过Component来封装每个算法模块,通过有向无环图(DAG)来描述Components之间的逻辑关系。对于每个算法模块,都有其优先级、运行时间、使用资源等方面的配置。系统启动时,系统会结合DAG文件、调度配置等信息,创建相应的任务,从框架内部来讲,就是协程,然后图中间的调度器把任务放到各个处理器的队列中,最后由左上角Sensor输入的数据,驱动整个系统运转

在这里插入图片描述

1.1.1 框架优势

Apollo Cyber框架的优点主要有以下几点:

  • 高性能:Apollo Cyber是专为自动驾驶定制的高性能运行时框架,能够处理高并发、低延迟、高吞吐等自动驾驶系统中的复杂任务。
  • 灵活性:Apollo Cyber提供了多种通信机制和用户级的协程,可以根据任务的优先级来进行调度处理,能够灵活地应对各种自动驾驶场景。
  • 可靠性:Apollo Cyber通过Component来封装每个算法模块,通过有向无环图(DAG)来描述Components之间的逻辑关系,能够确保系统各个模块之间的稳定性和可靠性。
  • 扩展性:Apollo Cyber的架构可以支持各种不同类型和不同层次的自动驾驶任务,并且可以方便地扩展和升级。

1.1.2 框架结构

如下头所示为Cyber RT的框架结构图。
在这里插入图片描述

  • 第一层:主要是Apollo实现的基础库,比如有Lock-Free的对象池,Lock-Free的队列等。实现基础库可以减少相关的依赖并提高运行效率。
  • 第二层、三层:主要是负责管理Cyber的通信机制,包括服务发现(负责管理通信中的Node节点)和Publish-Subscribe通信机制。并且Cyber也支持跨机、进程间、进程内通信,而且会根据不同的数据传输和业务逻辑自动选择效率最高最匹配的通信方式来进行通信。
  • 第四层:主要是对传输过后的数据进行缓存,并会根据不同传感器得到的数据进行融合得到一个可处理可读的数据发送给另一个模块。
  • 第五、六层:主要是管理每一个任务的调度和数据处理。
  • 第七层:提供给开发者的一些API接口,让开发者有更多可操作性,提高开发效率。

1.1.3 通信构成

Node是Cyber的基础构建,每一个模块都会包含一个Node节点,模块之间通过Node节点来进行通信。Node之间的通信可以设定不同的模式,有Reader/Writer和Service/Client。
Cyber采用的是分布式系统,Node是通过Topology来管理的,每个Node都是这个拓扑图的顶点,其中每个Node顶点是通过Channel或者Service来连接的。Node节点是去中心化的,可以动态监控节点的增加和删除。Channel可以理解为一块共享内存,采用共享内存的通信方式,可以大大提高通信效率。下图1-2就能更加形象得表现Node之间的关系与数据流向。
图1-2 Topology管理图

1.1.4 程序构成

如图1-3所示,这是由3个Component(Cyber把每个模块,例如Camera驱动、控制模块都会有对应的Component组件)组成的一个简单的网络, 最左边Camera Driver作为系统的输入节点,从传感器读取数据并发送到/sensor/camera/image这个Channel(Component之间通信的通道)中,然后中间的这个Perception Component,它会订阅相机驱动传感器的数据,从/sensor/camera/image这个Channel中取出数据并进行相应的算法处理,将得到的结果从/perception/obstacles这个channel中进行输出,最右边的是Planning component,它会从/perception/obstacles这个Channel中取出感知结果并得到一个决策规划的结果。下面就是具体的Component的实例,实例中的Perception它不需要关心上下模块是Camera还是Planning,只需要定义自己的输入,也就是SensorMessage这个类型的数据,以及在配置文件中定义输入的Channel名字即可,在开发阶段就能大大减少两个模块之间的耦合。

图1-3 通信流程图

1.1.5 系统安装

在使用Cyber框架时会进入到Apollo的docker容器中,所以要先安装好Apollo并进入到容器内操作,Cyber框架代码在apollo/cyber。

Apollo Cyber安装可参考链接: 安装链接

1.2 Bazel简介

在学习和使用CyberRT时需要用到Bazel,所以这里我们了解一下Bazel。Bazel是Google研发的一款开源构建和测试工具,也是一种简单、易读的构建工具。其优点如下:

  • Bazel 仅重建必要的内容。借助高级的本地和分布式缓存,优化的依赖关系分析和并行执行,可以获得快速而增量的构建。
  • 构建和测试 Java、C++、Android、iOS、和其他各种语言平台。Bazel 可以在 Windows、macOS 和 Linux 上运行。
  • Bazel 帮助你扩展你的组织、代码库和持续集成系统。它可以处理任何规模的代码库。

1.2.1 Bazel项目结构

在构建项目之前,您需要设置其工作区。工作区是一个保存项目源文件和 Bazel 构建输出的目录。它还包含 Bazel 识别为特殊的文件:

  • 该WORKSPACE文件将目录及其内容标识为 Bazel 工作区并位于项目目录结构的根部,
  • 一个或多个BUILD文件,告诉 Bazel 如何构建项目的不同部分。
    其目录结构大致如下:
project
|-- pkg
|   |-- BUILD
|   |-- src.cc
|-- WORKSPACE

1.2.2 了解BUILD文件

一个BUILD文件包含多种不同类型的 Bazel 指令。最重要的类型是构建规则,它告诉 Bazel 如何构建所需的输出,例如可执行二进制文件或库。文件中构建规则的每个实例BUILD称为目标,并指向一组特定的源文件和依赖项。一个目标也可以指向其他目标。例如:

cc_binary(name = "hello_world",srcs = ["hello_world.cc"],
)

在示例中,hello-world目标实例化 Bazel 的内置 cc_binary规则。该规则告诉 Bazel 从源文件构建一个独立的可执行二进制文件。

BUILD文件中常见的两种规则:

  • cc_binary:表示要构建对应文件变成二进制文件。

    • name:表示构建完成后的文件名字。
    • srcs:表示要构建的源文件。
    • deps:表示构建该文件所依赖相关的库。
  • cc_library:表示要构建对应文件变成相关依赖库。

    • hdrs:表示的是源文件对应的头文件路径。
    • package(default_visibility = [“//visibility:public”])这段代码则表示该文件是公开的,能被所有对象找到并依赖。

1.2.1 了解 buildtool工具

Apollo源码版采用原生的bazel编译,但包管理环境下我们使用buildtool来对代码进行编译。Apollo buildtool是一个命令行工具,提供编译、测试、安装或运行Apollo模块等功能。基于buildtool,不仅可以方便地安装Apollo中各个模块的二进制包,还可以对这些源代码进行二次开发、编译和测试,而不需要下载整个Apollo。buildtool可以让开发者只关注需要开发的模块,提高整体开发效率。

buildtool详细使用方法请参考: buildtools工具

这篇关于Apollo星火培训——Cyber RT基础入门与实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420791

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

SpringBoot集成WebService(wsdl)实践

《SpringBoot集成WebService(wsdl)实践》文章介绍了SpringBoot项目中通过缓存IWebService接口实现类的泛型入参类型,减少反射调用提升性能的实现方案,包含依赖配置... 目录pom.XML创建入口ApplicationContextUtils.JavaJacksonUt

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4