前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试20场,我总结了面试问题及解答!激光+IMU融合定位方向

面试20场,我总结了面试问题及解答!激光+IMU融合定位方向

作者头像
用户1150922
发布2022-09-19 15:14:08
7320
发布2022-09-19 15:14:08
举报
文章被收录于专栏:计算机视觉life计算机视觉life

原文链接:面试20场,我总结了面试问题及解答!激光+IMU融合定位方向

大家好,我是小6,我们SLAM知识星球里很多小伙伴即将开始实习、求职,为了能够让星球里所有小伙伴能够顺利找到工作,在此号召大家一起对自己曾经参与过的笔试、面试问题进行总结和复盘,既能帮自己梳理知识点,也能和大家一起讨论解题思路和技巧。以下是某位星球朋友的分享,欢迎大家对提出的问题进行补充,回答,讨论。

图片
图片

以下是正文

去年经历的面试不下20场,有的很水,有的问出来的题目非常有水平,趁这个机会整理出来遇到的不会的问题,供各位同行讨论。

类型:社招,远程面试+笔试

岗位:SLAM算法工程师

下面的问题不分先后,传感器是激光+imu的多传感器融合定位

注意以下所有问题都是使用激光+imu做融合定位的。

问题1:在无人叉车室内场景中,我们已经有了一张地图。在此地图中做定位,当叉车停止的时候,此时我们的定位算法依然会输出位姿。但是此位姿会有跳动,根据算法的精度不同跳动幅度有大有小。比如x坐标在1.13米~1.16米之间来回跳动,那么问题是,坐标这样跳动的时候,到底这中间哪个值是它的真实位置呢?

解答:当时我的回答的是:平时我们的叉车定位精度就是2个厘米,那么到了作业点的时候,叉车停止,此时我们的叉车控制权交给了目标检测那里,来微调叉车位置,以对准托盘的插孔,也就是真实位置。

这个问题后来和同事商量后,猜想面试官可能想让我答得是:只要我定位的时候和之前建好的图是一个世界坐标系原点,也就是保持地图一致性就行了,只要我在这张地图上定位就不用考虑这个真实位置,因为建图的目的就是为了在这张地图定位。而室内场景,没有类似gnss这样的绝对位置传感器,所以不可能得知哪个值是它的真实位置。

问题2:地图更新问题,同样是室内叉车场景。假定叉车从一个充电桩开始出发,充电桩附近基本无场景变化,到日常的工作区域,但是工作区域的场景变化了,导致位姿会有跳动甚至位姿直接跑飞了。怎么解决。

解答:我当时没有用过里程计的经验,这道题没有答上来。面试官给的提示是:到了变化较大的工作场景后,当匹配得分逐渐增大的时候,先用里程计撑一会,此时给点云匹配很小的权重。

现在我看论文研究后,知道这是一类地图更新问题,可以选择边建图边定位的方法,在建图的时候将关键帧位姿+点云+因子存下来。若经过这样的场景变化较大的区域,替换这附近关键帧位姿对应的点云+位姿+因子,再执行一次优化。

当然这还涉及到怎样识别出场景变化大的问题。要么配合机器学习识别出哪些是变化的物体,要么还是根据里程计来判断。

还有种方法是贴一些反光板或者在此区域中,只匹配一些固定区域的线面特征,但这就对环境和操作者提出了要求。

问题3:讲一下liosam大概的流程,面试官提了一个点:liosam比别的算法好的一个点在于,执行完因子图优化后,它有一步做了什么?换个问法:liosam执行完因子图优化后,还做了一步,这是比别的算法亮眼的地方。做了什么?

解答:liosam大概流程:1.激光运动畸变矫正,2.特征提取,3.scantomap匹配,4.因子图优化,5.回环检测。不知道做了啥令它比别的算法亮眼……

面试官答:还做了一步将执行完优化后的位姿作为下次预积分的基础。

问题4:重定位问题

解答:这类问题我自己没有做过,只是用了最简单的扇形区域搜索匹配得分最小的作为初始位姿。只能和面试官提一些看过的方法。在建图时保存下来一些线面特征,类似视觉的词袋模型,然后在全局搜索的时候,匹配线面特征。还有就是分块搜索,但是这种准确率并不高。

问题5:由于我的项目经验里有把整套slam框架从ros剥离的经验,因此面试官问了为什么要脱离ros?

解答:ROS在每次循环时,会逐个遍历各个subscriber的缓冲区,并且把缓冲区中的数据读完,不管有多少。我们在subscriber的callback中解析数据的时候,一般都是把数据赋给一个变量,然后在融合的时候使用最后更新的值作为输入。

问题在于当融合算法处理时间比较长,超出了传感器信息的发送周期的时候,未被接收的数据会被放在每个subscriber对应的缓冲区中,等当前融合步骤处理完之后,下次ros从缓冲区中读取数据的时候,会先把gnss的数据读完,然后再读lidar的数据,这就导致,我们再一次进入lidar_callback函数时,使用的gnss_data已经不是和这个lidar_data同一时刻的数据了,而是它后面时刻的数据。

希望可以降算力,因为ros里面很多东西是冗余的,我这个产品,给到客户那里,他们只希望得到的是定位数据。那么ros里面很多东西比如tf,比如rviz显示,包括这种消息订阅回调机制,都是用不到的,所以我脱离ros这个框架,只保留了程序必要的部分。

再一个有遇到客户那边也觉得,他们觉得ros这个框架不可靠,也提出过让我们脱离ros来做。也是为了方便后续的算法移植。

问题6:ESKF比EKF的优点

解答:1.误差状态自由度和实际位姿自由度相等,它避免了过参数化引起的协方差矩阵奇异的风险。2. 误差状态总是接近于0,也就是通常在原点附近,这样远离了奇异值、万向节锁等问题,从而确保卡尔曼滤波时候的合理性和有效性。3.误差状态通常很小,因此二阶项都可以忽略,这样计算雅克比时会很快。4.误差状态的动态变化较慢,这是因为大的信号动态性被积分到了标准状态,那么它的更新频率要比预测频率低。我们的系统中imu频率100hz,而观测只有10hz。

问题7:用优化的方法求解根号x。

解答:这题首先要推公式,求出迭代公式然后在迭代后,判断是否超过了一个很小的数比如1e-7,超过了就停止。迭代公式就是根据直线方程求得的,直线方程的斜率就是x方的导数,也就是2x。值得注意的是这只是整数的平方根,如果要求小数比如0~1之间的数的平方根就是另一种做法了,暂未研究。首先要做出一条抛物线,抛物线的方程式,之所以这样做是因为我要令这条抛物线在x>0的时候和x轴相交,这样交点即给定的那个数。然后我要在这条抛物线上做切线,每个切线的斜率就是2x,第一个切线的切点就是x=给定的那个数,y就是,而这条切线和x轴的交点就是(x1,0),这条切线目前就有了两个点(x0,x0^2 - c),(x1,0),斜率是2x0,那么这条线就可以确定了,之后推导出x1=0.5*(x0+C/X0),这个就是迭代公式,那么x2也就由x1推导出来,依次找下去,直到相邻两次足够小,就返回。

代码语言:javascript
复制
class Solution {
  public:
  int mySqrtInt(int x) {
    if (x == 0) {
      return 0;
    }

    double C = x, x0 = x;
    while (true) {
      double xi = 0.5 * (x0 + C / x0);
      if (fabs(x0 - xi) < 1e-7) {
        break;
      }
      x0 = xi;
    }
    return int(x0);
  }
  
  double mySqrtDouble(int x) {
    if (x == 0) {
      return 0;
    }

    double C = x, x0 = x;
    while (true) {
      double xi = 0.5 * (x0 + C / x0);
      if (fabs(x0 - xi) < 1e-7) {
        break;
      }
      x0 = xi;
    }
    return x0;
  }
};
```\

以上就是这位星友的分享,对于其中的问题的 解答,读者或许有自己的理解,欢迎留言补充、讨论、交流。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档