欢迎关注公众号:内推君SIR,加微信:neituijunsir 加入自动驾驶交流群:聚焦 自动驾驶行业 招聘信息 /技术发展 /行业动态。
作者:叶小飞,UCLA PhD, 前奔驰无人车科学家
我在北美读硕士期间开始零基础自学无人驾驶与深度学习,用了两年半的时间便拿到了北美奔驰自动驾驶Senior的职位,根据我自学的经验,我认为学习自动驾驶一定要先从大局出发,再找局部深入。这个问题下的有些回答都是让新手们一上来先学一堆工具,或者开始直接上手OpenCV, 抑或者直接开始硬啃autoware/apollo代码,个人认为是不可取的。因为自动驾驶很杂,很大,单车智能从算法层面一般包含着感知、定位、规划、控制几大模块,偏工程一些的岗位基本是仿真和特定的功能开发, 如果上升到多车则还涉及到V2X、协同驾驶等话题,每个模块都work自动驾驶才能玩得转。所以如果要做一个合格的自动驾驶工程师,首先要对整个系统有个大概的了解,同时对这些模块都有了一些理解后,你才能从其中选出一个最感兴趣的模块进行深入研究,成为该领域的专家。个人认为题主想要自学无人驾驶,可以大致分为三大阶段。注:本回答主要针对无人驾驶软件开发方向, 适用于大多数专业,以下提到的大部分课程本人都亲自上过一遍,质量可以保证。
第一阶段:自动驾驶整体认知与基础知识储备
正如前文所讲,第一阶段首先是要对自动驾驶有个整体的认知,同时夯实自己的基础知识。所以这里我首先强烈推荐Udacity的一个课程(我在这里附上相关的课程代码) :
https://www.udacity.com/course/self-driving-car-engineer-nanodegree--nd0013
https://github.com/ndrplz/self-driving-car
这个课程虽然略贵,但是把感知、传感器融合、定位、规划和控制系统都cover了,而且每一章节都有相应的编程作业,整体比较硬核,很适合作为开篇。不过这个课程也不是一点基础也不需要,至少对python, C++与线性代数有一定的了解,如果你对这些没有了解,建议并行学习一下相关基础课程,这里我也给出了推荐:
Python课程:
网上有很多各种各样的python课程,我个人认为无论是什么python课程,你都没有必要从头学到尾,只要有个大概的概念,懂得基本用法就好,以后在实战中慢慢提升自己的代码水准。这里推荐一个B站的教程:
https://www.bilibili.com/video/BV1vA411b7Rn?spm_id_from=333.788.b_636f6d6d656e74.8
C++课程:
C++是一门你可能十年也没法真正“学完”的语言,它里面有各种各样花式的用法,入手难度是要大于Python的。所以,我认为在第一阶段懂得配置C++环境,大概了解Cmake机制,知道最基础的用法和一丁点高级用法足以。这里推荐Cousera上北大的课程,这门课讲的很清楚,也没有涉及过多复杂的东西,建议从头到尾上完。
https://www.coursera.org/learn/cpp-chengxu-sheji
线性代数课程:
线性代数基础在自动驾驶里面是至关重要的,这里推荐家喻户晓的MIT老爷子的线性代数课程,强烈建议从头到尾上完。
https://www.bilibili.com/video/BV1zx411g7gq?from=search&seid=13286266376574249805
看到这里,可能会有小伙伴说,自己基础很差,上面提到的课程都要恶补,应该是什么顺序呢?首先python课程比较简单,基本一周(最多两周)就可以有大概理解了,接下来便可以Udacity的无人驾驶课程+线性代数并行学习,到了后面几章会涉及C++,那个时候可以再开始学习C++课程。
上述几门课程全都学完后,还有两门课程基本也是必学的,一个是深度学习基础,另外一个是ROS开发。自动驾驶许多模块都涉及到深度学习,所以理解深度学习基础知识,会使用基本框架很重要。同时但凡搞Robotics的,都必须会ROS(机器人 *** 作系统),这里我也有推荐课程。
深度学习:
https://www.coursera.org/specializations/deep-learning
ROS:
ROS本身只是一门工具,没有必要投入过多时间学习,可以后面通过实战提升,所以我认为在这一阶段把官方tutorial过一遍即可。
http://wiki.ros.org/ROS/Tutorials
第一阶段小结:
如果你的基础较差,这一阶段的学习尤为重要,如果没有这些基础知识的支撑,很难后面提升到一个较高的层次。一般来说这一阶段大概花费6-8个月的时间,但如果你的时间较为紧张,有一定的基础,压缩到4-6个月也是有可能的.
第二阶段:实战训练+特定模块的进阶知识
到了这一阶段后,你对自动驾驶已经有了一个大概的认知,是时候选择一个特定的领域进行深入了。那么如何选择适合自己的领域呢?个人认为应该尽量抛开专业的限制,从兴趣+前景来选择。拿传统的车辆工程来说,一般课程设置十分广,但是都不深,大多数与自动驾驶最核心的软件开发无关,这个专业恐怕只有在控制方向相对有优势,但这样一来就限制很大了。
选好了你想深入的领域后,接下来就要做一些hands-on的项目,提高自己的实战水平。这一阶段找实战项目的方式有两个:第一个是找到相关领域的老师,在他的组下做项目。在老师底下做项目的好处是一般会有师兄师姐带,能有机会浏览大量的文献,写一定数量的代码,运气好的话还能发一两篇不错的论文,成为你以后拿面试的筹码。第二个是组队参加规模较大、较为正规的智能汽车相关的竞赛,这一种一般对你的工程能力的提升会有较大帮助。
在这一阶段除了多多实战外,还要同时注意增强你在你选择的领域的纵向知识。在这里我列了几个不同方向的优质网课,各位可以参考。
视觉感知方向
这一方向其实是属于计算机视觉分支,所以对计算机视觉的基础知识要掌握牢固,这里有一个推荐课程讲的比较全,也有详细的编程作业:
https://www.udacity.com/course/introduction-to-computer-vision--ud810
另外OpenCV也要玩的比较熟,推荐LearnOPENCV这个网站,里面有很多免费的OpenCV C++教程:
https://learnopencv.com/getting-started-with-opencv/
如果想做3D Lidar,那对PCL库的使用也要较为熟悉。除此之外,做这一方向还需要大量阅读文献与开源代码,对yolo object detection, 经典的图像分割算法, 比较火的vision transformer等等都要有所了解。
定位建图方向
说到定位和建图,一本不得不读的神作就是高博的《SLAM十四讲》,虽然SLAM目前主要还是在室内场景用的较多,但是里面包含了许多任何定位方式都会用到的基础知识,包括基本的相机模型、状态估计、非线性优化、图像特征匹配、滤波器等等。其实无论任何方向,我都强烈刷一遍这本书:
https://github.com/gaoxiang12/slambook
另外Cousera有一门网课专门讲比较传统的状态估计与定位(例如GPS+IMU+KF做定位),也是值得一刷:
https://www.coursera.org/learn/state-estimation-localization-self-driving-cars
决策规划方向
虽然学术界有很多fancy的文章来用深度学习做决策规划,但是在工业界这一块领域还是rule-based为主,若要走这一块可以上一下cousera的Motion Planning网课,然后多多关注多伦多大佬 Raquel Urtasun(一个长得超级帅的女老师)的文章,她有很多这个方向很前沿的文章。
https://www.coursera.org/learn/motion-planning-self-driving-cars
控制系统方向
这个可能是四大模块中我唯一没有怎么涉猎的模块,所以不能给出太多的意见。不过如果做学术想走这块要谨慎,有很多大佬告诉过我,这一块其实已经做的比较成熟了。
仿真方向
有不少工业界的大公司其实都有自己的仿真开发软件,但也有许多公司是基于开源的仿真软件。最近一段时间最流行的一款是CARLA仿真器,它支持自动驾驶全栈系统的开发,有环境渲染、传感器仿真,还可以制造交通流。如果对仿真特别感兴趣的,厚着脸皮推荐一下自己的系列课程:
https://zhuanlan.zhihu.com/p/338641593
https://github.com/DerrickXuNu/Learn-Carla
如果想知道如何在CARLA里开发全栈系统,使用联合仿真,甚至开发多车协同,那么强烈推荐我自己刚刚开发的一套基于CARLA-SUMO联合仿真的软件架构——OpenCDA:
https://github.com/ucla-mobility/OpenCDA
OpenCDA架构图
OpenCDA里自带感知、定位、规划、控制、V2X、协同变道、车队行驶的算法以及十几个测试场景,可以说搞懂了OpenCDA就等于搞懂了如何在CARLA仿真器里做完整的自动驾驶系统开发与场景测试。
其他的数学课程
无论你选择了自动驾驶哪个领域作为你的主攻方向, 这几門数学都是强烈建议上一下的。一个是凸优化, 另一个是概率课程。
https://www.bilibili.com/video/BV1ct411i7j3?from=search&seid=17496771310747785039
https://www.coursera.org/specializations/probabilistic-graphical-models
第二阶段小结:
这一阶段的核心在于提高你的上手能力,增加你在自动驾驶某一特定领域的知识深度, 一般来说需要大概一年的时间来做项目。
第三阶段 分水岭——找工向(实习+刷题)vs 读博向(Paper+暑研)
到了这一阶段,你大概已经进入了大三时期,这个时候你已经掌握了基础知识,并且实际做了些项目,此时最好做出个选择,是毕业后直接进入工业界工作,还是去读博深造,因为两者将会决定你接下来的两年该怎么过。
如果你是找工业界方向,那从现在开始就要准备申请实习,同时加强自己的代码能力。有一点要记住,无论你是什么专业,只要选择自动驾驶软件开发方向,你都要按照CS学生的标准要求自己,所以刷题准备面试很重要!在开始刷题之前,基础的算法与数据结构一定要上,另外很多公司爱问并行相关的内容,也一定要记得上一下,这里推荐两门相关课程:
https://www.coursera.org/specializations/data-structures-algorithms
https://developer.nvidia.com/udacity-cs344-intro-parallel-programming
LeetCode怎么刷我只有一个建议:尽量用C++完成所有的题目,因为搞自动驾驶十分看重你C++的技能。其他的方面我就不给予建议了,网上有很多教程。在你刷题的同时也可以开始找实习了,优先找内推,其次海投。
如果你铁了心想去读博,那么要首先了解一个残酷的现实:现在自动驾驶方向博士申请十分惨烈,我在申请博士时已经有了三年大厂工作经验,6篇论文,本硕背景也比较正统,还有一定的connection, 依旧是有许多拒信。现在申请博士各方面指标的重要排序是:Connection >> Paper > >其他指标。所以针对这一点,你在这一阶段要尽最大的努力找到去大牛实验室做研究的机会,好好表现自己,争取发出论文,就算大牛不留你下来,也愿意给你写推荐信,这个真的是至关重要。
总结
总结一下,我个人认为想成为一个优秀的自动驾驶软件开发工程师,需要满足以下几点:
对自动驾驶的核心模块有全面的了解
拥有良好的编程能力(尤其是C++与python)
有着不错的数学基础
在自己的擅长领域(例如决策规划、感知)有深度研究与开发经历
保持一颗热爱学习、无畏直前的赤子之心
祝题主和各位想入行的小伙伴们一切顺利!
来源:知乎点击 阅读原文 关注作者 知乎 ,了解更多自动驾驶知识,转发需获授权
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)