首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何凭一己之力打造一款自动驾驶高精地图引擎

这两年来自动驾驶可以说是搞得风生水起,而高精地图基本上是L3以上级别自动驾驶的标配了,这一期我们就来尝试就只靠自己搭建一款自动驾驶高精地图引擎。

又是自动驾驶,又是高精地图,又是啥引擎,尽管看着花里胡哨的,但你没有听错,只需要一个人一台电脑就可以开始了!

废话不多说,先上程序运行过程的功能动图

1. 酷炫的可视化效果

高精地图的信息通过实时建模渲染的方式进行3D效果呈现,观察视角可360°自由旋转,并配有雷达图和实时视频,轻松验证地图数据。

2. 丰富的交互信息显示

可以通过对物体对象进行点击的方式获取对象信息,还可以加载不同的显示场景以应对不同的需求,让显示界面更加简洁,信息更有针对性。

3. 参数化动力学+运动学模型

基于游戏引擎的汽车动力学和运动学模型,我们可以直接在界面上进行在线调参,在进行算法验证的时候会十分便利。

4. 多传感器融合定位

基于GPS+IMU得到惯导的定位结果后,再结合视觉的车道线信息和雷达的探测结果,完成地图匹配之后,对定位结果和车身姿态进行矫正和补偿。

5. 环境感知强化

感知信息可以补偿地图定位结果,地图信息也可以反向强化感知能力。如上图所示,参考地图提供的道路施工信息,结合视觉和雷达的探测结果,对地图静态物体进行差分后可强化识别交通路障。

6. 行为预测+决策

基于高精地图可以做很多应用开发,比如纵/横坡制动,弯道限速,还有如上图示例的路径规划,其中绿色闪烁的部分就是规划的车道级路径,基于此还可开发自动变道+超车功能。

7. 跨平台仿真测试

算法验证一般用Matlab比较方便,底层代码基本都是C/C++,Unity的脚本语言又是C#,做仿真就需要跨平台通信,这里我们采用的是以太网和共享内存的方式,上一期Protobuf的内容可以派上用场啦!

8. GroundTruth Labeling

做过机器学习的同学都应该有被对打标签和建训练集支配过的恐惧,这里采用AR显示的模式,对现实图像和虚拟世界进行了重叠,可以很方便大家打GroundTruth标签。这个功能主要是用来评估地图数据的准确性的,结合第9个功能食用风味更佳!

9. 自动化数据分析

这个功能可以说是测试工程师的福音了,在看log的时候,发现的任何问题都可以通过打标签的方式选择归类,注明原因,然后系统会将这一系列标签生成XML文件,并由这个XML导出生成HTML报告。然后软件排问题的时候可以加载这个XML文件,就可以直接定位到出错的地方,然后再添加评论说明,重新生成XML导出报告。

且先不说功能,单论颜值,咱实时运行的可视化显示可就不输某些大厂的CG特效宣传画面。

如果做出来的应用不够炫酷,看着不够顺眼,那如何能吸引用户使用。如果开发出来的程序不能用来装逼,那将毫无意义。

但在我们的这次学习中:从界面布局到UI美化,从3D建模到实时渲染,从算法设计到代码实现,从交互方式到用户体验,从软件架构到任务调度,从信号接口到底层数据库,从CPU开销到内存管理,从最开始的第一行代码到最终的程序发布,你都可以参与设计,验证,优化和整合。

你可以尽情体验一把从前端、美工、架构、算法、软件、底层、后端到产品经理之间的所有角色,是不是很激动!

程序基本信息

操作系统:Windows

开发平台:Unity

输入接口:以太网/CAN/USB串口

输入数据:感知/Camera/RTK/IMU

仿真交互方式:以太网/共享内存

底层数据库:SQLite

地图数据格式:ADAS_V3/OpenDrive

输出文档:XML/HTML

软件架构图

其实就是以输入层,解析层,应用层,数据库层,显示层和输出层来划分的,我们会重点来学习显示层和应用层的内容,因为这些知识最具有普适性,大家都能用得上。

Q & A

1.为什么要开发这套程序?

对于想学习自动驾驶的小伙伴们来说,高精地图是一个很好的切入点:

第一是高精地图在以后自动驾驶中将起到举足轻重的作用,现在的感知技术受限于硬件成本和算法能力将逐渐陷入瓶颈,而高精地图的加入将从另一个维度强化感知能力,并且随着5G的普及,高精地图可以部署在服务器端,那么其边际成本将会是0。

第二是高精地图上手比较简单,本质上高精地图也只是一种地图而已,我们可以先从调用Google Map的API开始学起,而且开发文档也比较丰富。

第三是学习成本比较低,大家都有电脑,手机里也有GPS,利用这两台设备我们就可以开发最基本的地图应用程序了,而且网上有很多免费的地图数据库。

2.为什么要用Unity这款游戏引擎?

用游戏引擎来辅助做自动驾驶开发的原因是资源比较丰富,像《极品飞车》系列和《GTA》系列赛车游戏大家都比较熟悉,仿真程度很高,很多技术我们可以直接拿过来借用。而且游戏引擎的物理系统很强大,插件也很丰富,很多资源的源码网上都扒得到,移植便利。

那为什么选Unity呢?之前我也有考虑过Unreal,因为CARLA这款开源的自动驾驶仿真软件是基于UE4开发的,而且Matlab也是和UE4搞的联合仿真。但是Unreal的蓝图设计对程序员真的很不友好,而且国内也还是Unity用的人多,网上找问题也方便些,两边都学了一下之后还是最终选择了Unity。

我之前也开发过基于Winform和WPF的高精地图测试工具,要做很多画面上的优化,但是用上Unity了之后就有了一种鸟枪换炮的感觉,再也不用操心画面卡顿了。

3. 为什么不基于已有的技术进行开发?

像百度的Apollo平台,或者ROS都有一个比较完善的生态系统,里面也提供了类似的技术,为什么不站在巨人的肩膀上进行开发呢?

因为不好用。再好东西,也要看是不是适合自己。很多需求不是能正好能一一对应的起来,去适配信号也需要花费大量的时间,有时候真还不如自己写一个。而且基于别人的平台,看起来很高级,但是说白了就是调库和调参,对个人发展来说,长此以往不见得是好事情。

另外我个人对于CarMaker这类一个license要价几百万的仿真软件深恶痛绝,怎么不去抢呢?学习成本高还贵的要死,像用我们这套程序把车开出去溜一圈仿真环境就自动生成好了,不用自己搭建场景,这才是人性化服务啊!

4.这套程序有什么优势?

自吹一下,这套程序最大的优势就是我是站在一线苦力人员的视角进行设计和开发的,比较走心。不设计算法不知道优化的苦,不写代码不知道debug的泪,不做测试不知道写报告的烦,不去标定不知道调参的哀怨,不在一线搬砖的肯定不知道底层人民有多么卑微!

这里面的每一项功能,都是为了解决实际中的问题而设计的,都有着对应的需求。刚开始写算法需要验证,我就搭了个仿真环境;代码写完了需要先在台架上试一试,我就写了个测试脚本;实车测试的时候不好看运行效果,只好又做了个可视化工具;功能出了问题需要复现,又得写录数据的工具,还得写回放工具;记录的信号数据太多,只得自己写数据分析的脚本;回放数据的时候发现问题,不方便记录,只能做一个打标签的功能;一堆标签数据又不好看,干脆就做了个自动生成HTML报告的应用......

我也不是闲着没事儿一拍脑袋就开发了这么个程序,而是从一个很小的需求出发,经过不断的版本升级迭代,不断的融入新功能并进行整合,才有了现在大家看到的样子。

5. 通过这期学习大家能获得哪些知识。

其实很多基础知识都已经列在上一篇公众号的年度总结里面了,讲高精地图肯定会给大家科普一些地图的基础知识。因为我们不光要处理以太网数据,还是要给大家讲讲其它的通信方式。围绕算法我们就说说几种常见的插值方式,卡尔曼滤波,路径规划等等,不会太深入。剩下的基本上都是以Unity为核心,讲讲游戏开发的一些知识。一些需要用到的工具,如Photoshop,3Ds Max等我们也可以讲讲少量基本的操作。在未来H5应用可能会取代现在的APP成为主流,所以我们要用到的XML和HTML标记语言也可以重点讲讲。

6. 开发大概需要多长时间

所有的代码我都是在下班和周末时间完成的,不然大家也看不到这篇文章。前后大概花费了小半年的休息时间吧。大家如果看我的文章学习,可以少踩很多坑,如果更新及时,全部实现可能三个月就做出来了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200526A0A4RE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券