网站首页 > 技术文章 正文
随着“春招季”的到来,现将2022年与2023年所有自动驾驶面试真题及相应的解题思路也一并整理出来,希望对有志于进入自动驾驶相关岗位的同学们有些许帮助。
面试资料包括面试题目、解题思路两部分。受限于篇幅,本文仅仅展示了少部分题目,详细的面试资料请自行获取。
免费领取2023最新自动驾驶领域500+面试题汇总
环境感知
简要说明感知模块的处理流程,如预处理、模型处理以及后处理分别做了什么?
预处理部分包括多传感器数据的噪声去除等操作,对于多传感器的前融合而言,还需进行时间对齐与补偿,坐标转换等操作。 训练部分针对网络结构将数据转换成相应公式,如PointPillar将点云数据投影成俯视图并进行voxel量化等操作。 后处理部分,对于多传感器后融合而言,需要将各个传感器的结果进行融合处理。
对比DBSCAN聚类算法与其他聚类算法的优劣。
和传统的 k-means 算法相比,DBSCAN 算法不需要输入簇数 k 而且可以发现任意形状的聚类簇,同时,在聚类时可以找出异常点。
DBSCAN 算法的主要优点如下。
1)可以对任意形状的稠密数据集进行聚类,而 k-means 之类的聚类算法一般只适用于凸数据集。
2)可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3)聚类结果没有偏倚,而 k-means 之类的聚类算法的初始值对聚类结果有很大影响。
DBSCAN 算法的主要缺点如下。
1)样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用 DBSCAN 算法一般不适合。
2)样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的 KD 树或者球树进行规模限制来进行改进。
3)调试参数比较复杂时,主要需要对距离阈值 Eps,邻域样本数阈值 MinPts 进行联合调参,不同的参数组合对最后的聚类效果有较大影响。
4)对于整个数据集只采用了一组参数。如果数据集中存在不同密度的簇或者嵌套簇,则 DBSCAN 算法不能处理。为了解决这个问题,有人提出了 OPTICS 算法。
5)DBSCAN 算法可过滤噪声点,这同时也是其缺点,这造成了其不适用于某些领域,如对网络安全领域中恶意攻击的判断。
车上多个摄像头图像投影到2D平面如何实现?
摄像头标定的目的有两个,一个是要还原摄像头成像物体在真实世界的位置,就需要知道世界坐标系到图像平面坐标系如何变换,求解内外参矩阵,另一个是针孔摄像头的畸变参数求解。
简述RANSAC原理。
RANSAC算法的输入是一组观测数据值,一个能解释或拟合观测数据的参数化模型,以及一些置信度参数。对于点云的RANSAC来说,可以简单理解为,输入①一组点云、②某些特征形状的参数化模型以及③一些阈值(包括随机子集点数,迭优化代次数,置信度等)。
RANSAC通过迭代选择原始数据的随机子集来实现其目标。这些数据是假设的正确数据,然后这个假设会经过如下步骤被验证:
1.在原始数据中随机选取一个(最小)子集作为假设内点(正确的拟合点);
2.根据假设的内点拟合一个模型;
3.判断剩余的原始数据是否符合拟合的模型,将其分为内点和外点。如果内点过少则标记为无效迭代;
4.根据假设的内点和上一步划分的内点重新拟合模型;
5.计算所有内点的残差,根据残差和或者错误率重新评估模型。
假如你的车子有4个激光雷达,你如何设计点云分割算法 。假如当前需要你把场景里的砖头分割出来,靠点云分割能否正确识别?点云中的水雾怎么去除?
可以利用4个激光雷达在不同角度上进行面特征检测,以及对四个角特征进行识别来分割出砖头。水雾可通过加强激光雷达强度或采用毫米波雷达等多传感器融合的方法来增强激光的穿透能力,从而去除水雾。
定位建图
特征点法SLAM中,如何增强特征描述子之间的区分度?
一个好的描述子通常要具有以下特性:
不变性 指特征不会随着图像的放大缩小旋转而改变。(尺度不变性和旋转不变性)
鲁棒性 对噪声、光照或者其他一些小的形变不敏感
可区分性 每一个特征描述子都是独特的,具有排他性,尽可能减少彼此间的相似性。
描述子的可区分性和其不变性是矛盾的,一个具有众多不变性的特征描述子,其区分局部图像内容的能力就比较稍弱;而如果一个很容易区分不同局部图像内容的特征描述子,其鲁棒性往往比较低。
简述一下orb-slam3它的大致框架。
1)Atlas是一堆未合并的map的集合,分为active map和non-active-map两部分,基于DBoW2 keyframes database来做重定位、回环和地图合并。
2)tracking thread,处理进来的图像和IMU信息,通过最小化重投影误差实时计算当前帧与地图的相对位姿,同时也进行keyframe的选择。在VI配置下,速度与IMU的biases也同时被优化与估计。当跟丢后,tracking thread尝试利用atlas进行重定位,如果成功了,将继续进行tracking,需要的话进行切换active map的操作;若定位失败(过了一个设定时间),重新初始化一个新active map 进行tracking和mapping。
3)local mapping thread,往active map中添加keyframes和points,移走outliers,在一个local window中通过视觉和VI BA来refine maps。IMU的参数初始化也通过这个mapping thread进行refine。
4)loop and map merging thread,一直将active map与整个atlas基于keyframe的速度进行相似性度量。如果相似场景区域在当前的active map中,将进行回环矫正;当这个区域也属于其他地图,将进行合并操作并将合并后的地图置为当前的active map。在进行回环矫正时,一个full BA将再开一个线程进行,来追求更高的精度,但这个并不要求实时性。
SLAM算法中单目估计相机位姿时通常需要PnP给出相机初始位姿。
通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是上一帧相对于当前帧的位姿变换。
求解方法有DLT,P3P, EPnP,UPnP等。P3P是通过3对3D-2D匹配点和一对验证点, 利用三角形相似性质,求解投影点在相机坐标系下的3D坐标,转为3D-3D的位姿估计问题。
简述一下LOAM和LeGO-LOAM的相同点和不同点。LeGO-LOAM相比于LOAM做出了哪些改进?
1. LOAM和LeGO相同点在于它们都把系统分为特征提取模块、里程计模块和建图模块。特征提取方面,两个算法均使用点-线、点-面特征;里程计模块负责提供高频的位姿估计信息,并为建图模块提供一个良好的初值
2. LeGO在特征提取模块、里程计模块和建图模块都做出了改进。在特征提取方面,使用地面分割和聚类,剔除环境噪声,提高了特征点的鲁棒性;在里程计模块,采用两步LM优化,先估计x、y、yaw,再优化z、roll、pith,加快了优化算法的收敛速度;在建图模块,改进了LOAM的地图管理策略,引入了关键帧策略和位姿图优化,实现了闭环检测的功能。
简述自己熟悉的SLAM算法,雷达和视觉SLAM分析其优缺点。
Liosam: 是在loam系的基础上,使用了IMU传感器和因子图等手段进行建图。
优点:使用gtsam库紧耦合了IMU、GPS、回环约束、噪声误差等因子,相比纯激光的情况有效抑制了大角度回转时的建图漂移,也抑制了z方向上的大距离漂移(仍会漂移,但是比loam好多了);不再使用帧间匹配,而是scan2map的方式进行匹配,可以提高精度和鲁棒性,关于特征地图也有充分利用;添加了回环检测功能,可以做出全局关键帧的优化;可以对imu的bias误差进行优化,imu配置详细,可拓展性好,文件逻辑清晰;开源。
缺点:回环检测稍显简陋(仅通过位置判断,不过后续的LVI-SAM通过视觉回环以及SC版本都优化了这点);关键帧直接的特征直接丢弃,浪费部分资源(我也看过,滑动窗口边缘化不太适合用在因子图上,这点暂时无法改变);动态环境地图(人在后面跟着走会有一串影子,不过这是大部分slam算法的通病了)。
决策规划控制
介绍下RRT和RRT*算法,如何进行碰撞检测的,生成的轨迹不满足车辆动力学约束怎么办。
编程题:一个机器人位于一个m*n网格的左上角,机器人每次只能向下或者向右移动一步,机器人试图到达网格的右下角,请问有多少种不同的路径?
int uniquePaths(int m, int n) {
// 每次只能选择向右或者向下, 问一共有多少个可能的路径。
vector<vector<int>> dp(m ,vector<int>(n, 0));
for (int j = 0; j < n; j++) {
dp[0][j] = 1;
}
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
启发搜索算法中启发式函数有哪些构建方法?如何设计对应的代价函数?
对于栅格地图,启发式函数包括以下三种:
定义:dx = abs(node.x - goal.x) , dy = abs(node.y - goal.y)
1. 曼哈顿距离:只允许上下左右四个方向移动:L = dx + dy
2. 对角距离:允许想斜边移动: L = dx + dy + (根号2 - 2)* min(dx,dy);
3. 欧几里得距离: 允许朝向任意方向移动 直线距离: L = sqrt(dx * dx + dy * dy)
机器人常用的决策方法你熟悉吗?例如决策树或者状态机或者行为树,能否举例说明一下?
机器人常见的决策方法如有限状态机模型,通过设置一系列的状态来实现决策。如从启动的初始状态开始,在沿着轨迹行进的过程中,如果识别到障碍物,切换到避障的状态,然后如果通过了障碍物,那么又切换回沿着轨迹行进的状态。
常用的控制方法都有哪些,能否举例说明?例如pid或者lqr方法。
PID控制:随处可见的控制方法,优点就是控制律简单,易于实现,不用建模;缺点是难以保证机器人具有良好的动态和静态品质,并且需要较大的控制量;自适应控制:根据要求的性能指标与实际系统的性能指标相比较所获得的信息来修正控制规律或控制器参数,使系统能保持最优或次优的工作状态的控制方法。简单的说,就是控制器能及时修正自己的特性以适应控制对象和外部扰动的动态特性变化。鲁棒控制:仅需知道限制不确定性的最大可能性的边界即可,鲁棒控制可同时补偿结构和非结构的不确定性影响。而且鲁棒控制相比自适应控制实现简单,没有自适应律,对时变参数及非结构非线性不确定性的影响有更好的补偿效果,更易于保证稳定性。神经网络和模糊控制:具有高度的非线性逼近映射能力,神经网络和模糊系统可解决复杂的非线性,不确定性及不确知系统的控制,而且可实现对机器人动力学方程中未知部分精确逼近,从而可通过在线建模和前馈补偿,实现机器人的高精度跟踪。迭代学习控制:具有严格的数学描述,适合于解决非线性,强耦合,建模难,运动具有重复性的对象的高精度控制问题。不依赖于系统的精确数学模型,算法简单,机器人轨迹跟踪是其典型代表。变结构控制:通过控制量的切换使变系统状态沿滑模面滑动,本质上是一类特殊的非线性控制,非线性表现为不连续性。滑动模态可以进行设计且与对象参数及扰动无关,所以变结构控制具有快速响应,对参数变化及扰动不领命。
基础架构
ros1与ros2有什么区别?
ros1 只支持Linux和MacOS,而 ros2 支持Linux/Windows/MacOS/RTOS;
ros1 的通讯基于TCPROS/UDPROS,强依赖于master节点的处理,而 ros2 基于DDS(分布式架构);
ROS1 的目标版本是 Python2 。ROS2 至少需要 Python 版本 3.5 。
在 ROS1 roslaunch文件中,XML 的定义功能非常有限。在 ROS2 launch 文件中,使用 Python 编写,从而能够使用更复杂的逻辑。
promethues平台是否适用于树莓派,为什么?
Prometheus的安装和配置非常简单,我们只要按照官网的步骤安装就可以了,这里要说明的是因为Prometheus发布的都是二进制的版本,所以安装的时候要注意一下,Raspberry Pi 1和Zero是ArmV6的架构,Pi3和Pi4是ArmV7,所以不要弄错了,否则运行不了。
嵌入式方面,DRAM和SRAM的区别,速度差多少?
SRAM是静态RAM,DRAM是动态RAM。
SRAM的速度比DRAM快。DRAM用作内存比较多,SRAM用作二级cache比较多。
DRAM需要不断地刷新电路来保存数据,否则内部的数据将会消失。因此功耗DRAM比SRAM大。
SRAM存储一位需要花6个晶体管,而DRAM只需要花一个电容和一个晶体管。同容量,SRAM需要更多的晶体管,发热量也非常大。难以做成大容量的主存储器。通常只用在CPU、GPU中作为内部L1/L2缓存或外部的L2高速缓存,容量也只有几十K至几十M。cache追求的是速度所以选择SRAM,而内存则追求容量所以选择能够在相同空间中存放更多内容并且造价相对低廉的DRAM。
嵌入式用的是SRAM。电脑内存条采用的是DRAM。
SRAM成本比较高,DRAM成本较低(1个场效应管加一个电容)
SRAM存取速度比较快,DRAM存取速度较慢(电容充放电时间)
SRAM一般用小容量SRAM作为更高速CPU和较低速DRAM 之间的二级缓存cache,嵌入式应用
DRAM一般用在电脑内存条里。
有哪些实际的机器人控制算法项目,简要谈一谈。
经典的控制算法:PID控制,不用多说,可以解决99.9%的问题。 位置控制:硬控制,不管对方,“挡我者死,为所欲为”“达到目标,不择手段”。 力控制:软控制 adaptive control 自适应控制:对系统的状态变化充分了解。robust control 鲁棒控制:在一定范围内能够做到很好的控制,超出范围则比较差;compliance control 柔顺控制:位置控制和力控制组合,与对象有能量的交换,类似弹簧,有接触,有能量交换;Hybrid Position/Force Control 混合力/位控制:(1)什么时候做力控制,如何提供强烈的信号控制开关(2)力/位规划在笛卡尔坐标系,空间不一致,而实际是机器人在关节空间体现每个方向的变化,都需要每个轴去执行(不停的反馈去校正,比较累) 需求:笛卡尔坐标系 执行:关节坐标系 (3)无法根据环境进行调整,力控制需要了解环境(被控对象)。impedance control:把控制器看成广义弹簧,与环境进行交互。
双环PID如何设置参数?
如果你使用双环系统进行控制,记得在位置控制环里放离你温度控制系统最近的传感器数据,增量环可以放加热源附近的传感器数据。然后在特定温度条件下将位置环引入到增量环控制中,至于具体参数怎么调。本人的建议是先把一个环调稳定,然后进行下一个调节。pid调解时记得用excel进行辅助有图像总是好的。
猜你喜欢
- 2024-09-30 CFNet:三维激光雷达与相机自动在线外部校准方法
- 2024-09-30 清华大学王谷为大家分享自己的研究工作——GDR-Net
- 2024-09-30 PnP算法原理举例及解释 pnn算法
- 2024-09-30 干货!单目6D物体姿态估计中基于几何指导的直接回归网络
- 2024-09-30 HybridPose:混合表示下的6D对象姿势估计
- 2024-09-30 HybridPose:混合表示下的6D对象姿态估计
- 2024-09-30 一文读懂自动驾驶中基于特征点的视觉全局定位技术
- 2024-09-30 3D视觉定位技术 3d视觉定位技术是什么
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)