自百度Apollo自动驾驶平台开源以来,已快速迭代至 3.5 版本,代码行数超过 39 万行,合作伙伴超过 130 家,吸引了来自 97 个国家的超 15000 名开发者。无疑,Apollo 是目前世界范围内最活跃的自动驾驶开放平台之一。

最新发布的 Apollo 3.5 总体架构从上到下仍分为四层,最底层为车辆平台,自动驾驶汽车需要对车辆进行线控改造,使得车载大脑可以通过电信号来控制车辆的执行器;往上一层是硬件平台,包括计算单元、传感器以及 V2X 相关接收设备等。再上一层是软件平台,主要包括操作系统、中间件、算法模块等。最顶层的是云端服务,主要包括地图、OTA 服务升级、数据平台、语音交互等方面。

此次发布的Apollo 3.5,解锁了Apollo 在复杂城市道路中的自动驾驶能力,并开源了 Cyber RT 计算框架、V2X 车路协同方案以及硬件平台的一些能力。

随着自动驾驶技术不断发展,Apollo 已经从研发走向量产产品落地。作为 Apollo 开源软件平台的一部分,Apollo Cyber RT 处于底层的实时操作系统(RTOS) 和算法模块之间,那么如何能够在保证高吞吐的情况下,又能低延迟的实时响应上层任务,并保证整个系统确定性的运转,1 月 24 日,在 CSDN 平台上举办的 Apollo 开发者社区公开课上,百度主任架构师王柏生就 Cyber RT 的设计思考,总体架构以及关键模块相关细节同开发者做了分享。

从 ROS 系统说起

Apollo 最初用的中间件是 ROS(机器人操作系统),概括来说,ROS 系统主要包含三方面:

第一是通信系统,ROS 是个分布式的松耦合系统,算法模块是以独立的进程形式存在的,也就是我们常说的 Node。ROS 基于 Socket 实现了pub/sub 的通信方式,不同的算法节点(node)之间通过 pub/sub 的发送/接收消息。

第二是 Framework&Tools (框架和工具),开发者可以基于 ROS 提供的 Client Library 和通信层,方便的收发消息。开发者只需要关注消息处理相关的算法,而至于算法何时被调用,全部由框架来处理。

第三是生态系统,从社区内,开发者可以很方便地寻找到很多现成的「传感器驱动」和「算法实现」等进行参考。

随着自动驾驶的发展,不少开发者,包括 Apollo 平台,把 ROS 应用于自动驾驶系统,毕竟自动驾驶汽车也相当于一个大的机器人。但是我们在实践中也遇到了很多挑战:

  • 首先,ROS 中的算法模块是以独立的进程形式存在的,那么这些进程之间应该以什么样的顺序去执行?实际上,Linux 本身是一个通用系统,内核中的调度器对上面的算法业务逻辑并不清楚,它只是在尽量满足公平的情况下让大家都得到调度。所以,ROS Node 运行顺序并无任何逻辑。

    但本质上自动驾驶是一个专用系统,任务应该按照一定的业务逻辑执行。那么是在 ROS 层加一个 Node,由其来同步各个算法任务的运行,还是在Linux 内核中实现新的调度策略,使其结合算法业务逻辑进行调度?前者的开销,后者的迁移性,都是需要思考的问题。

  • 其次,ROS 是一个分布式的系统。既然是分布式,就要有通信的开销。即使在同一个物理节点上,依然存在着通信的开销。所以 Apollo 前期曾经使用共享内存去降低 ROS 原生的基于 Socket 通信的开销。ROS 2 也在使用 DDS 解决通信方面的实时性。ROS 也支持 Nodelet 模式,这可以去掉进程间通信的开销,但是调度的挑战依然存在。

  • 第三,除了调度的不确定性,ROS 系统中还存在其他很多不确定的地方,比如内存的动态申请。

Cyber RT 的运行流程

算法模块通过有向无环图(DAG),配置任务间的逻辑关系。对于每个算法,也有其优先级、运行时间、使用资源等方面的配置。系统启动时,结合DAG、调度配置等,创建相应的 任务,从框架内部来讲,就是协程,调度器把任务放到各个 Processor 的队列中。然后,由 Sensor 输入的数据,驱动整个系统运转。

Cyber RT 架构

基本上,Cyber RT 包括如下软件模块:

最下面一层是基础库,为了高效,Cyber RT 实现了自己的基础库。比如我们实现了 Lock-Free 的对象池,实现了 Lock-Free 的队列,随着成熟,会陆续开放更多。除了框架自身外,将来也会逐渐应用于算法模块。除了效率原因为,也希望 Cyber RT 减少依赖。

再往上是通信相关的,包括服务发现,还有 Publish-Subscribe 通信机制。 Cyber RT 也支持跨进程、跨机通信,上层业务逻辑无需关心,通信层会根据算法模块的部署,自动选择相应通信机制。

通信层之上是 数据缓存/融合层,多路传感器之间数据需要融合,而且算法可能需要缓存一定的数据。比如典型的仿真应用,不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用。

再往上是计算模型,计算模型包括刚才前面提到的调度和任务,后面我们会详细讨论。

计算模型之上是为开发者提供的接口。Cyber RT为开发者提供了Component 类,开发者的算法业务模块只需要继承该类,实现其中的 Proc 接口即可。该接口类似于 ROS 中的 Callback,消息通过参数的方式传递,用户只要在Proc中实现算法、消息处理相关的逻辑。Cyber RT 也基于协程,为开发者提供了并行计算相关的接口。

Cyber RT 也为开发者提供了开发调试、录制回放等工具,未来还会开放性能调试工具。

从内核空间到用户空间

ROS 的主要挑战之一是没有调度,为了解决 ROS 遇到的问题,Cyber RT 的核心设计将调度、任务从内核空间搬到了用户空间。调度可以和算法业务逻辑紧密结合。

从 Cyber RT 角度,OS 的 Native thread 相当于物理 CPU。

在 OS 中,是内核中的调度器负责调度任务(进程、线程…)到物理 CPU 上运行。而在 Cyber RT 中,Cyber RT 中的调度器调度协程(Coroutine)在 Native Thread 上有序运行。

编排调度策略

任务编排策略是 Cyber RT 开源的主要策略之一。每个 Processor (Native Thread) 一个任务队列,由调度器编排队列中的任务。任务在哪个 CPU 上运行?任务之间是否需要相邻运行?哪些先运行?哪些后运行?都由调度器统一调度,任务基于协程实现。在任务阻塞时,快速让出 CPU。

每个物理 CPU 上除运行1个 normal 级别的 thread 外,运行着另外 1+ 个高优先级的 thread,基于此,实现用户空间的高优先级的任务抢占运行。比如,之前去 GPU 运行的算法,在 GPU 上完成运行返回后,应该尽快的得到运行。

这种调度策略,很好的结合了业务逻辑、数据共享和算力的平衡。并且任务不会在不同 CPU 上随机的调度来调度去,具有非常好的 Cache 友好性。

经典调度策略

任务编排策略,不仅需要对业务逻辑的深度理解,也需要结合计算机的算力等综合考虑。因此,Cyber RT 也提供了类似经典线程池模式的调度算法,这种模式几乎不存在配置的代价。对此,Cyber RT 也做了一些改进,比如为了减小锁的瓶颈,任务是多队列的。任务队列也支持优先级,后续还会支持分组,通过组控制算法对资源的使用。

算法任务的载体—协程

Cyber RT 使用了协程作为算法任务的载体。协程之于线程,就类似于线程之于物理 CPU,由 Cyber RT 中的调度器负责在各个线程之上周而复始,切换调度协程。为了算法模块在其他协处理器执行计算时,可以让出Processor(Native Thread),并在完成之后,回来时可以再次运行,Cyber RT采用了有状态的协程。

那么 Cyber RT 为什么采用协程呢?除了协程的切换非常快之外,调度的确定性是另外一个重要的原因。举个典型的例子,假设用 native thread 去执行一个任务,当任务因为去 GPU 等加速器运算时,或者因为资源原因被Block 时,在 thread 就绪时,什么时候调度上来其实是一个非确定的过程,完全依赖于操作系统以及其上任务的情况。

Cyber RT也支持跨进程、跨机通信

实际部署中,也存在着比如某个工具需要运行在独立的进程,安全系统部署在另外的节点。因此,Cyber RT 也支持跨进程、跨机通信。上层业务逻辑无需关心,通信层会根据算法模块的部署,自动选择相应通信机制。

以上就是本次直播分享的内容。非常感谢大家的参加!也欢迎大家提出问题,进行交流。更多 Apollo 相关的技术干货也可以继续关注 Apollo 开发者社区每月的课程分享,也可以在 Apollo GitHub(https://github.com/ApolloAuto/apollo)上提出技术问题与我们互动,期待大家的沟通交流!

百度Apollo 3.5是如何设计Cyber RT计算框架的?相关推荐

  1. 自动驾驶平台Apollo 5.5阅读手记:Cyber RT中的任务调度

    前言 自动驾驶系统Apollo在3.5中引入了Cyber RT,替换了之前基于ROS的变体.Cyber RT的一大特点在于其调度系统.因为自动驾驶与人身安全强相关,因此很强调实时性.传统的机器人系统并 ...

  2. 百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市

    来源:雷锋网 去年 10 月,全球自动驾驶研发先行者 Waymo 发布了长达 43 页的安全报告,里面详细说明了如何装备和训练自动驾驶车辆,从而避免驾驶过程中一些意外情况的发生. 今年 1 月,美国车 ...

  3. 【Cyber RT】Apollo Cyber RT安装

    一.下载源码 克隆Apollo 源码仓库 git clone https://gitee.com/ApolloAuto/apollo.git  (耗时30min) 二.启动Apollo Docker ...

  4. AI一分钟|特斯拉宣布裁员9%;Facebook启动隐私设计实验室;百度Apollo与宝马拜腾联姻...

    ▌Facebook 启动隐私设计实验室,改善个人数据共享方式 据外媒报道,社交网络巨头 Facebook 告诉美国参议院,该公司已经推出隐私设计实验室,将致力于改善人们分享个人数据的方式. 这个实验室 ...

  5. 百度 Apollo Cyber RT简介、基本概念以及与 ROS 对照

    一,背景 ROS 应用于自动驾驶领域的不足: 调度的不确定性:各节点以独立进程运行,节点运行顺序无法确定,因而业务逻辑的调度顺序无法保证: 运行效率:ROS 为分布式系统,存在通信开销 二,Cyber ...

  6. 百度Apollo发布智能驾驶商业化解决方案

    雷帝网 乐天 1月9日报道 美国当地时间2019年1月8日,百度Apollo Enterprise(Apollo企业版)正式发布. 百度称,Apollo Enterprise提供给汽车企业.供应商和出 ...

  7. 01_搭建百度apollo环境实操可用

    搭建百度apollo环境 0-前言 1-目标 2-方法 3-Apollo环境搭建 3.1-CPU版 3.1.1前置依赖硬件条件 3.2-GPU版 前置依赖软件 1.安装 Ubuntu 18.04 2. ...

  8. Apollo Cyber RT学习手册(基于Ubuntu18.04、Apollo 6.0_edu)

    本文全部内容源自赵虚左老师的<百度Apollo智能驾驶课程>,如有侵权请联系,本文内容为作者手敲,禁止任何形式转载,谢谢. 第一章 Cyber RT概述与环境搭建 1.1Cyber RT简 ...

  9. 对标Mobileye!百度Apollo公布L4级自动驾驶纯视觉解决方案Apollo Lite

    美国当地时间6月16日-20日,全球计算机视觉及模式识别领域顶级学术会议CVPR 2019(Conference on Computer Vision and Pattern Recognition) ...

最新文章

  1. 平均年薪50.8万,这个证书真!香!
  2. 讲故事的用户故事样例之1
  3. Nginx网站服务器
  4. 3Delight NSI: A Streamable Render API
  5. 如何开始学习编程?这 3 步很重要
  6. 电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
  7. Project中三种任务类型解释
  8. Linux设备驱动(转)
  9. Excel VBA 宏编程入门
  10. 软考软件设计师中级考试(二)——操作系统基本原理
  11. 收藏|史上最全的30个生物实验技术及原理
  12. php定时自动发送邮件(从数据库取数据)(超详细版本)
  13. stm32语音识别文字显示_『免费开源』基于STM32的之语音识别
  14. Ubuntu的VirtualBox虚拟机怎么识别物理机的U盘?我教你。
  15. centOS7.10 KDE桌面字体设置推荐
  16. Latex如何插入多个图片,实现并排排列或者多行多列排列
  17. 长途枢纽大楼综合布线系统
  18. 招黑还是真实力,华为P20媲美万元级别的单反?
  19. 计算机开机没有找到引导设备,电脑开机显示没有可以引导的设备
  20. 教师资格证面试试讲时可以戴手表吗

热门文章

  1. MySQL 微秒慢查询补丁
  2. 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan
  3. jdbc mysql select_java连接mysql数据库并使用jdbc进行查询详解
  4. OpenCV读写YAML/XML文件
  5. 《数据科学家养成手册》第十章--混沌论
  6. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
  7. 什么是Closed-form solution?
  8. 硬盘盘符双击无法打开,只能右键打开(解决方法)(转载)
  9. Web自动化测试 六 ----- selector选择
  10. 利用Unity3D制作简易2D计算器