自动驾驶系统是一个复杂的集成系统,涵盖了多个关键组件和模块,涉及的开发语言也不近相同。一般来说,自动驾驶系统包含环境感知、地图定位、决策规划、控制执行等多个算法模块的online(在线)系统,这些组件共同协作,使得自动驾驶系统能够感知周围环境、做出决策、规划路径并安全地控制车辆到达目的地。除了算法模块,online系统还包含人机交互、通信连接、状态监控、数据采集等模块,以给安全员和乘客提供必要的信息显示,在必要时为乘客提供紧急安全接管服务,并记录数据来保障研发迭代。
但是,online系统其实只是自动驾驶的一部分。为了支持高效的数据闭环与算法迭代,自动驾驶系统还有offline(离线)系统,它包含一系列承担不同功能的子系统。在自动驾驶公司,这套离线系统也被成为data pipeline(数据管道)或infra(基础设施,即infrastructure的简写)。以下是一些常见的offline系统组件:
- 地图与标注系统:对采集的原始地图信息进行手动或自动标注,创建包含道路几何、交叉口、标志、限速等信息的高精度地图;定期更新地图并向车端更新,以反映道路变化、施工、新建筑物等实时信息。
- 机器学习模型训练系统:使用大量路采或仿真数据,对感知模型、决策和规划模型进行训练,以不断优化检测、识别、分类、决策等机器学习算法模块的效果,并将训练得到的更佳参数快速更新到车端。
- 仿真测试系统:生成用于模型训练和评估的虚拟或增强数据集,以提高模型的鲁棒性;在虚拟环境中模拟各种驾驶场景,进行算法测试和验证,以大大降低路测成本和安全风险。
- 数据存储与管理系统:处理和存储来自各种传感器、算法模块的原始路测数据,将online和offline的数据、生产环境、无缝对接;存储和更新地图数据,确保其与实际道路情况一致。
- 车队管理与远程系统:完成订单管理、路线管理,实时监控路测中运行的车队车辆状态,在必要时由人远程接管。这些工具和系统在自动驾驶系统的开发生命周期中扮演着关键的角色,它们支持算法的高效迭代、数据的有效管理以及系统的不断优化。虽然这些组件不直接在车辆上运行,但它们对于自动驾驶系统的性能和可靠性起到了关键作用。因此,在考虑自动驾驶系统时,离线工具和系统也应被视为系统整体的一部分。
自动驾驶系统的常用编程语言
自动驾驶系统的online和offline系统会混合使用多种语言,以满足复杂多样的功能实现要求。具体的选择通常取决于性能要求、系统架构设计和开发团队偏好。
Online
车载计算平台的CPU、GPU和内存资源往往是有限的,所以在online系统中,出于性能和实时性的考虑,绝大多数模块都会用C++开发或部署。此外,Shell语言可能用于执行一些系统级别的任务和脚本。在涉及人机交互、数据传输的模块,也会使用Python。
Offline
在离线系统中,由于脱离了车载计算平台硬件资源的掣肘和安全性的约束,多种语言都会被使用:
- C++: C++用于开发高性能的组件,例如地图与标注、仿真测试等各个系统的核心组件往往是用C++开发。
- Python: Python在离线系统中广泛用于机器学习、深度学习和数据处理。Python也可以用于各个子系统的接口标准化,以提供全平台统一的服务。
- Javascript: offline系统需要为开发、测试、标注人员提供快捷易用的网络工具和界面,所以需要使用Javascript进行Web开发。这包括仿真工具的可视化界面、数据可视化以及其他与用户交互的多个工具。
- Java:Java在处理大规模数据和分布式计算方面具有良好的生态和应用。在自动驾驶系统的数据管理系统中,Java可能用于管理、调度离线数据等。
总体而言,不同语言具有不同的优势,但也可以明显看到,C++是自动驾驶中最广泛使用、重要性最高的语言,只靠python行走江湖的时代彻底结束了!C++是算法人员和开发人员必备的技能,也是量产的基石,永远绕不开的工具。
C++在自动驾驶中的重要性
近40 年以来,C++以其高性能、灵活、稳定和强大的底层支持而闻名。运行速度快、对硬件高效访问、可以实现复杂的计算和控制算法,因此始终是信息行业的热门语言。
自动驾驶系统的第一要求是安全和稳定,这也是为什么在自动驾驶系统中,C++几乎是最重要的编程语言。自动驾驶公司都有大批C++算法工程师,他们开发关键的软件模块,比如感知、定位、预测、控制、运动规划等,从算法优化到部署上车、从数据回收到仿真模拟,整个过程都离不开C++,因此熟练掌握C++成为从事自动驾驶研发大多数岗位的必备技能。现在的算法人员也已经从纯python和torch开发,逐渐要求掌握C++语言,更深入参与各类感知等子模块的调试开发。
深入了解C++,将使学习者能够更好地应对自动驾驶项目中的挑战,为行业发展贡献自己的力量,自己的职业发展道路更宽广。主流自动驾驶公司和车企在招聘算法工程师时,JD里面都要强调熟练使用C/C++,这就是门槛。下面某平台上的一些最新C++算法工程师的待遇,学好C++,绝对是一项物超所值的投资。
学习C++的难点和解决方案
尽管C++在自动驾驶行业中应用广泛,但许多学习者在学习C++时往往面临各种挑战。从语法规则到高级应用,如何快速掌握C++的关键知识点和思维方式,是每个C++初学者都会遇到的难题。如果还需要同时学习自动驾驶相关模块算法的知识,就更让初学者感到畏惧和艰难。
虽然很多人在学校里有机会学习C++,但学校的课程质量令人不敢恭维:
- 学校的C++编程课程过于注重语法知识的学习,而较少关注实际编码,导致学生对概念一知半解,一动手就迷糊;
- C++涉及面广,而学校的教学时间有限,所以学习往往碎片化,重要知识点无法系统地学习;
- 学校老师大多没有实际项目开发经验,很难将C++应用场景和实际工作需求结合,和自动驾驶结合就更加稀少;
- 许多学校还在使用着陈旧的教材与开发工具,往往落后实际应用一二十年,大量C++新特性没有涉及。
此外,网络上的C++课程汗牛充栋,良莠不齐。而且这些课程都更专注于C++本身的语法和特性,一般是面向通用领域,没有结合特定领域而展开,或者以互联网后端服务为主。相比之下,自动驾驶行业对C++有非常独特的需求,比如自动驾驶核心算法不需要考虑多机冗余和高并发, 而是涉及大量的数学运算、矩阵操作、图像处理等,需要利用C++进行高效的底层实现;自动驾驶还需要考虑系统架构、并发、硬件访问等问题,这需要工程化的C++编程思维。因此,虽然已经有大量C++课程,但依然缺乏面向自动驾驶领域、具备实战案例的C++课程。
通过与行业内多名资深C++工程师交流,结合学习的难点和痛点,我们推出了首个面向量产级的自动驾驶C++编程课程。本课程将帮助学习者克服这些难题,通过丰富的自动驾驶实例和项目实践,让C++变得更为亲近和易学。本课程会秉承“以终为始”的概念,所有案例均来源于自动驾驶行业,以丰富的自动驾驶项目案例,生动地讲解C++的概念和语法,使学员快速把握C++精髓。还将分享资深算法大咖的实战经验和工作感悟,帮助学员更加游刃有余地应对工作中的问题和规划自己的未来。