阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

打造最可靠的自动驾驶基础架构

  • 2019-11-27
  • 本文字数:4996 字

    阅读完需:约 16 分钟

打造最可靠的自动驾驶基础架构

导读:本次分享的主题为打造最可靠的自动驾驶基础架构。主要内容包括如何做 Pony.ai 自动驾驶系统的基础架构,涉及到的技术困难,以及我们是如何克服的。



首先先了解下传统互联网公司的基础架构:


  • 数据基础设施,会包括大规模的数据库、分布式的文件系统;

  • 计算平台,可能会需要大量的服务器、大数据平台、容器的管理机制;

  • Web 服务管理,同时还会有各种各样的 Web Service,不停的迭代来满足新的业务发展。


这是传统互联网公司要做的事情,但是对于自动驾驶公司和 Pony.ai,在这样的架构基础上我们还会做哪些事情?



这是 Pony.ai 的基础架构,包含了所有传统互联网公司要做的事情,除此之外,还需要做如下事情:


  • 自动驾驶车载系统,如何支持各种各样的 AI 技术、算法,如何控制车辆,这都依赖于自动驾驶车载系统来完成。

  • 大规模仿真平台,Pony.ai 每天至少会跑 30W 公里的仿真测试(很多自动驾驶公司一年跑的里程可能只有百万级别),这点对于自动驾驶测试来说非常重要。

  • 车队运营基础平台,Pony.ai 要打造自己的移动出行服务,需要基础平台来支持 Robotaxi 的运营。

  • 可视化平台与人机接口,可视化平台是帮助我们了解系统到底是如何思考、运作的,或者当测试工程师做各种测试的时候都依赖于可视化平台;人机接口,自动驾驶车辆最终是要提供出行服务,是有乘客在里面,这时会有一个可视化的界面,来告诉乘客车所感知的周围环境,以及接下来的驾驶操作等等信息,同时还会提供人机交互的功能,让乘客也能控制车辆,比如输入目的地,或者需要停车等等。



Pony.ai 的目标是打造自动驾驶移动出行平台,我们希望可以在不同的城市,可以提供大规模自动驾驶车辆的运营,那么我们的基础架构会面临以下挑战:


  • 车辆数量的增加,目前广州已经有几十辆车在进行测试,同时还在不停的增长着;

  • 运营区域的扩大,刚开始只是在很小的区域进行测试,目前已经在几百平方公里的区域进行测试;

  • 数据量的增长,我们有很多的传感器,以及车辆和运营区域的增加,都使得数据量的增长非常非常非常大;

  • 工程师数量的增长,目前 Pony.ai 有广深、北京、美国四个 office,工程师的数量每周都在增长,所以导致模块数量和内部代码的数量也在增长。


所有的这些增长都要求我们的技术栈是具有可扩展性的,来满足快速增长所带来的挑战。



刚刚讲了整个基础架构,其中重要的一点就是车载系统,在讲车载系统之前,先简单介绍下自动驾驶系统:


  • 传感器及其他硬件:激光雷达、高分辨率摄像头、毫米波雷达、GNSS/IMU、运算平台,我们可看到图中标了不同的颜色,目前这些传感器是通过 Supplier Partner 来得到的,我们自己不做传感器,我们需要去购买他们的产品,但是购买之后需要做数据进一步的分析和整合,然后做后面的处理,然后对于运算平台除了 supplier 的一些应用外,我们自己也会做一些优化。传感器主要要做的事情就是接收真实世界的数据,然后传递给 Pony.ai 自动驾驶系统中。

  • 自动驾驶系统:首先,要做传感器融合,进行时间同步,将多传感器的数据融合在一起;然后是感知模块,用来感知周围的环境有什么样的障碍物和物体;接下来会进行行为预测,预测这样的障碍物或物体之后的行为会是什么样的;然后才到我们的决策规划模块,按照之前的预测来决定之后车辆的动作,如急刹车、让路、超车等动作;最后,就是我们的控制模块,他会按照决策规划模块,告知我们的系统要怎么做,然后决定怎么踩刹车、油门,怎么打方向盘。

  • 车辆,我们本身是不造车的,所以车辆是由 OEM 提供的,但是整个控制的算法,是我们自研去做的。

  • 除此之外,还有高精地图与定位模块,以及数据与系统架构(数据的处理,以及控制数据在不同模块的流动)。


这里介绍的是各个模块,但最后把他们串联起来,靠的是我们的自动驾驶软件系统,这就是自动驾驶的车载系统。很多自动驾驶企业使用的是 ROS 的一套工业系统,而 Pony.ai 是从第一行代码开始,写了一套 PonyBrain,自研的多层次自动驾驶车载系统,最主要的做的事情有:


  • 多模块的调度运行,所有模块的调度运行都是 Pony.ai 自己去做的。

  • 模块间的消息通信,如何把数据从激光雷达传递到传感器融合的模块,再把融合的结果放到感知模块中,然后感知的数据怎么告诉行为预测、决策规划等等模块,以及如何拿到高精地图与定位的信息。

  • 车载计算资源的分配与管理,对于自动驾驶来说反应速度是非常重要的,这就需要我们对内存、CPU、GPU 等有足够的优化,做到定制化的车载计算资源分配与管理。

  • 日志记录,同时我们需要完善的日志记录,我们所有的测试数据回来都需要一整套的 Pipeline 去做自动化的分析,然后帮我们评判出有意义的数据,给到测试工程师或者研发工程师,进行进一步的分析去使用,然后进一步提升我们的模型。

  • 监控与报警,保证了我们自动驾驶的安全性。



车载系统的挑战


① 可靠性:车载系统必须足够的可靠,不能有任何的内存泄露、代码逻辑的错位,这种都是零容忍的,一旦发生了这样的事情,对整个自动驾驶系统来说是非常严重的事故,是有可能影响到安全性的,对于 Pony.ai 自动驾驶系统技术的发展来说,安全永远是我们的第一位,所以所有影响安全性的事情,我们都是零容忍的,同时他也会影响车队运营的效率;所以我们还需要系统监控与异常报警,一旦系统出现任何问题,我们需要及时提醒安全员,做出车辆接管的操作。


② 高性能:满足模块间通信的海量数据压力,同时实现低延迟。


③ 灵活性:支持多种不同类型的计算资源的接入,以及不同类型模块的接入,需要有灵活的系统来支持计算资源的高速迭代。



车载系统的实践:


  • 可靠性


① 代码质量要求高:对于可靠性来说我们有非常严格的 code review 和 unit test,相信这是在国内互联网公司不太容易见到的一件事情,虽然会非常耗时,但是对可靠性的提升是有非常大的帮助的。


② 合理使用工具帮助发现问题:同时我们也会使用非常多的工具,如静态分析、ASAN 等等,来做离线的分析,来保证系统的可靠性。


③ 多重系统可靠性检查:包括系统启动前校验,系统运行时实时监控,系统运行后数据分析等。



④ 这是我们的持续集成与发布的平台:对于每一次代码的修改,我们都会进行仿真测试;然后对于研发的迭代,我们每周会有 Release 版本的更新,保障版本的稳定性,同时,刚刚我们整个测试包括封闭,半封闭,高峰期的测试,整个测试流程怎么持续集成与发布,也是保证系统可靠性的一种方法。



  • 高性能


① 合理的架构避免大数据拷贝等严重影响性能的逻辑。


② 依据模块逻辑分配合适的计算资源,如内存、CPU、GPU 等。


③ 定期对整个系统 Profile 分析系统的性能瓶颈。


  • 灵活性


① 定义足够通用的模块公共接口。


② 定义足够通用的消息通信接口。



为什么需要仿真系统?因为仿真系统可以使得我们车还没有上路的时候,就已经做了大规模的自动驾驶测试,无需路测和人力接入就可以评价系统的性能变化;由于没有进行路测,不会引起路面事故;同时,仿真系统还提供了基于数据驱动快速迭代算法的可行性,新的算法可以先在仿真平台上做验证,一些具体的指标和测试的信息都会在仿真平台上有所体现。



仿真系统数据的俩个不同来源


① 支持真实路测收集的场景,我们的路测数据非常的多,数据回来之后,通过 Data Pipeline 自动更新这些有意义和有意思的场景,我们会根据当时的场景改动相应的模块,然后会在仿真系统重跑当时的场景,来判断新的方法是否 work;


② 支持人工和随机生成的场景,这样的一些仿真的场景,也是非常的重要的,因为虽然我们在做大规模的路测,但是不代表可以遇到所有的场景,很多场景无法在路测中收集到,这就需要我们通过人工去创造这样的场景出来,给我们的系统一些样本,来学习如何处理这样的场景,保证我们新的 feature 在这样的场景不会出现问题。



仿真平台的挑战与实践


① 仿真结果的可靠性:首先仿真的结果必须是可靠的,如果不可靠,用它检测出来的结果是没有任何的意义的。整个仿真是在服务端模拟车载环境跑的,同时在服务端构建车辆动力学模型,保证测试的数据足够可靠。


② 仿真数据的选择与管理:当然我们会选择合适的路测数据来帮助算法的迭代(这里的选择不是人工的选择,是全自动化的选择,帮我们在茫茫数据中挑选出有意义的数据);另外,我们还会规范的依据类别管理大规模的仿真数据,比如感知模块的一些改动,到底需要测试哪些数据,才会更加的体现这个改动带来多少影响,这里我们会有内部的一个分类,我们不会对所有的数据进行无差别的仿真(这样做意义不大)。


③ 仿真系统的性能:我们将整个仿真系统并行部署在分布式计算平台中,这才可能满足我们单天 30W 公里以上的仿真测试,并且这个数据还在不断增长。



数据基础架构


数据是自动驾驶技术进步的核心驱动力,没有数据,我们就看不到现在如此多的测试车辆在进行路测,数据本身有几个重要的点:


① 如何存储海量的数据,如何支持快速的访问。


② 如何进行数据处理。


③ 如何进行数据同步,如何把不同区域、路测数据、车载数据同步到数据集中,如何让不同办公区的工程师都可以使用这些数据,对数据同步来说是一个很大的挑战。


核心挑战


① 数据量大:我们有 PB 级别的数据,这里只是以摄像头为例,还包括其他传感器数据,以及系统运作的中间数据等等。


② 数据属性不同于互联网数据:我们的数据由客户端产生,有大量的传感器数据、大量的模块运行日志,这与互联网数据有本质的区别,所以对整个数据架构的要求也是不一样的。



数据存储的挑战


① 依据特定的使用场景设计合理的存储格式的设计:以便于车载系统记录、大规模数据分析(数据回来之后,需要有方法进行分析,找出有意义的数据)、部分数据访问、文件系统存储(如何高效的利用文件系统)等。


② 选择合适的存储系统:


  • 针对冷/热数据选择不同方案

  • 选择高可用的存储系统

  • 选择易于水平扩展,因为车辆规模是不停的在变大的,运营时间越来越长,数据的增长速度是远超想象的,所以需要易于水平扩展的存储系统。

  • 控制成本,不能用过于昂贵的设备。



数据处理可以帮助收集性能指标,有 MPI(平均每次接管所需里程)、模块运行效率、乘客舒适度体验等,还有就是路测有趣场景的挖掘,如接管、急刹、感知算法识别、不合理的变道策略等用于模型训练和仿真。



数据处理的挑战


① 减小数据采集到处理的全流程时间:如何以最快的速度把数据从车传到中间处理系统,Data Pipeline 运行完之后,上传到数据中心,这里面我们做了非常多的工作。


② 依据不同类型数据处理任务选择合适的处理系统:计算量要求比较高的我们选择 CPU 密集型系统来处理;更多的会是车载的数据,我们会选择 IO 密集型系统进行处理。


③ 通用的任务定义以支持灵活的添加新任务:帮我们检测出来更多有意义的数据。



车队运营基础平台:


我们有一个 Pony Pilot 项目,在我们广州所有的内部员工都可以使用,同时在北京和美国加州,也有同样的服务已经上线,那么支持这样的服务,我们需要做哪些事情:


  • Fleet Control Center,车队控制中心

  • Pony Pilot APP

  • Onboard system

  • 各种各样的 webapp,帮助我们观察整个车队的运营情况,帮助管理测试的车辆和人员。



车队运营基础平台的挑战


需要支持复杂需求变化的 web 框架,同时我们有大量的 web service 的部署与管理,这都需要我们去完善 web 服务通用组件,例如部署工具、日志记录平台随时排查问题、监控平台保证所有 service 平台的高可容性。



容器与服务调度平台


通过 Kubernetes 来帮我们做各种各样的服务调度和集群支持。



可视化平台


① 目标:方便人类理解无人车系统看到的世界


② 挑战:首先,需要足够的灵活,易于适配不同需求的工具;其次,需要有高性能的现实,如 3D 实时渲染的高效实现;最后,支持跨平台的可视化框架,如桌面系统、移动系统、Web 等多平台。



人机接口


方便乘客使用的用户界面,同时可以看到自动驾驶是如何了解世界,如何做决策,如何规划之后的行为等等,给乘客更多的信息和信任。



总结


① Pony.ai 的基础架构工作包括:


  • 传统互联网公司所需要解决的基础架构挑战。

  • 自动驾驶技术特定的基础架构挑战。


② 在这里工作你可以:


  • 接触自动驾驶系统的各个方面。

  • 设计并实现满足通用需求的单机和分布式系统。

  • 系统的保障自动驾驶技术的持续进步。


作者介绍


莫璐怡


Pony.ai | Tech Lead


本文来自 DataFun 社区


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247495335&idx=1&sn=824ad1109025c730dc87fa430f296831&chksm=fbd75ccbcca0d5ddeaf5da90b6b8faff79c465d7456f066fb4b08adb912fcfabc1d064708e80&scene=27#wechat_redirect


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-11-27 08:002223

评论

发布
暂无评论
发现更多内容

Node.js与二进制数据流

自然醒

Java node.js 大前端 二进制

这样的二维码,你见过吗?

诸葛小猿

Java Python 后端 二维码 myqr

Linux 进程必知必会

cxuan

Linux 操作系统

推荐一款Python开源库,技术人必备的造数据神器!

狂师

Python 开源 自动化 开发工具 开发数据

不是完成你学习的 KPI ,而是要形成指导你行动的 OKR

非著名程序员

学习 程序员 提升认知 知识管理

typora设置图片自动上传,实现快速发文章

诸葛小猿

Typora PicGo gitee 上传图片

架构师训练营第六周总结

Melo

极客大学架构师训练营

阿里四面你都知道吗?

java金融

Java 程序员 互联网 阿里 简历

一些思考

张健

Rust是如何保障内存安全的

博文视点Broadview

读书笔记 rust

分布式缓存与消息队列

紫极

数据库分片

Axe

浅析 VO、DTO、DO、PO 的概念、区别和用处!

Java小咖秀

学习 设计模式 模型 经验分享

​区块链技术的重要性

CECBC

redis系列之——分布式锁

诸葛小猿

Java redis 分布式 分布式锁

JVM中栈的frames详解

程序那些事

JVM 堆栈 性能调优 JIT GC

字节跳动面试经验分享,已拿 Offer!

伍陆柒

Java 面试 大厂

关于计划的思考

zhongzhq

ArrayList源码阅读

慌张而黑糖

ArrayList 源码阅读

Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车

newbe36524

Docker Reactive ASP.NET Core

kubernetes集群安装(二进制)

小小文

Kubernetes 容器

重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

小傅哥

设计模式 小傅哥 重构 代码优化 访问者模式

Tomcat8.5源码构建

知春秋

tomcat tomcat构建 tomcat源码解读 tomcat剖析

Python类中的__new__和__init__的区别

BigYoung

Python __init__ __new__

Python中的@staticmethod和@classmethod的区别

BigYoung

Python classmethod staticmethod

猿灯塔:spring Boot Starter开发及源码刨析(二)

猿灯塔

Java 猿灯塔 源码刨析

带你解析MySQL binlog

Simon

MySQL Binlog

Scala中如何优雅地实现break操作

吴慧民

scala

聊聊Spring的IOC以及JVM的类加载

小隐乐乐

工厂方法模式

Leetao

Python 设计模式 工厂方法模式

Redis进阶篇三——主从复制

多选参数

redis redis高可用 redis6.0.0 Redis项目

打造最可靠的自动驾驶基础架构_架构_DataFunTalk_InfoQ精选文章