基于Unity的自动驾驶模拟总结(Apollo)

什么是Apollo平台

  • 阿波罗是百度的全栈开放开源的自动驾驶软件平台。
    在这里插入图片描述
  • 上图是Apollo 3.5版本的架构图,我们可以看到阿波罗是从下往上的全栈式的平台,从硬件到各种感知器,到我们自主开发的Cyber实时操作系统,再到上面自动驾驶所有模块,从地图、定位、感知、规划、控制、人机交互各种模块。最顶层是云端的各种服务。我们可以看到云端各种服务里面有一个是Simulation,也就是自动驾驶的仿真,这是阿波罗的自动驾驶仿真。

为什么使用游戏引擎开发自动驾驶的仿真

  • 首先仿真的目的是为自动驾驶开发、测试、评估提供一个高效的环境。
  • 如果我们完全基于路况进行测试,很多情况是很难遇见的。例如在硅谷,基本上从来不会下雪,我们就很难测试下雪或多雾的天气。另外还有一些极端的情况,各种交通流不是说想碰就可以碰到的,我们都可以通过仿真来模拟这些情况。
  • 最主要原因是游戏引擎可以帮我们高效的产生一个全栈的闭环的仿真,尤其在感知模块的仿真。如果使用游戏引擎创建一个赛车游戏,我们可以重构一个三维环境,在三维环境里面模拟相机,激光雷达等各种输入信号。
  • 当我们使用游戏引擎进行仿真,我们拥有所有的信息,可以输出最准确的真值来供它们进行训练。我们可以动态改变这个世界,可以有不同的时间、不同的天气、不同的路况,这些在仿真里都很容易实现。
    在这里插入图片描述
  • 上图是我们使用游戏引擎仿真的结果,可以看到我们使用不同方式的渲染,可以得到深度图像和语义分割,我们可以知道哪里是车,哪里是路,哪里是建筑物。我们可以很容易分割出不同的语义并得到不同的真值。
  • 我们模拟不同路况,一些标志线看不清楚、路面开裂的情况,还有模拟不同天气的情况,这就是游戏引擎的强大功能所在。
  • 当然游戏引擎开发仿真还有很多挑战,最大的挑战就是如何来建一个高效的真实场景?
  • 这个真实的场景可以是真实世界的重构,也可以是虚拟的完全人造的场景,例如是游戏虚拟的未来世界或外星世界的场景。我们现在使用二种方式进行处理,一个是手工通过我们的美术来创建,另一个是通过自动化的方式。对于真实世界来说,就是通过数据驱动的方式,我们从真实世界采集一些数据,然后利用人工智能数据驱动方式来自动、全自动、半自动来重构真实世界的场景。

为什么使用Unity来开发阿波罗的仿真

我们看重Unity主要有以下几个原因:

  • Unity有很好的生态系统。Unity有很好的社区,我们可以得到各种问题的反馈。
  • Unity有很完善的Asset Store资源商店,我们可以重用第三方的很多工具,不用一切从头开始,从头造轮子。
  • Unity有很高效的图形渲染系统,我们可以实时渲染出逼真的图像。
  • Unity的性能现在也越来越好了,在云端加速,GPU加速方面都可以给我们提供很大的帮助。
  • 最后一点,也是很重要的一点就是,Unity是一个传统的游戏引擎,但现在Unity也越来越看重汽车工业,其中也包括自动驾驶领域。Unity最近还推出了自动驾驶的工具包,这也是我们和Unity合作的一个重要原因。

如何在Unity中重构虚拟世界

  • 使用了Unity推荐的摄影制图法工作流程,就是通过拍摄真实世界的图像,然后通过图像重构真实世界。
    在这里插入图片描述
  • 我们先通过高精度的数码相机拍摄大量的图像,然后使用的是Reality Capture,从图像重构出三维模型。
  • 三维模型是很复杂的,所以我们使用Maya或Instant Mesh来对模型进行简化,然后使用xNormal、Substance Designer等软件将这些模型的纹理贴到模型上。我们使用Unity或Substance Painter来对模型进行进一步的清理,最终在Unity中使用。
  • 下面是一个简单的例子。我们先拍摄一个树干的模型,保证不同的图片之间有足够的重叠,这样软件可以找到相同的特征点,将图片进行对齐,生成点云。点云进一步三角化,生成网格,同时生成模型。
    在这里插入图片描述- 但这样生成的网格是非常复杂的,很可能是几十万到上百万三角片,我们没法直接拿来使用。所以我们要重构它的拓扑结构,把它大大简化。但同时我们通过Normal Map方式保留尽可能多的细节。
    在这里插入图片描述
  • 例如,下图的树干是一个复杂的模型,简化过的模型,我们可以看到只有很少的三角面片,但是通过Normal Map的情况,我们还是保留了足够多的细节。
  • 通过这种方式建立的三维场景,然后再结合Unity高精度的渲染,这样渲染出的场景是跟真实相机拍摄的相差无几。
    在这里插入图片描述
  • 我们可以看到下图实际是百度美国研发中心门前的一条路,左侧是我们渲染的场景,右边则是用真实相机拍摄的,效果非常逼真。
    在这里插入图片描述
  • 通过摄影制图法,我们可以高精度地重构现实中的三维世界。但是这个还不够,因为我们不可能重构所有的内容,我们还需要参考一些文档来建一些现实中的路况标志物和红绿灯这类东西。
  • 因为我们拍照片的时候,有可能是白天、晴天,但是我们还需要模拟阴天、夜晚的情况,所以我们还需要采集各种光照条件。我们还需要用HDR高动态图形渲染方式来达到更逼真的渲染效果。
  • Unity提供了一个HDRP高清晰渲染管线,但是我们目前还没有能够使用它,原因是因为我们使用了Asset Store资源商店中一些不兼容HDRP的第三方软件,当这些软件跟HDRP兼容时,我们也会进行更新为HDRP。
    在这里插入图片描述
    我们主要使用的第三方软件是:
  • Enviro,它可以帮我们动态地模拟各种天气,雨雪、雾等天气,还有不同的时间,白天黑夜的转换。
  • Gaia和CTS,它们可以帮我们动态高效地建立更多的地形。
  • EasyRoads3D,它可以帮我们在地形上动态地加载各种建筑物、植物等环境元素。
    在这里插入图片描述
  • Unity也发布了SimViz,它是专为自动驾驶而使用的工具包,我们重用了SimViz中的场景来进行一些单元测试,这可以让我们很快地在一天之内做一些小的单元测试。
    在这里插入图片描述
  • 下图左侧是一个十字路口,右侧是一个三车道的直路,这些场景都是来自SimViz工具包。
    在这里插入图片描述
  • 当然提到场景,自动驾驶毕竟跟游戏不一样,游戏三维场景可能就是前面提到的内容,但自动驾驶还有一项更重要:路网的构造。
  • EasyRoads3D的初衷就是为游戏的路网而开发。它创建的路网还不够复杂,因为我们需要从路网导出高精地图,给我们的自动驾驶软件来使用。
  • 我们不仅需要知道每一条路,而且需要知道每条路里的各个车道线和这些车道线的连接关系、红绿灯、各种交通标志的位置,所以我们需要更加高效的路网创建软件。
  • 我们可能第一个想法是:在现实中,市政施工人员是用什么软件来设计的。
  • 下图中的软件是建设真正道路的人使用的三维软件。
    在这里插入图片描述
  • 但是我们衡量之后发现,这些软件并不是为游戏或三维渲染引擎而设计的,所以它们有大量功能是我们用不到的。当然还有一些公司使用Houdini来制作。
  • 我们目前使用的是RoadRunner,它由VectorZero来开发的。这个软件的功能非常强大,它可以很轻易地编辑各种复杂的路网。
  • RoadRunner有一个很重要的功能是:它可以导出OpenDRIVE的地图格式,OpenDRIVE是现在比较通用的高精地图格式。我们可以使用脚本把OpenDRIVE地图格式转化成百度阿波罗的高精地图格式。
  • 下面是我们使用RoadRunner设计的复杂路口的示意图。我们可以看到,这种路口如果用普通三维软件做会耗费大量的时间。
    在这里插入图片描述
  • 我们不仅需要每个路有不同车道,还需要这些车道的连接关系。哪个车道能转向哪个车道,哪个车道不能转向哪个车道,这些连接关系RoadRunner都可以帮我们生成,这对自动驾驶模拟是非常重要的。
    在这里插入图片描述
  • 还有下图这样复杂的转盘路和多层的立交桥,RoadRunner都可以支持。
    在这里插入图片描述
  • 即使有上述这些所有的工具帮忙,生成这些三维环境的时候还有一个问题:工作量和数据量。
  • 我们生成一平方公里的区域可能还是可以的,但是我们不可能生成一个几百平方公里,甚至几千平方公里的大城市。所以我们从真实世界开始,但是对真实世界做了简化,因为很多时候不需要生成整个真实世界的路网。
  • 例如,一条高速公路可能有10公里都是很简单的路况,但是到了一些上下闸道,到了一些路口,这些路口是比较复杂的。那么我们只需要把复杂的路口挑选出来,中间简单的路网我们可以大大缩短,用很短的路把这些复杂路口联系起来。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章