链接:https://www.zhihu.com/question/46575222/answer/874715486
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、前言
首先在研究自动驾驶的算法知识前,很有必要在这里说明一下:
自动驾驶其实包括很多的算法研究方向的。
(欢迎加入自动驾驶QQ群:958152035)
自动驾驶是一个很大很大的方向,就像本科的专业一样,而当你读研究生之后,本科的专业又会细分很多方向。一个人不可能把所以的自动驾驶算法方向都搞定,太难了!!所以只需要选定一个方向,不断去研究深耕就行了。
那到底有哪些算法方向呢,下面慢慢道来:
二、自动驾驶算法研究方向
自动驾驶的主要算法研究方向有以下几个:
1.自动驾驶SLAM算法工程师
首先解释一下这个方向是干什么的,SLAM英文全名叫simultaneous localization and mapping,中文名叫同步定位与建图。可以看一下下面的百度百科的解释。
https://baike.baidu.com/item/SLAM/7661974?fr=aladdinbaike.baidu.comSLAM算法属于感知—规划—控制中的感知类算法。该算法主要用于自动驾驶车辆的根据点云数据对车辆周围环境的地图构建。而其中的点云数据是由两种传感器来进行采集的,包括激光雷达和摄像头,所以SLAM算法其实又分了两大方向:
视觉SLAM算法(VSLAM)和激光SLAM算法(Lidar SLAM)。
哈哈哈,看到了吗,SLAM算法又分了两大类算法方向,所以又细分了两个岗位:
(1)激光SLAM算法工程师
关于激光SLAM的效果,可以看下面的视频,激光SLAM的传感器即为激光雷达,视频中花花绿绿的就是激光雷达的点云数据了,然后对周围环境进行地图构建:
<iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1179024542395224064?autoplay=false&useMSE=" width="320"></iframe> 激光SLAM(视频来源于腾讯视频)♥激光SLAM所需要学习的知识
操作系统:Linux
编程:使用c、c++、matlab一种或多种语言(matlab不是很建议)
理论:需要学习很多滤波算法,如:ESKF、EKF、UKF等。同时需要学习G2O、ceres等用来优化非线性误差函数的c++框架。
(2)视觉SLAM算法工程师
关于视觉SLAM的效果,可以看下面的视频。视觉SLAM中的传感器即为摄像头,摄像头如果使用深度相机,可以直接获取障碍物的距离,生成点云数据。当然也有用单目、双目、鱼眼摄像机的 视觉SLAM ,这些摄像头需要用其他的方法才能间接的获取周围障碍物的距离。
<iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1178987689675833344?autoplay=false&useMSE=" width="320"></iframe> 视觉SLAM(视频来源于腾讯视频)♥视觉SLAM所需要学习的知识:
操作系统:Linux
编程:c、c++
理论:学习常用的vSLAM算法,如ORB-SLAM、SVO、DSO、MonoSLAM,VINS以及RGB-D等;ROS机器人操作系统;还需要学习很多滤波算法,如:ESKF、EKF、UKF等。同时需要学习G2O、ceres等用来优化非线性误差函数的c++框架。
♥视觉SLAM学习资料推荐
入门级神书《视觉SLAM十四讲》,书的作者大佬也在知乎
@半闲居士 ,要学习的快去关注一波吧,同时大佬在B站上直播过相关SLAM十四讲的课程,可以去搜索一下,如果想要B站直播课云盘的,在这链接里:https://pan.baidu.com/s/1hH3LN_Hox2kATqqLKYFoFA 提取码:ftik 。本书作者也在深蓝学院有过培训课程,根据自己的需求可以去看看他的付费课程。
目前激光 SLAM 是比较成熟的定位导航方案,但其传感器价格昂贵,我们知道汽车是一个量产的东西,如果成本降不下来,其也会有很大的阻力,目前特斯拉等公司已经放弃了激光雷达的方案,采用纯视觉的自动驾驶方案。
在实际的自动驾驶车辆上,SLAM 其实是需要多个传感器进行融合的,取长补短,比如GPS、IMU(惯性导航)等传感器融合的方案,所以自动驾驶算法方向又出现了下面的一个新的岗位:☟
(3)自动驾驶多传感器融合算法工程师
看一下该方向的行业要求:
掌握camera、毫米波雷达、激光雷达、惯性导航等相关数据解析融合算法;熟悉感知融合算法发展趋势,有神经网络等人工智能开发背景者优先。(来源:华为技术有限公司招聘信息)
很明显,数据融合要求更高,既包括前面激光SLAM和视觉SLAM,同时还需要掌握其他传感器的用法,所以这个方向难度不小,所涉及的知识非常多。
2.自动驾驶决策算法工程师
自动驾驶的决策是指给将知模块传递的信息,如何决策汽车的行为达到驾驶的目标。例如,汽车加速、减速、左转、右转、换道、超车都是决策模块的输出。决策需要考虑到汽车的安全性和舒适性,保证尽快到达目标地点,还需要在旁边的车辆恶意的情况下保证乘客的安全。
♥决策算法需要学习的知识:
操作系统:Linux
编程:c/c++/python
理论:学习常用的决策算法,如决策状态机、决策树、马尔可夫决策过程,POMDP等;如果往深里学的话,还需要学习深度学习,学习深度学习框架等。
其实决策和规划是经常要一起做的,我们继续往下看,看看规划方向的知识要求。
3.自动驾驶规划算法工程师
规划包括路径规划和速度规划,一般都是做路径规划的比较多。即自动驾驶路径规划工程师。
规划算法中,自动驾驶车辆首先通过路径规划确定车辆可行驶的路径,然后选择该路径确定可行驶的速度,路径规划视频视频如下。
<iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1179030210316599296?autoplay=false&useMSE=" width="320"></iframe> 路径规划(视频来源于优酷视频)♥路径规划算法需要学习的知识:
操作系统:Linux
编程:c/c++/python
理论:学习常见路径规划算法,例如A*、D*、RRT等;如果往深里学的话;学习轨迹预测算法,如MDP、POMDP、Came Theory等;学习ROS机器人操作系统;学习深度学习和强化学习技术也是加分项,例如RNN、LSTM、Deep Q-Learning等。
前面提到决策和规划其实要经常一起做的,所以经常会出现两者结合的方向:
自动驾驶决策规划算法工程师
看一下该方向的行业要求:
在上述熟悉如MDP、POMDP、Game Theory等轨迹预测算法;熟悉常见路径规划算法,例如A*、D*、RRT等;具备Linux环境下的C++开发;熟悉ROS开发环境;参加过机器人领域相关研发及竞赛;熟练掌握CarSim、CarMaker等汽车仿真软件使用方法;有强数学理论基础和背景。(来源:百度自动驾驶部招聘信息)
4.自动驾驶控制算法工程师
控制算法方向偏向于传统方向,一般是对车辆横纵向动力学建模,然后开发控制算法,实现车辆运动控制等。
♥控制算法需要学习的知识:
操作系统:Windows
编程: C/C++、Matlab/Simulink
理论:学习自动控制理论基础;学习车辆动力学模型;学习CarSim等仿真软件;学习ACC、AEB、APA、LKA、LCC等辅助驾驶功能开发的是加分项。
以下是基于Carsim、Matlab/simulink开发的车辆控制演示:
<iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1179036183487856640?autoplay=false&useMSE=" width="320"></iframe> 车辆控制开发(视频来源于B站)
在实际的工作中,有的时候规划和控制其实不是强烈的分开的,而是相互结合,所以也会见到这样的方向:
自动驾驶控制规划算法工程师。
5.自动驾驶感知算法工程师
自动驾驶感知部分是自动驾驶目前最有挑战的部分,包括:车道线检测、车辆等障碍物检测、可行驶区域检测、红绿灯等交通信息检测等等,前面讲的SLAM算法也属于感知部分。以下为感知部分的演示视频(均来源于腾讯视频)。
<iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1179041199956074496?autoplay=false&useMSE=" width="320"></iframe> 车辆及车道线检测 <iframe frameborder="0" height="240" src="https://www.zhihu.com/video/1179043213142315008?autoplay=false&useMSE=" width="320"></iframe> 自动驾驶场景语义分割♥感知算法需要学习的知识:
操作系统:Linux
编程:C/C++,Python,opencv
理论:需要机器学习的基本算法 ( 降维、分类、回归等 );需要学习深度学习,深度学习框架;学习计算机视觉和图像处理的常用方法 ( 物体检测、跟踪、分割、分类识别等 ) 。
(说明:机器学习需要全部掌握,深度学习中,一般掌握计算机视觉方向即可,语音识别可以暂时不用管,计算机视觉的学习包括:图像分类、图像检测、图像分割、目标跟踪四大类方向)。
感知方向学习资料:
因为本人是感知方向,所以在这里推荐一些感知方向的学习资料。
(1)Linux系统的学习:该部分网上有很多资料,但你要按照这个步骤来搜索:虚拟机安装Linux教程——>Linux系统常用命令——>linux编辑器vim的常用命令教程。
(2)C/C++学习:链接:https://pan.baidu.com/s/1aD3cbna1aAO8Lk33BZyoPg 密码:jk6u
(3)Python学习:Python建议可以快速入门,推荐廖雪峰的Python3教程:https://www.liaoxuefeng.com/wiki/1016959663602400,同时还需要学习Python的一些库,如Numpy、Pandas|、Matplotlib等等,可以参考菜鸟教程:https://www.runoob.com/numpy/numpy-tutorial.html。
(4)机器学习算法的学习:建议直接看吴恩达的课程,同时还需要网上找找相关实战代码:https://study.163.com/course/courseLearn.htm?courseId=1004570029#/learn/video?lessonId=1049052745&courseId=1004570029。
(5)深度学习——计算机视觉的学习:入门可以看吴恩达的课程:https://mooc.study.163.com/smartSpec/detail/1001319001.htm,学习前四周视觉部分就可以,第五周的序列模型可以不用看。
(6)深度学习框架:目前主流的框架由TensorFlow和Pytorch,前者偏向于工业界,后者偏向于学术界,两者都有必要学习一下。
(7)深度学习实战:这里提供一些实战的思路:
图像分类:要熟悉AlexNet、MobileNet、VGG、ResNet、GoogLeNet等原理,并在深度学习框架熟练使用。
目标检测:目标检测模型包括Two-stage和One-stage两种,如下图所示,这些模型的原理都要搞懂,同时可以修改其开源代码。
目标检测算法 目标检测算法(部分未列出)语义分割:关于语义分割,要熟悉经典的语义分割模型,如:FCN、UNet和Deeplab等等,并可以熟练修改其开源代码。
目标跟踪:目标跟踪其实又是一个很大的方向,这部分如果实验室没有需要,可以暂时不用学习。
(8)参加比赛:比较有名的比赛:Your Home for Data Science上面有很多多丰富的算法比赛,够啦。
(9)实习:上面的这些内容学完后就该找实习啦~~