智能驾驶系统工程师学习路线
1 通信与硬件
-
Can总线。给一个dbc/arxml通信矩阵文件,打开它,可以讲清楚其中每个参数都是什么意思、是起什么作用的、什么情况下需要改它的配置(比如:波特率、采样点、BRS、Container PDU/Signal Group打包、网络管理报文格式、诊断报文格式)。会用Canoe软件,会自己写Capl脚本做一些简单的测试。
-
以太网。熟悉以太网的七层结构,对于IP/TCP/UDP这三个通用协议以及SomeIP/DoIP这两个车载协议,要知道里面的每个参数都是什么作用(比如:IP地址、端口号、服务ID),会用Wireshark或Canoe等工具进行以太网抓包解包。
-
其它通信总线协议,比如Lin/Flexray/SPI/UART/I2C/GMSL/PSI5,要做到:当别人提起这个名词时,你可以反应出"它是一种通信协议",并可以说出它的常用场景和带宽数量级。
-
了解常见的通信加密与安全性校验方法,比如CRC/RC校验、MD5/SHA校验、RSA加密、SecOC安全性通信等,粗略了解其数学原理与使用场景,知道哪些问题可能是因为通信校验没过引起的。
-
单片机与计算机原理。了解Flash/ROM/RAM是什么,定时器/中断/GPIO是什么,汇编语言/指令集/硬件加速是什么,可以简单讲出C语言是怎么转换成01二进制码在CPU中顺序执行的。自测方法:找一本单片机或微机原理的书,翻开目录,对每章每节标题中出现的术语,都可以用一两句自己的话来描述它是个什么东西、是干什么用的。
-
芯片。知道主流的车载芯片厂商有哪几家以及他们的热门产品有哪些(英飞凌/TI/NXP/地平线等),芯片的参数如何看(DMIPS/TOPS),如果是Arm架构芯片,还要知道A核/M核/R核都是什么东西。
附赠自动驾驶最全的学习资料和量产经验:链接
2 传感器
-
相机。相机的投影原理,相机标定需要标哪些参数(焦距/畸变),ISP是什么,ISP会影响哪些东西。
-
雷达。常见的三种雷达(超声波、毫米波、激光)的优缺点、通信方式、数据格式、数据带宽,了解主流的雷达产品供应商及他们的产品类别。
-
定位。这一块名词太多了,IMU、GPS、GNSS、RTK、WGS、ENU、NMEA、RTCM、PPS、GGA等等,都需要简单了解。
-
多传感器联合标定的目的(位姿、坐标系、欧拉角的概念),多传感器时间同步的目的与方法(主要就是PTP这个东西)。
3 整车
-
智驾系统与整车其它ECU交互的数据有哪些,其物理意义、单位、数量级分别是什么(给动力系统的扭矩请求、给制动系统的减速度请求与建压保压请求、给转向系统的角度或扭矩请求、给车门车灯挡位的状态请求等)。
-
整车网络架构,电源模式,Autosar标准中的Can网络管理(休眠唤醒),高压上下电流程。
-
UDS诊断(能看懂诊断报文,知道一个DID/DTC中包含哪些信息),了解软件刷新流程与OTA/FOTA/SOTA流程。
-
整车开发V模型、FuSa/SOTIF/ASIL、故障降级,基本概念都要懂。
4 软件原理
-
操作系统进程与线程、优先级、实时操作系统的概念。
-
Linux操作系统的常用命令行,文件结构。知道Linux系统根目录下哪些文件夹是系统自带不能改的,哪些是需要开发的。了解systemd,top与perf都是干什么的,了解shell基本语法,可以写或改运维脚本。
-
MCU方面,了解autosar cp的基本架构与常见的模块,比如dcm、dem、pdur、com、canif、rte等,知道这些模块是用来干什么的。
-
SOC方面,认真学习一款中间件,比如ROS2,深入了解node/msg/topic的概念,了解进程间通信是怎么做的(socket/共享内存),会自己写代码实现两个node间的通信,会去查看、分析node间交互的数据。(这个取决于公司的基建,不一定是ROS2,也可能是AutosarAP、CyberRT或自研中间件,但中间件的基本方法论都是相通的)。
-
深度学习方面,了解CUDA/TensorRT/OpenCV这些库都是干什么的。
-
规控方面,会简单使用Matlab,能看懂Simulink模型。
-
了解CI/CD和敏捷开发的概念、执行方法,会用公司的代码管理平台(Git或SVN)。
5 数学与算法原理
-
感知融合方面,CNN、Transformer这两个经典架构要了解,知道在数学层面这些模块是怎么计算的,知道一些经典网络(ResNet/UNet/BevFormer)的结构。
-
规划方面,Lattice和A*算法的基本原理。
-
控制方面,PID、LQR、MPC三大件。原理要清楚,公式要能看懂。
-
地图定位方面,EHP、EHR的基本概念,卡尔曼滤波,SLAM的基本概念。
6 C++
-
C语言的基础知识,比较容易忽略的是define和union这两个点,车载开发中挺常用的。
-
熟悉跨文件的函数声明与实现,能够快速的在巨大的工程里找到自己想看的函数,理清逻辑链路。
-
熟悉自己公司所使用的构建工具链,可能是cmake、bazel或conan,了解工程编译特别是交叉编译的流程,能够在巨大的代码目录下迅速找到入口地址(main函数)。
-
熟悉常见的stl容器,比如std::vector、std::map、std::deque,知道要如何定义、初始化、修改、插入、查找,知道在什么情况下要用什么样的容器。
-
智能指针与简单的模板。能看懂就行,别在这方面上钻牛角尖。
-
函数指针、lambda表达式、std::function与std::bind。"回调函数"这个概念非常常用,一定要理解。
-
会简单的分析C++报错信息,其实最主要的就两点,一个是出现"undefined symbol"的时候要瞬间想到可能是环境没配对,找不到库文件,另一个就是出现"core dump"直接软件不合格,打回去让开发重搞。
-
认识到"C++是学不完的",如果做系统,那就不要浪费太多的精力去钻研C++高级语法。手上常备一本C++工具书,随用随查就行。
7 其它小技能
-
强烈建议学一手python,可以在linux下写个脚本跑个小测试,也可以用pandas处理个数据,出报表。
-
笔记:公司有onenote的话比较推荐onenote,没有的话可以试试vscode+markdown,个人感觉很方便。
-
万能编辑器:vscode。免安装版,解压即用,从capl到markdown都能给整个语法高亮,txt都能自适应自动补全。
-
画图:drawio。有了它基本可以舍弃visio了。