自动驾驶汽车硬件与软件技术介绍

来源:知乎

概要:本文详细介绍了自动驾驶汽车的硬件和软件,以及所需要做的准备工作,每个研发者或者准备投身于无人驾驶领域的人都应该好好看一下。


全球有数不清的公司在忙着研发自动驾驶汽车,他们的产品也千奇百怪,不过基本思路和核心技术是类似的,本文详细介绍了自动驾驶汽车的硬件和软件,以及所需要做的准备工作,每个研发者或者准备投身于无人驾驶领域的人都应该好好看一下。


大家都知道智能车(Intelligent Vehicle)是一个集环境感知、规划决策、多等级辅助驾驶等功能于一体的综合系统,它集中运用了计算机、现代传感、信息融合、通讯、人工智能及自动控制等技术,是典型的高新技术综合体。


自动驾驶的关键技术依次可以分为环境感知、行为决策、路径规划和运动控制四大部分。



自动驾驶理论听上去很简单,四大关键技术,但到底如何实现的呢?Google 从 2009 年开始做自动驾驶,到现在已有 8 个年头。8 个年头的技术积累还无法将自动驾驶技术量产落地,可见自动驾驶技术并不简单。自动驾驶是一个庞大而且复杂的工程,涉及的技术很多,而且太过细致。我从硬件和软件两方面谈一谈自动驾驶汽车所涉及的技术。


硬件


离开硬件谈自动驾驶都是耍流氓。先看个图,下图基本包含了自动驾驶研究所需要的各种硬件。



然而,这么多传感器并不一定会同时出现在一辆车上。某种传感器存在与否,取决于这辆车需要完成什么样的任务。如果只需要完成高速公路的自动驾驶,类似 Tesla 的 AutoPilot 功能,那根本不需要使用到激光传感器;如果你需要完成城区路段的自动驾驶,没有激光传感器,仅靠视觉是很困难的。


自动驾驶系统工程师要以任务为导向,进行硬件的选择和成本控制。有点类似于组装一台计算机,给我一份需求,我就给你出一份配置单。


汽车


既然要做自动驾驶,汽车当然是必不可少的东西。从上汽做自动驾驶的经验来看,做开发时,能不选纯汽油车就别选。一方面是整个自动驾驶系统所消耗的电量巨大,混动和纯电动在这方面具有明显优势。另一方面是 发动机的底层控制算法相比于电机复杂太多,与其花大量时间在标定和调试底层上,不如直接选用电动车研究更高层的算法。


国内也有媒体专门就测试车辆的选择做过调研。「为什么谷歌、苹果不约而同的选择了雷克萨斯RX450h(混动汽车)?」「科技公司测试自己的自动驾驶技术时,对于测试车的选择又都有哪些讲究?」等问题。他们得出的结论是「电」和「空间」对无人车改装至关重要,其次从技术层面上对车的「熟悉程度」是另外一个因素,因为如果不和车企合作改装,需要「Hack(侵入)」某些控制系统。


控制器 


在前期算法预研阶段,推荐使用工控机(Industrial PC,IPC)作为最直接的控制器解决方案。因为工控机相比于嵌入式设备更稳定、可靠,社区支持及配套的软件也更丰富。百度开源的 Apollo 推荐了一款包含 GPU 的工控机,型号为 Nuvo-5095GC,如下图。


Github ApolloAuto


当算法研究得较为成熟时,就可以将嵌入式系统作为控制器,比如 Audi 和 TTTech 共同研发的 zFAS,目前已经应用在最新款 Audi A8 上量产车上了。



CAN 卡


工控机与汽车底盘的交互必须通过专门的语言——CAN。从底盘获取当前车速及方向盘转角等信息,需要解析底盘发到 CAN 总线上的数据;工控机通过传感器的信息计算得到方向盘转角以及期望车速后,也要通过 CAN 卡将消息转码成底盘可以识别的信号,底盘进而做出响应。


CAN 卡可以直接安装在工控机中,然后通过外部接口与 CAN 总线相连。Apollo 使用的 CAN 卡,型号为 ESD CAN-PCIe/402,如下图。



全球定位系统(GPS)+惯性测量单元(IMU)


人类开车,从 A 点到 B 点,需要知道 A 点到 B 点的地图,以及自己当前所处的位置,这样才能知道行驶到下一个路口是右转还是直行。


无人驾驶系统也一样,依靠 GPS + IMU 就可以知道自己在哪(经纬度),在朝哪个方向开(航向),当然 IMU 还能提供诸如横摆角速度、角加速度等更丰富的信息,这些信息有助于自动驾驶汽车的定位和决策控制。


Apollo 的 GPS 型号为 NovAtel GPS-703-GGG-HV,IMU 型号为 NovAtel SPAN-IGM-A1。



感知传感器 


相信大家对车载传感器都耳熟能详了。感知传感器分为很多种,包括视觉传感器、激光传感器、雷达传感器等。视觉传感器就是摄像头,摄像头分为单目视觉,双目(立体)视觉。比较知名的视觉传感器提供商有以色列的 Mobileye,加拿大的 PointGrey,德国的 Pike 等。


激光传感器分为单线,多线一直到 64 线。每多一线,成本上涨 1 万 RMB,当然相应的检测效果也更好。比较知名的激光传感器提供商有美国的 Velodyne 和 Quanergy,德国的 Ibeo 等,国内有速腾聚创。


雷达传感器是车厂 Tier1 的强项,因为雷达传感器已经在汽车上得到了广泛使用。知名的供应商当然 是博世、德尔福、电装等。


硬件部分总结


组装一套可以完成某项功能的自动驾驶系统需要及其丰富的经验,并且要对各传感器的性能边界及控制器计算能力了如指掌。优秀的系统工程师能在满足功能的要求下将成本控制在最低,使其量产、落地的可能性更大。


软件


软件包含四层:感知、融合、决策、控制。


各个层级之间都需要编写代码,去实现信息的转化,更细化的分类如下。


先分享某创业公司公开的一份 PPT。



实现一个智能驾驶系统,会有几个层级:


  • 感知层 → 融合层 → 规划层 → 控制层


更具体一点为:


  • 传感器层 → 驱动层 → 信息融合层 → 决策规划层 → 底层控制层


各个层级之间都需要编写代码,去实现信息的转化。


最基本的层级有以下几类:采集及预处理、坐标转换、信息融合。



采集


传感器跟我们的 PC 或者嵌入式模块通信时,会有不同的传输方式。


比如我们采集来自摄像机的图像信息,有的是通过千兆网卡实现的通信,也有的是直接通过视频线进行通信的。再比如某些毫米波雷达是通过 CAN 总线给下游发送信息的,因此我们必须编写解析 CAN 信息的代码。


不同的传输介质,需要使用不同的协议去解析这些信息,这就是上文提到的「驱动层」。 通俗地讲就是把传感器采集到的信息全部拿到,并且编码成团队可以使用的数据。 


预处理


传感器的信息拿到后会发现不是所有信息都是有用的。


传感器层将数据以一帧一帧、固定频率发送给下游,但下游是无法拿每一帧的数据去进行决策或者融合的。为什么?

 

因为传感器的状态不是 100% 有效的,如果仅根据某一帧的信号去判定前方是否有障碍物(有可能是传感器误检了),对下游决策来说是极不负责任的。因此上游需要对信息做预处理,以保证车辆前方的障碍物在时间维度上是一直存在的,而不是一闪而过。


这里就会使用到智能驾驶领域经常使用到的一个算法——卡尔曼滤波。


坐标转换


坐标转换在智能驾驶领域十分重要。


传感器是安装在不同地方的,比如毫米波(上图中紫色区域)是布置在车辆前方的;当车辆前方有一个障碍物,距离这个毫米波雷达有 50 米,那么我们就认为这个障碍物距离汽车有 50 米吗?


不是的!因为决策控制层做车辆运动规划时,是在车体坐标系下完成的(车体坐标系一般以后轴中心为 O 点),因此毫米波雷达检测到的 50 米,转换到自车坐标系下,还需要加上传感器到后轴的距离。


最终所有传感器的信息,都是需要转移到自车坐标系下的,这样所有传感器信息才能统一,供规划决策使用。


同理,摄像机一般安装在挡风玻璃下面,拿到的数据也是基于摄像机坐标系的,给下游的数据,同样需要转换到自车坐标系下。



自车坐标系:拿出你的右手,以大拇指 → 食指 → 中指 的顺序开始念  X、Y、Z。然后把手握成如下形状:



把三个轴的交点(食指根部)放在汽车后轴中心,Z 轴指向车顶,X 轴指向车辆前进方向。


各个团队可能定义的坐标系方向不一致,只要开发团队内部统一即可。


信息融合


信息融合是指把相同属性的信息进行多合一操作。


比如摄像机检测到了车辆正前方有一个障碍物,毫米波也检测到车辆前方有一个障碍物,激光雷达也检测到前方有一个障碍物,而实际上前方只有一个障碍物,所以我们要做的是把多传感器下这辆车的信息进行一次融合,以此告诉下游,前面有一辆车,而不是三辆车。



决策规划


这一层次主要设计的是拿到融合数据后,如何正确做规划。规划包含纵向控制和横向控制:纵向控制即速度控制,表现为什么时候加速,什么时候制动;横向控制即行为控制,表现为 什么时候换道,什么时候超车等。


个人对这一块不是很了解,不敢妄作评论。


软件长什么样子?


自动驾驶系统中的部分软件看起来和下面类似。



软件的名字反映了该软件的实际作用:


  • app_driver_camera:摄像机驱动

  • app_driver_hdmap:高精度地图驱动

  • app_driver_ins:惯导驱动

  • app_driver_lidar:激光传感器驱动

  • app_driver_mwr:毫米波传感器驱动

  • app_fusion_freespace:自由行驶区域融合

  • app_fusion_lane:车道线融合

  • app_fusion_obstacle:障碍物融合 

  • app_planning&decision:规划决策 


然而实际上攻城狮们会编写一些其他软件用于自己的调试工作,比如记录数据和回放数据的工具。



还有用于传感器信息显示的可视化程序,类似下图的效果。



掌握了软件的思路,那么我们来看你都要做哪些准备。


准备


操作系统安装


既然是做软件,首先得有个操作系统。常见的操作系统 Windows/Linux/Mac...(打...的操作系统我也没用过),考虑到社区支持、开发效率,推荐使用 Linux 作为无人驾驶研究的操作系统。


大部分做无人驾驶的团队都用的 Linux,跟着大趋势走,可以省很多事。


Linux 又分为很多版本,最常用且普及率很高的当属 Ubuntu 系列。虽然 Ubuntu 已更新至 17.04,但从稳定性上,推荐安装 14.04 版本。


推荐用一块单独的 SSD 安装 Linux,或者使用虚拟机安装,最不推荐装双系统(不太稳定)奉上 Linux Ubuntu 14.04 安装包 + 虚拟机安装方法。(链接:http://pan.baidu.com/s/1jIJNIPg 密码:147y。)



Linux 基本指令


作为 Linux 的核心——命令行操作不仅对开发大有帮助,而且是装 X 利器。另一个好处是使用指令 apt-get install,可以快捷地完成很多软件的安装,不用像 Windows 那样,在网上四处寻觅适配的安装包。Linux 的指令很多,而且比较杂,使用起来需要多学,多用。


开发环境安装


开发环境会涉及很多实际使用的库,不同的程序员处理相同的问题,可能使用不同的库。下面通过安装我在工作和学习中经常使用到的库,抛砖引玉,将开发者「引进门」。


搭建环境所需安装包:



(链接:http://pan.baidu.com/s/1sllta5v 密码:eyc8)


附:开发环境介绍


集成开发环境 IDE


前面安装了一款开源的 IDE qt,目前 qt 在 Linux 中的地位,就和 Visual Studio 在  Windows 中的地位一样。除非是不使用 IDE 开发的高玩,大部分在 Linux 下做开发的团队还是会选择用 qt 开发的。


qt 的主要作用是做交互式的界面,比如在界面中显示当前传感器采集到的各种信息。界面交互会明显加快开发者调试程序和标定参数的过程。


Tips:

  • 熟悉 qt 可以网上找教程,我更推荐系统地学习,比如买一本 Qt 的书。

  • 买书或者去图书馆借书,注意看写书的日期,越新越好,太老的书,相应的版本也很旧。


OpenCV


OpenCV 是一个非常强大的库,其中封装了大量的可应用于无人驾驶研究的函数,包括各种滤波器算法、特征点提取、矩阵运算、投影坐标转换、机器学习算法等。


当然最重要的是,它在计算机视觉领域的影响力,相机标定,目标检测、识别、跟踪的接口使用起来十分方便。使用 OpenCV 库完全可以做出这张图展现的效果。



Tips:

  • 请至少购买版本为 2.4 以上的教程学习 OpenCV,但目前市面上买得到的 OpenCV 中文教程都讲的太浅,甚至连经典的 Kalman Filter 都不介绍。我推荐直接学习英文版的  Learning OpenCV3。


奉上电子版,讲解很详细,每次打印一章阅读,循序渐进。


(链接:http://pan.baidu.com/s/1dE5eom9 密码:n2dn)


libQGLViewer


libQGLViewer 是大名鼎鼎的 OpenGL 适配 qt 的一个库,编程接口及方法与 OpenGL 大同小异,我们经常在各大无人驾驶公司宣传画上看到的环境感知信息的显示,就完全可以用 QGL 做出来。



Tips:

学习 libQGLViewer 不需要购买任何教材,官网及压缩包内的 example 就是最好的老师,按照官网的tutorial,把每个例子实现一遍,就基本入门了。


官网链接:libQGLViewer Home Page


Boost


Boost 库是有着「C++准标准库」之称。这个库里面有大量的「轮子」,对于 C++ 开发者来说,方便直接调用,避免重造「轮子」。


Tips:

Boost 是基于标准 C++ 开发,其构造用尽精巧手法,不要贸然费时研读,找一份和 Boost 库相关的(电子或纸质)书,把目录读一遍,大致知道里面有哪些功能即可,需要时就某一个点,花时间做研究。


QCustomplot


除了上面提到的 libQGLViewer 外,还可以通过平面图的形式显示车载传感器的信息。鉴于 qt 内部只提供了基本的直线、圆等绘图工具,使用起来并不是很方便,因此 QCustomplot 诞生了。简单地调用 API,然后把想要显示的数据作为参数输入进去,就可以绘制出下面这些很棒的图形。而且可以很方便地拖动和缩放。


下面是我在实际开发过程中,使用 QCustomplot 显示的部分传感器信息。


Tips:

官网提供了该库的源码下载,你只需要在你的工程中导入 .cpp 和 .h 文件即可。跟着官网提供的 tutorials 学习,可以快速上手。对照着 example 中的例程写代码,可以快速把自己的数据变成可视化图像。


LCM(Lightweight Communications and Marshalling)


团队开发软件必然存在程序(多进程)的通信问题,多进程通信的方式很多,也各有优缺点,使用起来就见仁见智了。2014 年 12 月 MIT 公布了他们在美国 DARPA 机器人挑战赛中使用到的信号传输机制 LCM,出处:MIT releases LCM driver for MultiSense SL。


LCM 含多种语言如 java,c++ 等专门针对实时系统在高带宽和低的延迟的情况下进行消息发送和数据封送处理。它提供了一个发布/订阅消息模型、自动封装/解封代码生成工具含多种编程语言版本。这个模式和 ROS 现在节点间的通信方式很类似。


Tips:

LCM 两个进程间通信的 demo 官网上有源代码,按照官网上的 tutorial 就能快速建立属于你自己的 LCM 通信机制。


官方网站:LCM Projcect


Git & Github


Git 是团队开发不可缺少的版本控制工具,大家在写论文时肯定每天一个版本,如果没有特别标注每个版本改了些什么时间久了就会忘记。写代码更是如此。


使用 Git 可以极大地提高多人开发的效率,而且版本管理规范,代码追溯起来十分方便。


Github 在软件开发领域如雷贯耳,需要某些代码时,直接上去搜索即可。


Tips:

目前世面上介绍 Git 的书,让人看起来十分吃力,而且对细枝末节的东西介绍地太过深入,让人无法快速上手。


于是我要强烈推荐 Git 入门的教程:廖雪峰的 Git 教程,浅显易懂,而且还配合图文+视频,简直良心。


以上基本介绍完了,掌握好这些东西,你就变成无人驾驶领域的老司机了。


未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。由互联网进化论作者,计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘颖教授创建。


未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。

  如果您对实验室的研究感兴趣,欢迎支持和加入我们。扫描以下二维码或点击本文左下角“阅读原文”

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

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

相关文章

linux数组随机数,随机数与数组

随机数数组变量清屏时间延迟静态网站HTML随机数srand()函数用于播种函数头文件: stdlib.h函数定义: void srand(unsigned int seed)函数功能:设置随机数种子函数说明:通常可以用getpid(获取当前进程的进程识别码)或者time(NULL)(获取当前系统的时间信息)来充当种子,…

DeepMind 的2017:有 AlphaGo,更有社会责任

来源:AI科技评论概要:DeepMind 相信 AI 在更复杂的问题上也能起到同样的作用,它可以是科学技术工具,也可以是人类创造力的倍增器。AlphaGo 团队现在已经把注意力转向了另一组宏伟的目标,DeepMind 自己也希望这些研究人…

脏读、不可重复读和幻读

1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。2. 不可重复读 :是指在一个事务内…

c++语言中break的作用,C++ break和continue用法详解

用于 switch 中的 break 语句也可以放在循环中,当遇到 break 时,循环立即停止,程序跳转到循环后面的语句。以下是一个带有 break 语句的循环示例。程序段中的 while 循环看起来要执行 10 次,但 break 语句导致它在第 5 次迭代后即…

2018年人工智能13大预测

来源:英伟达概要:2017 年人工智能领域取得了许多里程碑式的成果。那么,以后人工智能又会如何发展呢?2017年被《华尔街日报》、《福布斯》和《财富》等刊物称为“人工智能之年”。各种深度学习在线课程不断推出,接受相关…

ORACLE 多版本读一致性

先来看看这段代码:while s in (select * from table1) loopinsert into table1 values(s.field1,s.field2,s.field3,s.field4,s.field5);end loop;如果是SQL server的开发人员,看到这段代码,肯定会摇头:这段代码有问题&#xff0c…

自动点名系统c语言,用C语言编写一个随机点名系统

/*编写一个随机点名系统,运行该系统后,按空格键可以显示出一名同学,以前被选中的同学,将不会再次被选中*/#include /*standard input & output*/#include /*standard libary*/#include /*string*/#include /*Console Input/Ou…

2017年全球AI芯片公司大盘点

来源:芯师爷概要:2017年,我们被AI公司的融资信息一次次刷屏,从2千万到1亿美金,让我惊诧道,AI的黄金年代真的来了吗?2017年,我们被AI公司的融资信息一次次刷屏,从2千万到1…

Oracle常用sql操作总结

一、选择行 1. 简单的SELECT 语句 SELECT 字段名1 [AS] 字段名1 解释 FROM table; 2. 处理NULL NVL函数可把NULL转换成其它类型的符号 编程技巧: NVL函数在多条件模糊查询的时候比较有用 NVL函数可返回多种数据类型: 返回日期 NVL(start_date,2002-02-01) 返回字符串 NVL(title…

51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...

/******************************************************************************** 实验名 : 红外控制步进电机1602显示值实验* 使用的IO : 电机用P2口* 实验效果 : LCD1602显示出读取到的红外线的值,步进电机作出…

邬贺铨:工业物联网的技术与前景

来源:走向智能论坛概要:工业物联网是企业信息化的进程,我们经历了流程电子化、管理数字化、生产自动化到企业互联网化和企业智能化。邬贺铨:工业物联网靠花钱是买不到的!12月20日,2017第八届中国物联网产业…

约瑟夫问题C语言加注释,用链表实现约瑟夫环【有注释,有很多注释】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼主要问题在于删除约瑟夫环的数,结果一直出不来,看了好几天改了好几次都改不对#include #include typedef struct ysf{int num;struct ysf*next;}YSF;YSF*creat(int aa[]){int i;YSF *headNULL,*p1NULL,*p2NULL;headp1p2(YSF*)mallo…

Windows平台下GO语言编译器(GO-windows)

go for windows下载:http://code.google.com/p/go-windows/ ,http://savechina.download.csdn.net/使用前需要dos执行set GOROOT<the go folder>set GOOSmingwset GOARCH386set PATH<the go folder>/bin编译执行test.go文件需要执行8g test.go //编译生成test.88l …

30亿美金投入!一文读懂英伟达性能凶残的Tesla V100牛在哪?

来源&#xff1a;智东西概要&#xff1a;AI已无处不在&#xff0c;两股力量正推动计算机领域的未来。GTC CHINA 2017大会上&#xff0c;英伟达创始人兼CEO黄仁勋表示&#xff0c;AI已无处不在&#xff0c;两股力量正推动计算机领域的未来。第一、摩尔定律已终结&#xff0c;设计…

WPF Border

在 WPF 中&#xff0c;Border 是一种常用的控件&#xff0c;用于给其他控件提供边框和背景效果。 要使用 Border 控件&#xff0c;您可以在 XAML 代码中添加以下代码&#xff1a; <Border BorderBrush"Black" BorderThickness"2" Background"Lig…

C语言的数组基础,C语言基础-数组

一、数组(一维数组)什么是数组&#xff1f;数组是一组有序的、类型相同的数据的集合数组的作用&#xff1f;处理一些类型相同的数据集合数组的构成&#xff1a;元素、下标或索引、数组名定义&#xff1a;使用前必须定义1、存储类型2、数据类型3、数组名4、数组大小语法&#xf…

Go语言,在Ubuntu9.10和Windows安装

工作环境&#xff1a;Ubuntu9.10A、安装C语言工具Go的工具链采用C语言编写&#xff0c;构建需要安装以下开发工具&#xff1a;GCC,C语言标准库,the parser generator Bison,make,awk, 和ed &#xff08;编辑器&#xff09;.对于 OS X 系统&#xff0c;以上工具是Xcode的一部分。…

世界类脑AI巨系统研究综述,论ET大脑是不是全球首个类脑架构AI

前言&#xff1a;2017年12月20日阿里云云栖大会提出ET大脑&#xff0c;并宣称为全球首个类脑架构AI&#xff0c;本文详细介绍了类脑AI系统的理论研究和发展现状&#xff0c;分析了ET大脑理论的沿袭与借鉴。并指出企业为提升影响里推动新概念新理论无可厚非&#xff0c;但涉及到…

n元n次方程求解c 语言,解n元一次方程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼解N元一次方程从文件读入整数 N, 然后读入N*( N1)矩阵&#xff0c;得到解并输出到文件中。int main(){int ch;printf("\n");printf(" Gaussian Matrix Cal \n");printf("\n");printf("Choose:…

我为什么喜欢Go语言

来源&#xff1a;http://www.cnblogs.com/AllenDang/archive/2012/03/03/2378534.html 从2000年至今&#xff0c;也写了11年代码了&#xff0c;期间用过VB、Delphi、C#、C、Ruby、Python&#xff0c;一直在寻找一门符合自己心意和理念的语言。我很在意写代码时的手感和执行的效…