大疆机器人算法一面:SLAM 定位建图到规划控制
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请你先做一个自我介绍,然后讲讲你在机器人算法方面做过什么。
- 你项目里的机器人是什么形态?无人机、机械臂还是移动机器人?
- 定位用的什么方案?激光 SLAM、视觉 SLAM 还是融合?
- 如果激光和视觉冲突,你怎么处理?听谁的?
- 建图用的什么?栅格地图还是点云地图?
- 地图更新频率多少?怎么处理动态物体?
- 如果环境中出现动态障碍物,你怎么更新地图?
- 路径规划用的什么算法?A*、Dijkstra 还是 RRT?
- 全局规划和局部规划怎么配合?
- 如果局部规划陷入死锁,你怎么处理?
- 轨迹优化你做过哪些?有没有用 minimum snap?
- 如果轨迹不可行,你怎么修正?
- 控制用的什么?MPC 还是 PID?
- 控制频率多少?和规划频率怎么对齐?
- 如果控制延迟,你怎么补偿?
- 状态估计用的什么?EKF 还是 UKF?
- 如果传感器故障,你怎么检测和容错?
- 你怎么做仿真验证?用的什么仿真器?
- Sim2Real 你做过哪些工作?
- 如果仿真里很好但真机上很差,你怎么排查?
- 你怎么评估一个机器人系统的稳定性?指标有哪些?
- 如果让你设计一个多传感器融合方案,你会怎么做?
- 时间同步你怎么做?硬件同步还是软件同步?
- 如果时间戳对不齐,你怎么处理?
- 你怎么做可观测性?关键日志记录哪些?
- 线上出问题怎么排查?先看什么?
- 你怎么控制成本?用的什么计算平台?
- 你怎么跟进机器人领域的最新进展?最近看了什么?
- 如果让你从零搭建一个机器人算法团队,你会怎么招人?
- 你觉得机器人落地最大的瓶颈是什么?
- 反问:团队现在做的是哪款产品?
- 手撕:实现一个简单的 A* 算法,要求支持栅格地图和障碍物。
《参考解析》
定位与建图(3~7 题):先答清方案选型依据而不是名字——激光 SLAM 在结构化室内精度稳、对光照免疫但纹理缺失时退化在几何对称场景;视觉 SLAM 信息密度高、能出语义和回环,但受曝光与快速运动影响。融合的主流做法是松耦合(各自出位姿后用 EKF/因子图做后端融合)与紧耦合(把特征或点到面残差一起进优化),后者精度高但工程复杂。激光与视觉冲突时没有「一律听谁」的答案,要做的是置信度门控:分别看内点率、残差、退化方向(用信息矩阵特征值判断某个自由度是否可观测),谁在退化方向上不可信就降谁的权重,必要时退化方向用另一路或里程计兜住,并把这个「降级」显式打日志。地图上,栅格地图适合规划和占据更新,点云/TSDF 保留几何细节,很多系统是两套并存。动态物体不能靠把点删干净:静态层用带占据概率的对数几率更新加射线清除被穿越的栅格,动态层另开一层靠跟踪/语义给短时效标记,规划时对动态层做膨胀并预测其运动,否则地图会一会儿有障碍一会儿没障碍地抖。
规划与手撕 A(8~10 题、手撕)**:全局规划在栅格上常用 A/Dijkstra(工程上多是 A* 加 JPS 之类的跳点加速),RRT/RRT* 用在维度高、没有先验地图或需要动力学可行性采样的场景。配合方式是全局规划只出粗粒度的路径/航点,频率极低(按秒或事件触发),局部规划在局部代价地图上高频滚动优化,同时负责避障。局部死锁的通用处理是分层状态机:先加大膨胀半径与代价权重试一次,不行就后退或绕行重规划,再不行抬到全局重规划换拓扑路径,最后才走「停车等人」的安全策略。根治手段是把时间维度加进搜索(时空 A*)或给动态障碍预留让行窗口,避免只做空间规划导致两车对着顶。手撕 A* 的得分点:open 用优先队列(懒删除即可,不必实现 decrease-key)、closed 集合防止重复扩展、启发式 h 要一致(栅格四邻接用曼哈顿、八邻接用 octile,别直接拿欧氏距离配八邻接导致 reopen)、八邻接要防切角(不允许斜穿两个障碍),以及外层加节点数上限防死循环。g/h/f 的更新与 tie-break 说清楚,比把代码写完更重要。
轨迹优化(11~12 题):minimum snap 是把轨迹写成多项式、以 jerk/snap 的二次型为目标、以走廊、起终点状态和动力学上下界为约束的 QP,好处是目标可解析、约束线性、能保证 C³ 连续适合四旋翼。可行性出问题时按代价从小到大依次放宽:先降速与加长时间分配(time reallocation 是最有效的一招),再放宽走廊约束或抬升飞行高度,然后退回更保守的规划器(直线 + 速度整形、样条),全部失败才触发急停。关键是把每次降级的原因和触发量记下来,否则调参时根本不知道系统在哪种场景里长期降级运行。
控制与频率/延迟(13~15 题):MPC 的价值在于显式处理约束与预测未来,代价是算力与建模误差;PID(含级联 PID、前馈 + 反馈)在算力紧张、模型不准时反而稳。真实系统常见的折中是「局部规划用 MPC 出速度指令,底层姿态用 PID 高频闭环」。频率对齐的做法是给轨迹加时间索引:规划器出的是带时间戳的轨迹,控制器按当前时刻采样/插值,而不是消费「最新的一条路径」——后者在规划频率抖动时会直接造成速度跳变。控制延迟的补偿分三块:把执行器与通信延迟建模进预测(MPC 里显式加 delay 状态)、用状态外推做短时前瞻、以及测量端做时间戳对齐;延迟大且抖动大时先降速换稳定性。
状态估计与容错(16~17 题):EKF 做一阶线性化,UKF 用 sigma 点过非线性、在强非线性下更准但计算量高一个量级;工程里错误状态 EKF(ESKF)用得更广,因为姿态用误差量参数化能避开万向锁与四元数归一化约束。判据是想清楚「观测量相对于状态有多非线性、算力行不行」。传感器故障检测用新息(残差)的卡方检验与一致性检查:连续多帧残差超出协方差门限就标记该路异常,配合冗余传感器做投票/降权(三路取中值比两路互相甩锅好),并识别退化方向。容错策略要分级:降权→切换备份源→切安全模式(限速、就近降落/停车),同时上报故障码,最忌讳静默地继续用坏数据。
仿真验证与 Sim2Real(18~20 题):仿真器按需求选——Gazebo 生态全但物理一般,MuJoCo 适合接触与足式,Isaac Sim 能大规模并行与高保真渲染,自研轻量仿真用于回归。Sim2Real 的关键工作是域随机化(质量、摩擦、延迟、噪声、光照)、给执行器建真实模型(推力曲线、死区、响应延迟),以及把真实日志回放进仿真做可复现回放。「仿真好真机差」的排查要二分而不是猜:先查标定与坐标系(外参、时延、单位、坐标系约定)——这是最高频的根因;再做纯控制/纯感知的隔离测试(把真实感知喂给仿真控制、把仿真真值喂给真实控制);然后看动力学建模与未建模效应(地面效应、振动、松动);最后才是算法本身。顺序反了会花几天调参数却发现问题出在时戳错了 100ms。
多传感器融合与时间同步(22~24 题):融合方案先定架构(前融合/特征级/后融合)再定滤波器与因子图——离线标定 + 在线优化(如滑动窗口因子图)在回环与全局一致性上明显优于纯滤波。同步优先级:硬件同步(共用 PPS/触发、PTP 授时)优于软件同步,软件侧用统一时钟域 + 按测量时刻插值或短时外推对齐到同一时间戳。时间戳对不齐时不要直接把旧数据当新数据用:把已知的固定延迟标出来做平移补偿,抖动部分要么进滤波器作为状态在线估计延迟,要么限制使用窗口(超过阈值丢帧而不是硬塞),并统计「丢帧率 / 外推比例」作为健康指标。
指标、可观测性与开放题(21、25~30 题):稳定性要分层给指标——定位(RMSE、漂移率/百米的百分比、重定位成功率)、建图(闭环误差、地图一致性)、规划(成功率、重规划次数、最小安全距离)、控制(跟踪误差、超调、速度抖动)、系统(任务成功率、平均无故障时间、降级触发次数)。可观测性上,日志要固定记录时间戳与时钟源、各 topic 频率与延迟、每一步的耗时分解、重规划与降级事件、以及估计器的协方差/新息,线上排查先看「哪个模块的频率或延迟先异常」,再顺着时间线看第一个异常量而不是最后一个报错。开放题(成本与算力平台、技术跟进、招人、落地瓶颈)答的是判断力:算力按任务分核(感知/规划/控制相互隔离),能接受降级的模块不上高算力平台;跟进靠读论文 + 跟开源仓库的 issue 与 release,说得出最近具体看的一两件事;招人按链路补齐(估计、规划、控制、基础设施各有能 owner 的人)而不是招一堆同方向的人;机器人落地最大的瓶颈通常是长尾场景下的可靠性验证成本与硬件一致性,而不是单点算法精度。