你的浏览器OUT了o(╯□╰)o,想更好的浏览网站,请升级你的浏览器: IE8+ Chrome Firefox

史上最详细的无人驾驶汽车技术介绍【硬件+软件】

发表时间:2023-10-05 12:38:38 来源:mile体育米乐

  2021中国汽车软件质量峰会”。将于2021年3月18-19日在上海召开,以“主题演讲+互动解疑+圆桌讨论”的形式,聚焦汽车软件质量开发与管理发展的需求点和痛点分析,致力于解决汽车软件市场难点,巩固未来驾驶的安全保障。点击图片查看会议详情。

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

  大家都知道智能车(Intelligent vehicle)是一个集环境感知、规划决策、多等级辅助驾驶等功能于一体的综合系统,它集中运用了计算机、现代传感、信息融合、通讯、人工智能及自动控制等技术,是典型的高新技术综合体。无人驾驶的关键技术依次可大致分为环境感知,行为决策,路径规划和运动控制四大部分。(作者:pajyyy 来源:知乎)

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

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

  然而... 这么多传感器并不一定会同时出现在一辆车上。某种传感器存在与否,取决于这辆车需要完成什么样的任务。如果只需要完成高速公路的无人驾驶,类似Tesla 的AutoPilot 功能,那根本不需要用到激光传感器;如果你需要完成城区路段的无人驾驶,没有激光传感器,仅靠视觉是很困难的。无人驾驶系统工程师要以任务为导向,进行硬件的选择和成本控制。有点类似于组装一台计算机,给我一份需求,我就给你出一份配置单。

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

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

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

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

  工控机与汽车底盘的交互一定要通过专门的语言——CAN。从底盘获取当前车速及方向盘转角等信 息,需要解析底盘发到CAN总线上的数据;工控机通过传感器的信息计算得到方向盘转角以及期望车速后,也要通过 CAN卡将消息转码成底盘可以识别的信号,底盘进而做出响应。CAN卡可以直接安装在工控机中,然后通过外部接口与CAN总线相连。Apollo使用的CAN卡,型号为 ESD CAN-PCIe/402,如下图。

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

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

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

  激光传感器分为单线线万RMB,当然相应的检测效果也更好。比较知名的激光传感器提供商有美国的Velodyne和Quanergy,德国的Ibeo等。国内有速腾聚创和禾赛科技。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  推荐用一块单独的SSD安装Linux,或者使用虚拟机安装,最不推荐装双系统(不太稳定)奉上 Linux Ubuntu 14.04 安装包 + 虚拟机安装方法。(密码:147y。)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

回到顶部