引言导读:

  1. 本邮对激光slam算法岗位面试题及答复做了梳理
  2. 面试对于真正的人才,实际是一场双向考核,并非面试官的领域场
  3. 本书以扫地机器人为载体阐述,但技术方法论并非局限于扫地机器人单一品类,其核心工程逻辑与技术方案可直接引申借鉴至更广泛的服务机器人场景:包括割草机器人、空气净化机器人、泳池清洁机器人、家用服务机器人、消杀机器人等,从室内到户外、从清洁到服务的多类场景中,算法技术储备、工程化适配方法、系统架构设计、集成逻辑均可复用,掌握扫地机器人技术即掌握了服务机器人研发的底层通用能力。

机器人项目阶段进展 IPD


TO:人事部(H工)

CC:X总

Hi H工,

今天已完成SLAM算法岗位候选人的技术面试,通过一人,请H工继续跟进协同X总时间进行二面

整体沟通过程如下

请做一个简短的自我介绍

-您好,我姓S,20年毕业于北京KJ大学,至今有6年机器人SLAM算法工作经验,22年加入某斯科技做扫地机器人产品开发,是属于团队初期成员,现在产品已进入发布阶段,还未正式起量。当前是在职状态,本次看机会主要是考虑产品的核心研发任务已基本完成,但公司及团队规模偏小,同岗同事包括我共2人,考虑可能会对后续的技术成长有一定的阻碍,期望寻找一个更大的平台及更专业的环境发展。

OK,S工好!您刚提到属于某斯科技团队初期成员,那SLAM算法可以说是从零搭建?
-是的。

您是自主研发从“轮子”造起还是基于哪个开源框架做的二次开发?
-基于Google开源的Cartographer框架做的修改。

请您对Cartographer框架架构及数据处理流程做一下梳理?
-好的。Cartographer是图优化思想的激光SLAM框架,整体分为局部建图及全局建图,也就是通俗讲的前端及后端。
-它可以处理里程计位姿(odometry)、陀螺仪(IMU)、激光雷达(range data)及GPS数据(Fixed)四种不同的数据,其中Fixed GPS数据在扫地机器人产品中,暂不涉及,它主要应用于后端处理,可以把它理解为真值,且不参与优化。
-其余三种数据,在框架中首先会有一个等待的动作,目的是保证三种数据乃至三种传感器全部进入ready状态数据吞吐正常,主要在data_dispatcher中处理,待三种数据全部接收到,会进行数据裁剪,裁剪规则是以最迟到到达传感数据类型及其时间戳为基准,将该时间之前接受到的其余传感器数据抛弃(可以理解为由于传感器启动时间异步,带来的部分无意义的无效数据,cartographer中认为只有所有传感器数据全部接受到那一刻,之后的接收数据才为有效数据,这与后续不同传感器时间同步呼应考量),之后进入正常的数据分发及处理流程
-imu data会进入imu_tracker进行更新维护,odometry data会直接进入pose_extrapolator即位姿推断器,imu tracker是pose extrapolaor的包含对象,里程计与imu的融合与时间对齐即在位姿推断器中完成,也是前端的预测位姿。
-range data会首先通过体素滤波即(voxel filter)进行降采样,减少数据量,一般体素盒子大小同步于地图像素分辨率(0.05m*0.05m),之后进行畸变补偿,将补偿之后的点云,通过时间戳获取对应时刻的预测推算位姿,到这里,点云、里程计与imu时间全部对齐。
-前端的最后一个关键步骤,便是匹配,cartographer中封装了3种不同的匹配方式:CSM/Fast CSM/Scan Matcher,简单介绍CSM就是指定位姿窗口大小的暴力搜索,而,Fast CSM通过构建分辨率金字塔做了深度优先搜索效率优化,Scan Matcher通过ceres库精细优化匹配。在这里,匹配的对象,前景是当前点云、背景即是当前的submap。
-submap是cartographer非常典型的一个特性,它可以理解为一定量点云、局部的地图,整体地图由多个不同的submap拼接而成。在前端中,通过一个滑动窗口对submap进行定量维护。 -点云匹配完毕,则会将当前点云更新到submap栅格地图中。submap被点云更新到指定次数,则变更为完成状态,输送进后端。
-后端即global trajectory则主要负责两个业务,一是,回环检测(FAST CSM),二是计算约束与全局优化。

很详细且有逻辑,在扫地机产品上,您在原有基础上做了哪些二次修改?
删减:cartographer同时支持2D与3D,即单线激光与多线激光传感器。扫地机器人是单线激光雷达,那么,在框架中3D部分我们做了移除;其次,全局回环检测与优化,也就是后端也可以说是做了移除,常规下的slam后端对于历史数据的存储与约束优化计算,在家用C端产品硬件资源受限的前提下,几乎无法发挥。
补充:状态分析器,在原生框架中有motion_filter,判定机器人在静止状态下,不再进行子图的更新操作。但是,这在扫地机机器人产品场景下是不够的,它还有可能发生打滑、倾斜等等异常姿态,这里我们重新做了完善。
另外,还有一些细节上的调整,比如虽然没有后端与回环检测,但扫地机产品有关机地图重新加载与重定位的需求,这里我们仍然沿用了它的Fast CSM并做了相关的参数调整。

您是如何做出打滑状态估计的?
打滑状态识别的目标是,寻找到主动轮空转的情况。可以从扫地机的两种运动情况进行分析,一是旋转、二是直行。
当机器人进行旋转时,通过里程计运动模型可分析出最近一段时间的运动姿态,它当然是失真有偏差的,这时,把同等时间段内IMU姿态反馈等量做出统计,作为真值(IMU数据不受打滑影响),这时,进行二者差值error计算,如果超出指定阈值,则可判定打滑。
扫地机也有可能在直行状态下,被架空,导致主动轮空转打滑,这时里程计姿态与IMU姿态无法分析出偏差,但可基于同样思路,使用最近一段时间机器里程计运动距离与激光雷达观测运动距离,进行差值error计算,如果超出指定阈值,则可判定打滑。

合理的。您是如何处理动态物体干扰的?
-点云在匹配操作前,会进行动态点云滤波,剔除动态点云。具体做法是,由原始点云向栅格概率地图做好坐标系映射,并在一定范围内,寻找点云中每个点距离最近的地图障碍点(高概率栅格),就是比对与参照,这里我们用了KD-tree进行搜索加速,如果未寻找最近障碍点或距离超过指定阈值,则认为是该点是动态点,它并不参与配准,从而保证位姿稳定,但是会进行地图概率更新。思路是,概率栅格地图本身便具备“滤波”意义,如果是动态点云,则不会常驻在某个栅格内导致概率增长,如果是新增静态障碍,则在多次更新下正常表达为障碍点,后续将不再判定为动态点。
通过点云聚类也可通过前后帧进行识别处理,但,基于点云数据特性考量,应还需要预先处理离群点,两者应效果差异不大,直接与栅格图映射更加简洁彻底。

除了图优化思想的slam算法,你了解基于滤波思想的slam算法或框架吗?
在一个极简框架tiny-slam中了解过MCL方法的粒子滤波,另外,也熟悉卡尔曼滤波。

请简短介绍下卡尔曼滤波?
-标准卡尔曼滤波通过两个过程即预测和更新完成,由5个公式实现。
预测(Predict):根据上一时刻的状态和运动规律,推算出当前时刻大概在哪里(比如:根据车速推算下一秒的位置)。
更新(Update):读取当前时刻传感器的测量值(比如:GPS定位数据),将“预测值”和“测量值”进行加权融合,得出当前时刻的最优状态。
核心(卡尔曼增益):算法会自动计算一个“卡尔曼增益”。它本质上是在评估:“我到底该更相信我的预测,还是更相信传感器的测量?”
如果传感器噪声大,增益就小,算法会更依赖预测;
如果预测模型不准,增益就大,算法会更依赖传感器的测量。

在工厂阶段,是否有标定工作?做了哪些标定?
做了激光雷达整机安装工差标定,我们设计了三角工装,整机组装完毕会在工装内部进行测量标定,实际也是匹配机制,获取相对真值的R&T偏差进行记录。

OK,辛苦了,接下来我向您介绍一下我们单位,X科技,是一家以自主研发激光雷达传感器为核心主业的企业,也是行业公认的头部企业您应该有所耳闻,今年我们也是刚刚立项成立面向C端扫地机器人项目组,预计组建10人左右算法团队,SLAM岗位保留2-4个名额,现在招聘的可以说是SLAM方向1号员工,当然我本人也在slam及扫地机产品也有近十年经验,关于您的技术成长方面的考虑,我们之间应该有足够的话题去探讨交流。

您是否还有其他问题需要了解?
贵司面试需要几轮?
二轮,今天是技术初面,如通过,需要同Boss在进行一轮交流,如无异议则同HR谈薪,一致则获取offer。
明白,暂时没有其他。
辛苦,感谢您的时间!我们内部沟通下您的面试情况,如有消息,会3日内答复您。

Von
Best Regards
Mail : slamseek@163.com
智能研发部


作者观:

首先,谈一下作者的面试节奏:
一般会有一个宏观划分,3年经验以下/5年经验左右/10年经验左右,分别有不同的侧重
3年以下,侧重基础技术与理论交流,比如运动模型、粒子滤波、卡尔曼滤波、匹配算法(icp、ndt)包括一些编程语言和基础数据结构与算法如BFS等,主要考量基础扎实与可培养性。
5年左右,侧重框架级与架构理解,与产品工程经验交流,主要侧重系统性技术能力与快速切入项目可能性,次要考量技术储备与逻辑组织能力。一般不过多追问基础技术,尤其在AI时代下,标准件技术与理论权重趋弱于实际工程经验权重。
10年左右,侧重项目经验广度与深度,即参与过几个同类产品研发,承担角色与参与深度?团队统筹管理能力等,而基础技术的询问则变成是一种“不礼貌”,需要避免,可以在同一岗位深耕十年,即使某个基础技术无法面试过程中背诵,也大概率不会成为项目推动的卡点,二是,招聘十年左右的岗位经验的员工进行大量基础编码与开发工作(不排除核心攻关代码),单位从用人理解方面多少也是有些不正常。
面试对于真正的人才,实际是一场双向考核,并非面试官的领域场。 仅代表作者个人习惯与观点,不一定具有普适性。生涯中也见到了太多的“刁难向”与“体验优越感”的面试官,即使过程中问题答复较好,后续也基本提不起兴趣,为入职后的配合而担忧。送给诸位同仁的忠告“请敬畏手中的权利与主导力”。

拆解一下面试过程:
自我介绍是标准的面试开场,但这个问题,在我这也是可能定“生死”的。它至少体现了你的语言组织与职业自信两方面,3年以下或应届生自带光环免疫本题,无论表达成什么样都可被容忍与理解,权当做面试“热身与放松”环节。但没有任何一个面试官,喜欢听一个5年乃至10年的工程师,去自我介绍说我叫xx,来自xx,今年xx岁,未婚未育…这些屁话!请直接切入与面试岗位相关且可体现您竞争力的内容,做一个概括!
技术问题,顺序:“原生算法”-“产品工程化”-“项目工程化”,也就是按照:开源通用技术掌握情况 - 产品结合落地思考与实操 - 项目参与完整性逻辑展开交流。
文中提问,是作者认为在扫地机器人产品SLAM方向及Cartographer框架掌握最为核心的几个问题及标准答案,可借鉴理解。
最后,对于面试结果,一般通过面试过程是否顺畅,其实可以有一个差不多的预估。但,实在没有必要当场说明,尤其是“不符合预期”的结论,在早年,面试经验不足,同一位候选人交流,整体面试过程极不顺畅,面试问题从困难逐步降级到小白,几乎没有完整靠谱的答案,面试结果不言而喻,我理解对方也应该是有明确预期的,索性直接告知“准备不足,不符合预期”,结果候选人状态直接崩溃,又跳出角色一顿安抚,事后想想,每一位候选人,背后或许都有不同程度的压力在背负着,尤其是已离职状态的,尽量不要去触碰那根弦,“3日内有结果通知”也是给情绪一个缓冲空间,同在世间奔波,多一分考量,终归也是多一分悲悯。


slamseek联系邮箱:slamseek@163.com