【面试官版】【持续更新中】融合滤波算法+数据结构+激光视觉SLAM+C++面试题汇总
C++部分
- 什么时候需要写虚函数、什么时候需要写纯虚函数?
只继承接口为纯虚函数
强调覆盖父类重写,或者父类也需要实现一定的功能,为虚函数 - 指针传参和引用传参区别?
引用传参本质上是传递原参数地址,指针传参本质还是值传递,生成拷贝指针,拷贝指针和原指针指向的为同一块内存。因此改变拷贝指针的指向不影响原指针指向,改变拷贝指针的内容影响原指针指向的内容。如果想改变传入指针的指向,则需要传入指针的引用 例如int *&p - Lambda捕获的含义 捕获this指针的含义?
表示参数是以值传入还是以引用传入,即选择参数传入的方式。捕获this表示lambda会访问当前所在类的对象中的变量。如果在静态类成员函数中无法访问非静态类成员变量。 - 右值引用应用场景?
Lambda函数定义在另一个函数的参数中。移动构造函数。 - 什么是完美转发?
右值传入函数中会变为左值,如果在这个函数中右对这个参数进行调用,若想保持它的属性不变(左值仍然为左值,右值仍然为右值),则使用完美转发 - 为什么要有迭代器?
使用迭代器时我们可以忽略容器本身的调用方式,实现算法和容器的分离。设计算法时只专注于迭代器的改变即可。 - 什么是动态绑定?
父类指针指向子类对象,可以调用子类中重写父类的虚函数的函数 - 虚函数和普通类成员函数和普通函数的区别?
虚函数由虚函数表实现。普通类成员函数和普通函数没有区别。 - 静态成员函数和普通成员函数区别?
静态成员函数类内声明类外定义,且只能操作静态成员变量。无需生成对象即可调用。 - 类成员函数最前面的const和最后面的const分别表示什么含义?
前const:返回值不可修改。最后面的const:对象不可修改。
数据结构部分:
- map和unorder_map的区别?
Key上实现了排序 - Map的底层实现 unorder_map的底层实现?
Map底层实现为红黑树 unorder_map底层实现为哈希表 - 红黑树的特点:
两个红节点不可相邻、根结点一定为黑色、左子树到根和右子树到根的黑色节点数量要相同 - vector push_back和emplace_back的区别?
emplace_back把传入的参数当作右值,减少了一次拷贝,但使用之后参数会消失
滤波部分:
- 什么是协方差?如何理解?受什么变量影响?
协方差表示数据的离散程度,数据的不确定度。滤波算法中受传递噪声和传感器噪声的影响。 - 什么是ESKF?ESKF的优点?如果给定一个imu和一个gps,什么是初始状态量,什么是观测状态量?
ESKF是误差滤波。误差在0附近保证雅可比二阶导足够小可忽略,同时远离奇异点,保证了求导的准确性。
初始状态0,观测状态为gps数据 - imu得到的数据。 - 除了KF、EKF还有什么其他的滤波算法?
ESKF:误差作为状态量。
UKF:通过采样的方式估计数据的高斯分布情况
IEKF:迭代
定位部分:
视觉SLAM:
- 利用重投影误差对100个三维点的坐标进行优化,Hx=b,H x b维度分别是多少?
H = JTJ J为2对3求导 所以为23 所以H为3223 = 33
x为要优化的状态量 3100
b为-JTf f维度为2100 所以b维度 3100 - 非线形优化Hx=b 为什么H要求是正定矩阵?
可逆、更重要的是Hx=b的推导来源于二次型 若想保证导数为0处求得的极值为最小值 开口必须向上 - VIO系统能观性分析
标准VIO四自由度不客观 xyz yaw
回答三自由度客观也可以 但前提是VIO使用9轴imu - Vins-mono中预积分优化时状态量对噪声的雅可比的作用?
初始两个时刻的噪声认为相等,优化过程中更新噪声之后,更新预积分观测量,随后更新残差。其中通过预积分状态量对噪声的雅可比矩阵来更新预积分观测量。
激光:
- LOAM中是如何增加Z方向的约束的?
查找点到线约束和点到面约束会特意寻找不是同一根线的点,以保证z轴方向的约束。 - LOAM系列建图缺点。
Z轴整体漂移 - 如何检测是否处于长廊场景?
点云筛选后协方差奇异值分解 检查第一大和第二大的关系 - ICP中残差形式?残差对R求导的结果为?
e = p - Rq - t
Rq^