精华内容
下载资源
问答
  • apollo自动驾驶
    2022-04-17 19:54:38

    作为程序员,写一天代码胜过看十天代码,做以下几件事可以快速度过刚开始最痛苦的一个月。

    1、接收一个图像topic,在图像上画一个框,再发布一个新的topic,在cyber_visualizer里面显示出来。这个过程可以学到知识点包括:Bazel编译、BUILD文件、proto buffer通信、dag文件的编写。可以参考Apollo图像解压模块modules/drivers/tools/image_decompress/dag/image_decompress.dag,和说明文档docs/cyber/CyberRT_Quick_Start_cn.md

    # Define all coms in DAG streaming.
    module_config {
        module_library : "/apollo/bazel-bin/modules/drivers/tools/image_decompress/libimage_decompress.so" 
    
        components {
          class_name : "ImageDecompressComponent"
          config {
            name : "camera_rear_6mm_decompress"
            config_file_path : "/apollo/modules/drivers/tools/image_decompress/conf/camera_rear_6mm.pb.txt"
            readers {
              channel: "/apollo/sensor/camera/rear_6mm/image/compressed"
              pending_queue_size: 10
            }
          }
        }
    }
    
    

    (不插入一点代码,不能发布。。。。)

    2、把某个区域内的点云抠出来,发布一个新的topic,在cyber_visualizer里面显示出来。这个过程可以熟悉点云和激光坐标系。

    3、把2中的点云投影到图像上,发布一个新的topic,在cyber_visualizer里面显示出来。这个过程可以帮助理解相机内参和外参。

    4、用callback回调函数同时接两个不同频率的topic,比如,点云和apollo/localization/pose,分别存放在两个队列中,根据时间戳对齐,发布一个新的topic,再写一个函数接收这个topic,把对应的时间戳打印出来。

    某些具体操作可能需要找同事帮一下。

    更多相关内容
  • 进阶课程㊲丨Apollo自动驾驶架构介绍.pdf
  • Apollo自动驾驶源码

    2018-07-25 09:56:08
    百度Apollo自动驾驶演示版本源码。 安装步骤: 运行如下命令启动docker的release环境: bash docker/scripts/release_start.sh 运行如下命令进入docker的release环境: bash docker/scripts/release_into.sh 运行...
  • Apollo自动驾驶入门视频课程
  • Apollo自动驾驶入门课程第⑧讲 — 规划(下).pdf
  • 百度推出了Apollo自动驾驶平台,文件主要描述了Apollo自动驾驶的架构,安全保障等内容
  • 阿波罗Apollo)是百度发布的面向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和...

    Apollo项目介绍

    阿波罗(Apollo)是百度发布的面向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。

    阿波罗项目的官网地址如下:http://apollo.auto

    在阿波罗项目的官网,介绍了该项目有如下特点:

    开放能力:Apollo(阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。
    共享资源、加速创新:Apollo开放平台,为你提供技术领先、覆盖广、高自动化的高精地图服务;全球唯一开放,拥有海量数据的仿真引擎;全球开放数据量第一,基于深度学习自动驾驶算法End-to-End。
    持续共赢:Apollo开放平台,你可以更快地研发、测试和部署自动驾驶车辆。参与者越多,积累的行驶数据就越多。与封闭的系统相比,Apollo能以更快的速度成熟,让每个参与者得到更多的受益,同时Apollo平台也将在你的参与之下变得更好!
    目前,其官网上列出的合作伙伴已经接近100家。

    阿波罗项目的蓝图如下:

    • 2017-07:封闭场地的自动驾驶能力
    • 2017-12:在城市简单路况下的自动驾驶能力
    • 2020-12:高速公路和普通城市道路上的全自动驾驶

    最新发布的Apollo 2.5版本主要目标是L2级自动驾驶。

    详细的Apollo版本演进信息如下图所示:

    在这里插入图片描述阿布罗平台的开发包含下面几个步骤:

    1. 了解离线模拟引擎Dreamviewer和ApolloAuto核心软件模块
      (1)了解算法如何在汽车上运作
      (2)不需要使用真正的汽车或硬件,就立即开始开发

    2. 核心模块集成
      (1)Location模块
      (2)Perception模块:(支持第三方解决方案,如基于Mobileye ES4芯片的摄像头,用于L2开发)处理来自Lidar的点云数据,并根据请求返回分段对象信息。
      (3)Planning模块:计算微调路径,为路径服务的路径段提供汽车动态控制信息。
      (4)Routine模块:通过Navigator接口查找路径段的本地实现。

    3. 高精地图。L4级别的自动驾驶需要高精地图。由于自动驾驶汽车需要在系统中重建3D世界,因此参考对象坐标在重新定位地图和现实世界中的自动驾驶方面发挥着重要作用。

    4. 基于云的在线仿真驱动场景引擎和数据中心。
      (1)作为百度的合作伙伴,将被授予Docker证书来提交新图像并重播你在云上开发的算法。
      (2)创建和管理复杂的场景以模拟真实世界的驾驶体验

    自动驾驶的发展等级历史

    L1——辅助驾驶
    主要是纵向的对驾驶员进行辅助,例如车道偏离警告(LDW)、前碰预警(FCW)等,L1的车现在已经量产,很多汽车都带有碰撞预警系统。

    L2——半自动驾驶
    在L1的基础上又包含了横向的控制功能,通过车道控制系统、弯道行车系统等可以横向的辅助驾驶员行车,比如特斯拉的MODEL S。

    L3——高度自动驾驶
    是在某个特定的驾驶境下由系统对车辆进行驾驶和监控,全程通过自动驾驶进行操纵。只有系统检测行车环境时发现系统无法应对的问题,才需要驾驶员进行处理。L3目前还未能实现量产。

    L4——超高度自动驾驶
    全程都是由自动驾驶系统操纵。但有需要的话,驾驶员可以接管控制。

    L5——全自动驾驶
    可以在每个驾驶场景中(不局限与特定场景)完全自主驾驶。

    展开全文
  • 百度Apollo自动驾驶学习笔记

    千次阅读 2021-04-06 20:42:01
    本文是对百度Apollo自动驾驶的学习笔记。 最后更新:2021年4月6日 最后更新内容:Apollo进阶课程 ⑦ | 高精地图的采集与生产 目录 文章目录Apollo学习笔记概览拓展阅读:无人驾驶行业及Apollo 的Overview拓展阅读:...

    Apollo学习笔记

    作者:邹镇洪(清华大学车辆学院,个人主页

    转到Github项目主页查看持续更新
    转到Github项目主页查看持续更新
    转到Github项目主页查看持续更新

    本文是对百度Apollo自动驾驶的学习笔记。

    最后更新:2021年4月6日

    最后更新内容:Apollo进阶课程 ⑦ | 高精地图的采集与生产

    目录

    概览

    Apollo 技术框架由四个层面组成,参考车辆平台(线控车)、参考硬件平台、开源软件平台、云服务平台,其中主要模块包括高精度地图、定位、感知、预测、规划、控制等模块,而高精地图几乎支持着软件栈的所有其他模块,尤其是定位、感知、规划和决策。

    无人驾驶车包括五个核心部件,计算机视觉、传感器融合、定位、路径规划、控制。

    Apollo 开放式软件层分为三个子层,实时操作系统(RTOS)、运行时框架、应用程序模块层。Apollo RTOS是Ubuntu Linux 操作系统与Apollo 内核相互结合的成果。原始Ubuntu 系统并非实时操作系统,通过加入Apollo 设计的内核,我们可以使其成为一个RTOS。运行时框架是Apollo 的操作环境,是ROS 的定制版即机器人操作系统。为了使ROS 适应无人车,Apollo 团队改进了共享内存的功能和性能、去中心化和数据兼容性。

    拓展阅读:无人驾驶行业及Apollo 的Overview

    目前无人驾驶划分L1-L5 级别,L1 级别为定速巡航,有自动控制功能,以防范车祸;L2 级别为固定车道线,有大于2 个功能融合成无人控制的危险探测和响应系统;L3 级别主要为特定环境下无人驾驶,并判断是否恢复驾驶员模式;L4-L5 为完全无人驾驶阶段,可以探测环境并在任意环境下无人驾驶。

    作为其他计算模块的基础,Apollo 建立了高精地图,帮助自动驾驶解决系统性能问题,扩展传感器检测边界,主要应用在高精定位、环境感知、决策规划、仿真运行四大场景,帮助解决林荫道路GPS 信号弱、红绿灯的定位与感知以及十字路口复杂等导航难题。

    有了高精地图以后,做定位时,Apollo 主要依赖于GPS、RTK 基站、IMU、点云和视觉的融合方案,其中GPS 直接提供定位,RTK 修正定位精度,IMU 用于信号弱时对自身运动轨迹积分进行自我定位,后两者通过与环境交互进行即时定位。最终定位精度可以达到厘米级。

    1

    图1: Apollo 定位融合方案

    在Apollo 的路径规划中,首先需要车辆对路况有基本的判断,前方是否可停车、跟随、超车,侧方是否绕道等,从而确保车辆能够实现安全而高效的决策行驶。Apollo 采用了DP 算法来规划路径和速度,在生成一条可行驶的路径后,从起点开始,考虑避开路径中的所有障碍物,并且让加减速最为平顺,以最优的速度曲线(即t-s 平面中的绿色曲线)安全抵达终点,这也可以使用动态规划的思路求解。Apollo 将算法求解过程离散化。这样降低了受道路中心线的影响,适应了复杂路况。解决了decision 的基于规则优化的痛点。通过DP 速度算法逻辑,我们可以完成s,t 坐标系下的DP 规划。在此基础上,进一步做QP 优化和迭代调整,就可以得到有效的Planning 结果。当车辆有了控制信号之后,我们通过Can Bus 通讯协议中的DBC file 将信号传递给车辆的线控系统,实现油门、方向盘、换挡、转向灯等控制。

    2

    图2: Apollo 规划算法

    拓展阅读:拓展阅读:Apollo 开发说明

    代码架构

    Apollo 的github 介绍:Modules 是整个Apollo 所有模块的位置;Scripts 包括一些常用的操作工具
    脚本;Third-party 涉及到一些官方库,Tools 则包含一些工具。

    • 首先,由HDMap 支持的Localization 模块产生地图和定位信息,整个系统都以高精地图和定位信息为基
      础;
    • 接着,感知模块完成障碍物和红绿灯的识别;
    • 预测模块基于感知结果做障碍物的行为预测;
    • Planning 模块根据障碍物预测的结果和Routing 模块的信息做Trajectory 决策规划;
    • Control 模块根据Planning 的结果通过Canbus 模块控制车辆行驶。

    Apollo 系统是基于ROS 平台的。ROS 是大家在机器人领域非常熟悉的平台,我们达成了深入合作来降低开发者的门槛。ROS 的特点主要包括完整的开发工具包,完整的计算调度模型,还有众多的调试工具及已有的软件系统等。ROS 的通信是基于ROS Topic 的,Apollo 主要的ROS Topic 如图所示。开发者可以使用ROS 原生工具查看调试Apollo。

    开发流程

    首先开发者在本地开发机中基于Docker 开发算法,并部署依赖环境。接着将开发好的环境推到云端的私有Docker Repository 中。接下来在平台上挑选数据集,发起训练任务。Apollo 训练平台的云计算调度就会将任务调度到计算集群上执行。这个过程中,在云集群的内部,开发者的程序使用数据获取接口,从而获得自动驾驶数据仓库中的数据集。最终由业务管理框架将执行过程、评估的结果和Model 返回给可视化平台,完成可视化的调试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEq1mcpH-1617712880321)(/image-20210307104059602.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SgVclgcF-1617712880331)(/image-20210307104141783.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NziLVUlN-1617712880334)(/image-20210307104151523.png)]

    高精地图

    ”高精地图主要应用在高精定位、环境感知、决策规划、仿真运行四大场景,帮助解决林荫道路GPS 信号弱、红绿灯是定位与感知以及十字路口复杂等导航难题。”

    高精地图的特点:

    • 它包含了大量的驾驶辅助信息,最重要是包含道路网的精确三维表征,例如交叉路口布局和路标位置;
    • 包含很多语义信息,地图上可能会报告交通灯不同颜色的含义,也可能指示道路的速度限制,及左转车道开始的位置;
    • 能够达到厘米级的精度。

    高精地图的价值:

    • 高精地图能够给无人车很多预判的空间
    • 高精地图能够帮助无人车减少计算量
    • 当前L3/L4级别的电脑

    定位 首先车辆可能会寻找地标,我们可以使用从各类传感器收集的数据,车辆将其收集的数据与其在高精地图上的已知地标进行比较,这一匹配过程是需要预处理、坐标转换、数据融合的复杂过程。
    感知 传感器识别障碍物受到限制时,通过HD-map 辅助感知;另一个好处在于,高精地图可帮助传感器缩小检测范围。
    规划 高精地图可帮助车辆找到合适的行车空间,还可以帮助规划器确定不同的路线选择,来帮助预测模块预测道路上其他车辆将来的位置。如高精地图可帮助车辆识别车道的确切中心线,这样车辆可以尽可能地靠近中心行驶。在具有低速限制、人行横道或减速带的区域,高精地图可以使车辆能够提前查看并预先减速。如果前方有障碍物,车辆可能需要变道,可帮助车辆缩小选择范围,以便选择最佳方案。
    构建高精地图 Apollo 高精地图专为无人车设计,里面包含了道路定义、交叉路口、交通信号、车道规则,及用于汽车导航的其他元素;Apollo 高精地图采用了OpenDRIVE 格式,这是一种地图行业标准;高精度地图的构建由五个过程组成:数据采集、数据处理、对象检测、手动验证和地图发布。

    定位

    定位方法包括GPS 直接定位、传感器+ 地图匹配。

    GNSS RTK GPS 这类全球卫星定位系统统称GNSS,卫星和RTK 基站共同执行三角测量进行定位,其中RTK 用于修正卫星定位的误差。RTK的应用能让GPS的定位精度达到10厘米,但是RTK技术的应用有个限制,它要求基站与车的距离要在16公里以内。

    • 但由于电离层、反射作用等因素的干扰,GPS定位是有误差的,它的精度只能达到米级。(现在可以做到厘米级/分米级)
    • **GPS定位还有一个问题,它是跳动的。**为了抹平GPS的跳变,需要用到IMU(惯性导航),一般来说GPS和IMU是一块用的,GPS不停的去给IMU一个方向去校准,然后IMU再给GPS一个方向。
    • **无人车在接收不到GPS信号的情况下,需要用到另一个技术——几何定位。**几何定位的原理和GPS原理差不多,就是在道路上选几个feature,根据这些feature计算无人车所在的位置。目前比较流行的定位技术就是GPS、IMU和几何定位等一系列技术的融合。
    • Image

    惯性导航 IMU 是惯性测量单元,INS 是惯性导航系统。INS 中采用三轴加速度计来测量加速度,并通过陀螺仪将测量值转到全局坐标系下,而加速度计和陀螺仪是IMU 的重要组件。IMU 的更新频率达到1000Hz,因此可以实现即时定位。

    LiDAR定位 通过点云匹配对汽车进行定位:将LiDAR 采集的点云与高精地图进行匹配,其中一种方法是迭代最近点(ICP):对于第一次扫描中的每个点,需要找到另一次扫描中最接近的匹配点。最终会收到许多匹配点对,把每个点的距离误差相加,然后计算平均距离误差。假设我们对两次点云扫描进行匹配。我们的目标是通过点云旋转和平移来最大限度地降低这一平均距离误差,就可以在传感器扫描和地图之间找到匹配,将通过传感器扫描到的车辆位置转换为全球地图上的位置并计算出在地图上的精确位置。

    另一种方法是滤波算法,Apollo 使用了直方图滤波算法,该方法有时也被称为误差平方和算法(SSD)。为了应用直方图滤波,将通过传感器扫描的点云滑过地图上的每个位置,在每个位置上计算扫描的点与高精度地图上的对应点之间的误差或距离然后对误差的平方求和,求得的和越小扫描结果与地图之间的匹配越好。卡尔曼滤波是另一种LiDAR 定位方法,卡尔曼滤波用于根据我们在过去的状态和新的传感器测量结果预测我们当前的状态。LiDAR 定位的主要优势在于稳健性,只要从高精地图开始并且存在有效的传感器,就始终能够进行定位。主要缺点在于难以构建高精地图并使其保持最新。

    视觉定位 考虑粒子滤波算法(particle filter)。视觉定位的优点在于图像数据很容易获得,缺点在于缺乏三维信息和对三维地图的依赖。

    Apollo定位 Apollo 定位模块依赖于IMU、GPS、激光雷达、雷达、高精地图,这些传感器同时支持GNSS定位和LiDAR 定位,GNSS 定位输出位置和速度信息,LiDAR 定位输出位置和行进方向信息。融合框架通过卡尔曼滤波将这些输出结合在一起。卡尔曼滤波建立在两步预测测量周期之上,在Apollo 中,惯性导航解决方案用于卡尔曼滤波的预测步骤,GNSS 和LiDAR 定位用于卡尔曼滤波的测量结果更新步骤。

    image-20210307104943651

    感知

    四个核心任务:检测、分类、跟踪、语义分割。
    常用方法:机器学习、深度学习。Apollo 使用YOLO 网络来识别车道线和动态物体。
    其中摄像头适用于分类,激光雷达适用于障碍物检测,雷达的探测范围更大、适用场景更加鲁棒。

    CameraLiDARRadar
    测量原理图像由相机内的感光元件接收光线得到,彩色图像被构建为值的三维立方体,每个立方体都有高度、宽度和深度,深度为颜色通道数量。大多数彩色图像以三种颜色组合表示红色、绿色、蓝色,称为RGB 图像;使用红激光束,大多使用900 纳米光波长度的光源,但部分激光雷达使用的光波长度更长的1550,在雨雾中性能更好;当前的激光雷达使用旋转座架发射激光,扫描周边环境;激光脉冲触碰物体表面反射产生点云;使用无线电波,雷达波在坚硬表面会回弹,且可以通过多普勒效应来直接测量速度,
    适用任务分类;分割;定位;定位;障碍物检测;目标检测;相邻帧点云结合可以建图或者测速;适用于自适应巡航控制、盲点警告、碰撞警告和碰撞预防系统等;还可以生成环境的雷达地图,进而实现定位;
    优点信息密度大,可以执行高精度视觉任务;采样频率高达60Hz 以上,可以执行实时检测任务;密度比雷达高;可以提供反射率信息,从而区分物体;比相机适用的环境更鲁棒,且受天气影响更小雷达可以直接测量对象距离,无需在视线范围内也可以;可以看到其他车辆底部;可以测量速度;不容易受雨雾影响,视野宽阔,可达150 度,距离可达200 多米,
    缺点对光照条件敏感,对环境条件依赖性最大;密度相对相机更小,难以做高精度检测;相比雷达,受天气和传感器清洁程度影响也很大;传感器体积较大,难以和其他传感器一起安装;分辨率较低,尤其是在垂直方向,分辨率非常有限;来自静态物体的反射可能产生问题,产生雷达杂波,表现为某些静态小物体和动态大物体的反射波类似。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bk5fopR-1617712880339)(/2ed0af30e317e4122c3f17b9290bb34.jpg)]

    此外,传感器包含更多的类别和型号,

    如相机的性能区分包括:焦距、曝光、视场角(鱼眼、环视)、光谱(红外、多光谱)等

    激光雷达的性能区分包括:成像原理(机械式、prism rotate(可穿墙)、微偏振MEMS(混合固态)、固态、Flash)、分辨率(垂直、水平)、波长(905/1550)、视场角(水平/垂直)、扫描频率、探测距离(10%反射、最大反射)等

    Image

    MEMS工作规格:

    虹科cube-1 5-75m | 70° x 30° | 0.4° | 10Hz 50 条扫描线(可配置)

    虹科cube-range-1 5-150m | 12° x 10° | 0.24° | 10Hz 50 条扫描线(可配置)

    参考链接

    全面综述:一文带你了解激光雷达 - 虹科自动驾驶的文章 - 知乎 https://zhuanlan.zhihu.com/p/225639768

    MEMS混合固态激光雷达:廉价化激光雷达的希望:MEMS激光雷达 vs 固态激光雷达 | 系列之二 - 搜狐网
    https://m.sohu.com/a/131377884_114877?trans=010004_pcwzy

    OPA相控固态激光雷达:这或许是无人驾驶普及的关键——固态激光雷达详解 - 史高拔的文章 - 知乎 https://zhuanlan.zhihu.com/p/25131152

    Flash闪光激光雷达:TOF摄像机可以替代Flash激光雷达吗? - 吴建明wujianming的文章 - 知乎 https://zhuanlan.zhihu.com/p/146751368

    预测

    无人车在环境中为所有其他的物体做出预测,这些共同形成了在一段时间内的预测路径,在每一个时间段内会为每一辆汽车重新计算预测他们新生成的路径,这些预测路径为无人车在规划阶段做出决策提供了必要信息。

    预测路径的要求:实时性、准确性、能够学习并适应新的路面交互行为,这样才能保证算法的实用性和鲁棒性。

    现有的预测方法:基于模型,基于数据。基于模型的方法需要预先设置驾驶规则,以此计算各种事件的概率进行决策;基于数据的方法通过观察驾驶结果来修正模型,基于数据进行学习。Apollo 提供了一种基于车道系列的方法,将道路分割为不同的区域进行预测,模型更关注在区域之间的转换,而不是区域内的运动。主要考虑的目标有两个:(1)车道内障碍物的运动状态(2)目标转移车道。为此在训练中要加入(1)驾驶规则(2)经验驾驶行为(3)对应的真实场景下的驾驶行为。模型不仅学习了场景之间的转换,而且学习到了转换序列,在测试中该序列会表现为驾驶倾向。

    image-20210307105937492

    这里,RNN 和Markov Chains 是两种重要的序列预测模型。完成预测后(选择转移车道),还要需要借助约束条件筛选出合适的驾驶路径(选择转移路径)。

    规划

    地图路径规划

    本节是路径规划的总览,后两节将介绍具体的规划方法。

    路径规划 路径规划是指通过一定的规则,找到一条通过世界的路径来达到我们想去的地方。规划的第一步是路线导航,将地图数据作为输入和始末点,并输出A 点前往B 点的可行驶路径。为此,需要将地图“图形化”,转为只包含edge 和node 的graph,继而在其上建模。经典的查找算法有A*。

    A* 从初始节点开始,我们需要确定8 个相邻节点中,哪个是最有希望的候选节点。对于每个候选节点,我们考虑两件事情。首先,我们计算从开始节点到候选节点的成本。然后,我们估计从候选节点前往目的地的成本。计算前往候选节点的成本很容易,因为它已经与我们相邻。计算从候选节点到目的地的成本很困难。但是,通过简单计算从候选节点到目的地的距离,我们通常可以做出很好的估计。

    我们用变量g 和h 表示每个成本。g 值为开始节点前往候选节点的成本,h 值为候选节点前往目的地的估计成本或启发式成本。根据我们的具体情况,我们可以自定义成本估算方式。例如,交通堵塞会增加前往目的地的成本,所以交通繁忙的路径具有更高的成本。对于每个候选节点,我们通过添加g 值和h 值来计算总和,即f值。最佳候选节点是f 值最小的节点。每当我们抵达新节点时,我们通过重复此过程来选择下一个候选节点,而且总是选择我们尚未访问过且具有最小f 值的节点。这就是A* 算法,它建立了一条稳定前往目的地的路径。

    image-20210307110308637image-20210307110325441image-20210307110354617

    轨迹生成 轨迹包含的因素:一系列路径点、对应的时间戳和速度。

    轨迹生成的目标是生成一系列路径点所定义的轨迹。我们为每个路径点分配了一个时间戳和速度。由于移动的障碍物可能会暂时阻挡部分路段,轨迹中的每个路径点都有时间戳。我们可以将时间戳与预测模块的输出相结合,以确保我们计划通过时,轨迹上的每个路径点均未被占用。这些时间戳和空间上的两个维度(2D position)共同创建了一个三维轨迹(3D Trajectory)。我们还为每个路径点指定了一个速度,用于确保车辆按时到达每个路径点。

    规划需要考虑的因素:不发生碰撞、行驶平滑(舒适)、地图上可行且合法。考虑的方式:设计成本函数(cost function)。

    image-20210307110659975[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7YMkiRGF-1617712880343)(/image-20210307111021765.png)]

    image-20210307111036558

    轨迹考虑因素和成本函数

    Frenet 坐标系 相比于笛卡尔坐标系,Frenet 坐标系给出了更适用于道路积分的数据表示形式,详见微分几何中关于Frenet 坐标系的讲解。

    路径-速度解耦规划

    路径-速度解耦规划将轨迹规划分为两步:路径规划、速度规划。首先在路径规划步骤中生成候选曲线,这是车辆可行驶的路径。使用成本函数对每条路径进行评估,该函数包含平滑度、安全性、与车道中心的偏离以及开发者想要考虑的其他任何因素。然后按成本对路径进行排名并选择成本最低的路径。下一步是确定沿这条路线行进的速度。我们可能希望改变在该路径上的速度,所以真正需要选择的是与路径点相关的一系列速度,而不是单个速度。我们将该序列称作“速度曲线”。我们可以使用优化功能为路径选择受到各种限制的良好速度曲线。通过将路径和速度曲线相结合可构建车辆行驶轨迹。

    路径生成 首先将路段分割成单元,然后对这些单元格中的点进行随机采样,通过从每个单元格中取一个点并将点连接来创建候选路径。通过重复此过程可以构建多个候选路径。最后使用成本函数对这些路径进行评估并选择成本最低的路径。

    image-20210307111247249

    ST 图 选择路径后的下一步是选择与该路径关联的速度曲线,该曲线通过ST 图来可视化,其中“s”表示车辆的纵向位移、“t”表示时间,因此可以通过查看曲线的斜率从ST 图上推断速度。为了便于计算可以将ST 图离散化(网格化),从而降低求解难度。事实上,这也符合上述路径生成的离散采样过程。最后,为了获得平滑的控制曲线,只需在第一次规划的基础上进行二次规划即可,即对第一次的分段规划进行多项式拟合。

    image-20210307111326764

    Lattice 规划

    这是在Frenet 坐标系下的规划方法,目标是生成三维轨迹:纵向维度、横向维度、时间维度。这样会得到两个ST 图,分别对应了横向运动和纵向运动。

    将车辆的运动状态分为三类:巡航、跟随、停止。其中跟随较为困困难,需要对环境和车辆即时采样,并修正速度和加速度。为了确保稳定性,汽车驶向的终止状态应该与车道中心一致,车辆与车道对齐并直线行驶。

    一旦同时拥有了ST 和SL 轨迹,就需要将它们重新转换为笛卡尔坐标系。然后可以将它们相结合构建由二维路径点和一维时间戳组成的三维轨迹。

    image-20210307111436283 image-20210307111456958

    控制

    最基本的控制输入为转向、加速和制动。通常,控制器使用一系列路径点来接收轨迹。控制器的任务是使用控制输入让车辆通过这些路径点。

    • 首先,控制器必须准确,这意味着它应避免偏离目标轨迹,准确按照计划行驶。
    • 其次,控制策略对汽车应该具备物理意义上的可行性
    • 最后,需要考虑平稳度。舒适的驾驶非常重要,这意味着驱动必须是连续的,避免突然转向、加速或制动。

    总之,我们的目标是使用可行的控制输入,最大限度地降低与目标轨迹的偏差、最大限度地提供乘客的舒适度。有三种可用于实现这些目标的控制策略:比例积分微分控制(或PID)线性二次调节器(或LQR)模型预测控制(或MPC)

    控制器预计有两种输入:目标轨迹车辆状态。目标轨迹来自规划模块,在每个轨迹点,规划模块指定一个位置和参考速度。在每个时间戳都对轨迹进行更新。我们还需要了解车辆状态,车辆状态包括:通过本地化模块来计算的车辆位置、从车辆内部传感器获取的数据(如速度、转向和加速度)。我们使用这两个输入来计算目标轨迹与实际行进轨迹之间的偏差。

    控制器的输出是控制输入(转向、加速和制动)的值。当偏离目标轨迹时要纠正这种偏差,主要使用方向盘控制行驶方向(即转向)、使用油门加速、使用刹车减速(即制动),不同的控制算法都在计算这三个输出。

    PID控制

    这个控制器的优点在于它非常简单,只需要知道与目标轨迹有多大的偏离。PID的第一组件为P代表“比例” (Proportional)。设想一辆车正试图遵循目标轨迹,P控制器在车辆开始偏离时立即将其拉回目标轨迹。比例控制意味着,车辆偏离越远,控制器越难将其拉回目标轨迹。‘

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ul2JzdEq-1617712880345)(/640)]

    在实践中P控制器的一个问题在于,它很容易超出参考轨迹。当车辆越来越接近目标轨迹时,我们需要控制器更加稳定。PID控制器中的D项致力于使运动处于稳定状态,D代表“微分”(Derivative)。PD控制器类似于P控制器,它增加了一个阻尼项,可最大限度地减少控制器输出的变化速度。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-joypcNeJ-1617712880346)(/640)]

    PID控制器中的最后一项I代表积分(Integral),该项负责纠正车辆的任何系统性偏差。例如,转向可能失准,这可能造成恒定的转向偏移。在这种情况下,我们需要稍微向一侧转向以保持直行。为解决这一问题,控制器会对系统的累积误差进行惩罚。我们可以将P、I和D组件结合构成PID控制器。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nqeOZ1C-1617712880347)(/640)]

    PID控制器很简单,但它在很多情况下的效果很好。对于PID控制器,你只需要知道你的车辆与目标轨迹之间的偏差。但是PID控制器只是一种线性算法,对于非常复杂的系统而言,这是不够的。例如,为控制具有多个关节的四轴飞行器或机器人,我们需要建立机器人的物理模型。对无人驾驶而言,我们需要应用不同的PID控制器来控制转向和加速,这意味着很难将横向和纵向控制结合起来。另一个问题在于PID控制器依赖于实时误差测量,这意味着受到测量延迟限制时可能会失效。

    线性二次调节器

    线性二次调节器(Linear Quadratic Regulator 或LQR)是基于模型的控制器,它使用车辆的状态来使误差最小化。Apollo使用LQR进行横向控制。横向控制包含四个组件:横向误差、横向误差的变化率、朝向误差和朝向误差的变化率。变化率与导数相同,我们用变量名上面的一个点来代表。我们称这四个组件的集合为X,这个集合X捕获车辆的状态。除了状态之外,该车有三个控制输入:转向、加速和制动。我们将这个控制输入集合称为U。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYMjdgCr-1617712880348)(/640)]

    LQR处理线性控制,这种类型的模型可以用等式来表示(详见下图)。x(上方带点)=Ax+Bu,x(上方带点)向量是导数,或X向量的变化率。所以x点的每个分量只是x对应分量的导数。等式x点=Ax+Bu,该等式捕捉状态里的变化,即x点是如何受当前状态 x 和控制输入 u 的影响的。

    图片

    这个等式是线性的,因为我们用∆x来改变x时,并用∆u来改变u。x点的变化也会让这个等式成立(见下图等式)。现在我们了解了LQR中的L。

    图片

    接下来我们学习LQR中的Q。这里的目标是为了让误差最小化,但我们也希望尽可能少地使用控制输入。由于使用这些会有成本,例如:耗费气体或电力。为了尽量减少这些因素,我们可以保持误差的运行总和和控制输入的运行总和。当车往右转的特别厉害之际,添加到误差总和中。当控制输入将汽车往左侧转时,从控制输入总和中减去一点。然而,这种方法会导致问题。因为右侧的正误差只需将左侧的负误差消除即可。对控制输入来说也是如此。相反,我们可以让x和u与自身相乘,这样负值也会产生正平方,我们称这些为二次项。我们为这些项分配权重,并将它们加在一起。

    图片

    最优的u应该最小化二次项的和随时间的积分。在数学中我们将这个积分值称为成本函数(形式见下图)。我们经常以紧凑的矩阵形式表示加权二次项的总和。

    图片

    这里的Q和R代表x和u的权重集合。xT和uT是转置矩阵,这意味着它们几乎与x和u相同,只是重新排列以便矩阵相乘。x乘以xT,u乘以uT,实质上是将每个矩阵乘以它自己。最小化成本函数是一个复杂的过程,但通常我们可以依靠数值计算器为我们找到解决方案。在LQR中,控制方法被描述为u=-Kx。其中,K代表一个复杂的skeme,代表如何从x计算出u。所以找到一个最优的u就是找到一个最优的K。许多工具都可以轻松地用来解决K,尤其当你提供了模拟车辆物理特征的A、B,以及x和u的权重Q、R。

    模型预测控制(MPC)

    这是一种更复杂的控制器,它非常依赖于数学优化,但基本上可以将MPC归结为三个步骤:**1、建立车辆模型。2、使用优化引擎计算有限时间范围内的控制输入。****3、执行第一组控制输入。**MPC是一个重复过程,它着眼未来,计算一系列控制输入,并优化该序列。但控制器实际上只实现了序列中的第一组控制输入,然后控制器再次重复该循环。为什么我们不执行整个控制输入序列呢?那是因为我们只采用了近似测量与计算。如果实现了整个控制输入序列,实际产生的车辆状态与我们的模型有很大差异,最好在每个时间步不断地重新评估控制输入的最优序列。

    MPC的第一步为定义车辆模型,该模型近似于汽车的物理特性,该模型估计了假如将一组控制输入应用于车辆时会发生什么。接下来,我们决定MPC预测未来的能力。预测越深入,控制器就越精确,不过需要的时间也越长。所以,我们需要在准确度与快速获取结果之间做出取舍。获取结果的速度越快,越能快速地将控制输入应用到实际车辆中。

    图片

    下一步是将模型发送到搜索最佳控制输入的优化引擎。该优化引擎的工作原理是通过搜索密集数学空间来寻求最佳解决方案。为缩小搜索范围,优化引擎依赖于车辆模型的约束条件。

    优化引擎可间接评估控制输入,它通过使用以下方法对车辆轨迹进行建模:通过成本函数对轨迹进行评估。成本函数主要基于与目标轨迹的偏差;其次,基于其他因素,如加速度和提升旅客舒适度的措施。

    图片

    为使乘客感觉更舒适,对控制输入的调整应该很小。因为动作变化幅度过大会让乘客感到不舒服。根据具体情况,我们可能需要为其考虑进一步的成本,并设计成本函数。模型、约束和成本函数合并在一起,并作为优化问题加以解决。我们可以在不同的优化引擎中,选择一种来寻找最佳解决方案。

    整车系统架构

    硬件系统

    自动驾驶分为三大系统:感知、决策和控制,每个系统里有对应的硬件系统。

    感知系统分为汽车运动、环境感知和驾驶员监测三部分。

    车辆运动主要分为惯性导航、速度传感器、角度传感器和全球定位系统。

    环境感知主要分为激光雷达、超声波、摄像头、毫米波雷达、V2X。

    驾驶员监测主要分为摄像头和生物电传感。

    决策系统分为计算单元、T-BOX和黑匣子三部分。

    计算单元里是自动驾驶感知决策控制的算法。目前自动驾驶用的是X86结构的服务器或工控机。

    T-BOX即Telematics BOX,是车联网的通讯网关,它上接互联网下接CAN总线。例如手机上APP发送的开关门指令,都是通过T-BOX网关将操作指令发送到CAN总线来进行操控的。

    黑匣子是用来记录无人驾驶过程中所有的信息和状态。

    控制系统部分分为车辆控制和警告系统。

    车辆控制主要分为制动、转向、发动机和变速箱。警告系统主要分为声音、图像和震动 。

    以上是整个自动驾驶硬件系统的构架。

    自动驾驶汽车传感器的安装位置一般是:

    激光雷达是360°旋转的,所以它都是安装在车顶

    毫米波雷达的指向性很强,所以的它一般安装在前后保险杠上;

    考虑到车身在道路上的俯仰和姿态的干扰,所以组合导航系统一般是安装在两个后车轮的中轴线上;

    车身的360°都会安装摄像头

    Image

    L1、L2级别最怕的是传感器误检,例如正在开车时传感器发生误检,随后急刹车会让驾驶感受很差。L1、L2的算法会避免一定的误检率。L3以上关注的是传感器漏检,驾驶的主体是一个系统,一定不能让系统的传感器段出现漏检情况。

    自动驾驶车辆的安全制动距离:

    Image

    • 目前自动驾驶的整个系统反应时间会在500毫秒之内,车辆制动是液压需要0.3~0.5秒,卡车用的气刹需要0.8秒。(2017年数据)

    • 目前市面上在售车,绝大多数都是低于这个技术指标,说明在售车性能都很好。从目前来看,对于传感器的要求,能测到150米已足够。(2017年数据)

    • Image

    • 激光雷达的两束线的角度之间有一个物体, 正好处于检测边缘它会产生一定的漏检,除以2是为了保证在每一个角度上都不会产生漏检

      在0.4°这个分辨率之下我们在100米外其实就可以检测到一个人、车或骑行者。

      在0.1°这个分辨率之下我们在400米外其实就可以检测到一个人、车或骑行者。

      但是能检测到并不意味着自动驾驶系统能识别出来,只有一条线的这种成像或者低分辨率的成像,自动驾驶还是识别不了。

      目前百度Apollo平台,我们在同一车上用激光雷达4到5根线才可以很好地对障碍物进行分类。

      现在像Velodyne 64线的激光雷达,0.4°分辨率下他的物体感知距离是50米

    • 现有市面上的激光雷达介绍:

      厂家型号线束10%距离FOV分辨率频率波长功耗价格
      Velodynealpha prime128300m360/400.2/0.15-2090326W

    标准

    功能安全

    ISO-26262标准

    安全开发流程

    从自动驾驶研发的流程角度看,大致可以分为以下4个步骤:

    软件在环 软件在环是基于仿真和模拟的软件仿真,类似于赛车类游戏。即是在软件系统里仿真模拟出真实的道路环境如光照、天气等自然环境,开发者可将自动驾驶代码开发完毕后,在仿真系统内运行,测试是否可以实现目标。

    硬件在环 硬件在环是基于必要的硬件平台。在第一步的软件仿真结束后,将所有的仿真结果与传感器、计算单元集合在一起,在硬件环境里测试。

    车辆在环 车辆在环是基于车辆执行。在第二步硬件环境里测试完成后实施的第三步,即