速腾聚创感知算法岗笔试复盘:从点云处理到C++手撕的全链路解析
2026/9/1 4:13:27 网站建设 项目流程

每年秋招,感知算法岗都是自动驾驶和机器人赛道最卷的方向之一。速腾聚创作为国产激光雷达头部厂商,它的笔试题目在行业内一直有“范围广、基础深、手撕硬”的说法——既考你对点云处理和深度学习的基本功,又考你在真实工程场景里的应变能力。这篇文章我带你完整拆一遍2023年秋招速腾聚创感知算法岗的笔试思路,从题型分布、核心考点、手撕代码到避坑经验,一次性讲透。不管你是正在准备秋招的应届生,还是想转行感知方向的工作党,这篇复盘都能帮你少走不少弯路。

声明一下,我不可能拿到官方原题,以下内容是基于当年参加笔试的同学回忆、社区讨论和我个人对岗位要求的理解做的一份系统整理。重点不是押题,而是帮你把知识点串联起来,搞懂这类笔试到底在筛什么人、考什么能力。

1. 笔试题型与整体策略:先摸清出题人想要什么

速腾聚创的感知算法笔试,整体风格属于“基本功优先,工程落地导向”。它不像有些大厂那样大量堆砌冷门论文细节,也不会像Kaggle比赛一样让你端到端调模型。它的出题逻辑非常明确:考核你对激光雷达感知链路的基础理解、数学推导能力、C++工程素养,以及面对真实点云数据时的处理思路。

从题型分布来看,笔试通常由三大部分构成:选择题/填空题、简答与推导题、手撕代码题。选择题数量大概在15到20道,覆盖点云处理、矩阵论、概率统计、深度学习基础;简答与推导题一般有3到5道,需要你动笔写公式、画框图、讲清思路;手撕代码题通常有1到2道,限时大概30到45分钟,考查C++或Python功底。

从难度梯度来看,笔试前30%是送分题,考察基础概念,比如“体素滤波的作用”“ICP的输入输出是什么”,这部分只要认真准备过都能拿分。中间50%是拉分题,需要你综合运用知识,比如“给定一个旋转矩阵,求对应的欧拉角”“解释PointNet++如何做局部特征聚合”,这部分考察的是理解深度。最后20%是压轴题,往往结合工程场景,比如“在地面分割中如何防止过分割”“手写一个KD-Tree最近邻搜索”,这部分直接拉开差距。

这里我必须强调一个策略上的认知:速腾这类硬件公司的感知岗,笔试筛选的核心指标不是“你会多少种SOTA模型”,而是“你有没有能力把算法落到实际产品中”。因为激光雷达公司做的感知算法,跟纯做L4 Robotaxi的算法不完全一样,它更强调对传感器本身特性的理解——比如机械式雷达和固态雷达的点云分布差异、回波噪声模型、标定误差对感知的影响。所以在准备时,别只盯着顶会论文,地基性的知识反而要砸实。

再补充一点,笔试虽然不直接考编程环境搭建,但如果你对PCL、Eigen、Open3D这些常用库的接口不熟,手撕题会写得很难受。建议笔试前把PCL的filter、segmentation、registration模块,Eigen的几何模块常用接口过一遍,不需要逐行背,但核心API的输入输出要能默写出来。

2. 数学基础与优化理论:这部分决定你的上限

速腾笔试的数学题不走偏怪路线,但非常看重推导的完整性和严谨性。经常出现的考点集中在三个方向:矩阵运算与求导、概率统计建模、最优化方法的基础应用。这三个方向看似是本科生就会的东西,但放到激光雷达感知的场景里,需要你灵活变通,而不是只会套公式。

2.1 矩阵求导与刚体变换:写错一个符号就全盘皆输

在感知算法里,矩阵求导最常见的场景就是点云配准和状态估计。ICP的每一步迭代都需要对误差函数求导,如果你的Jacobian矩阵推导错了,代码写得再漂亮也白搭。笔试时经常给一个简化版的ICP问题:已知两组对应点,求使误差最小的旋转矩阵和平移向量,然后要求你写出求解步骤和闭式解。

这类题的核心是理解SVD解法。你需要记住一个关键结论:对于两组零均值化后的点云,最优旋转矩阵可以通过计算协方差矩阵H = ∑(p_i - p̄)(q_i - q̄)^T,然后对H做SVD分解 H = UΣV^T,得到 R = VU^T。注意这里有个坑:如果det(VU^T) = -1,说明这个矩阵是反射矩阵,需要取R = V diag(1, 1, -1) U^T,保证R是合法的旋转矩阵。这个细节很多人都栽过,推导时一定要写清楚。

矩阵求导这块,笔试不要求你死记硬背向量对向量求导的完整张量形式,但要求掌握链式法则和常用的二次型求导公式。比如∂(x^T A x)/∂x = (A + A^T)x,这个公式在推导最小二乘解时处处用到。再比如对刚体变换T = [R | t]的扰动模型,左乘扰动模型∂(T p)/∂δξ = [I₃ - (R p + t)∧]这种形式在LOAM、LIO-SAM里到处都是,笔试如果考到状态估计相关推导,大概率会涉及。

2.2 概率与滤波:从贝叶斯到卡尔曼的工程直觉

概率统计在感知笔试中的出镜率很高,但考法非常工程化。比如给你一个激光雷达的测距噪声模型,假设它服从高斯分布,问你如何融合多个传感器的观测来估计目标位置。这种题表面考的是概率,实际考的是贝叶斯估计和卡尔曼滤波的基本框架。

一个经典考点是高斯分布的乘积。两个高斯分布的乘积仍然是一个高斯分布(未归一化),这个结论在融合多个传感器观测时非常有用。笔试可能会让你推导:假设先验N(x|μ₁, Σ₁)和似然N(x|μ₂, Σ₂),求后验分布的均值和协方差。答案是 Σ = (Σ₁⁻¹ + Σ₂⁻¹)⁻¹,μ = Σ(Σ₁⁻¹μ₁ + Σ₂⁻¹μ₂)。这就是卡尔曼滤波更新步的信息形式。如果你能顺势写出信息滤波和卡尔曼滤波的等价性,这道题基本就稳了。

另一个高频考点是栅格占用概率的更新。在Occupancy Grid Map里,每个栅格用log-odds表示占用概率,更新公式是 l_new = l_old + log(p(z|x) / (1 - p(z|x)))。笔试可能会让你推导为什么用log-odds而不是直接用概率,答案是数值稳定性好、避免接近0或1时概率相乘下溢、支持多帧累加。这种题不考计算量,考的是你是否真正理解算法设计的动机。

2.3 最小二乘与鲁棒核:真实点云没有完美对应

提到最优化,笔试的高频考点是最小二乘问题,尤其是非线性最小二乘的求解框架。常见的出题方式是:给你一个点云配准或者拟合问题,让你写出目标函数、线性化方式、迭代求解步骤。这里要特别注意Gauss-Newton和Levenberg-Marquardt的区别——LN在增量方程中加入阻尼项λ,当λ大时退化为一阶梯度下降,λ小时接近GN。写出增量方程(H + λI)Δx = -g,然后解释λ的调节策略,是标准答案。

鲁棒核函数也是一个容易考的点。因为真实点云中必然存在外点,比如动态物体上的点、边缘反射异常的点,如果使用标准的最小二乘,一个离谱的外点可能直接带偏整个配准结果。Huber核、Cauchy核、Tukey核是常见的鲁棒核函数。笔试可能会让你画Huber损失函数的图像,并解释它和L2损失的区别:Huber在误差小于δ时按二次函数增长,大于δ时按线性函数增长,因此对外点有抑制作用。理解这个思想比背公式更重要。

3. 点云处理核心题解析:感知地基必须打牢

对激光雷达感知算法工程师来说,点云处理是吃饭的本事。速腾笔试在这一块的题量是最大的,覆盖了滤波、分割、配准、特征提取、目标聚类等常见模块。这些知识在点云库PCL里都有现成实现,但笔试不会让你调用库函数,而是考你对算法原理和参数的把握。

3.1 降采样与滤波:为什么用体素不用均匀采样

关于降采样,笔试常考的点是体素滤波(Voxel Grid Filter)和均匀采样(Uniform Sampling)的区别。体素滤波的思路是:把空间划分成固定边长的小立方体(体素),每个体素内用一个代表性点替代所有点,代表点可以是体素中心,也可以是体素内所有点的重心。这个操作同时实现降采样和去噪,保持点云整体形状结构。

笔试喜欢问的一个细节是体素边长怎么选。边长太大,会丢失几何细节,导致后续配准或检测精度下降;边长太小,降采样效果不明显,计算量还是很大。经验法则是根据场景密度来定,比如室外道路场景,如果原始点云在10米处横向点间距大约2到3厘米,那么体素边长设在0.05米到0.1米是较为均衡的选择。另一个细节:如果用重心替代体素中心,结果对噪声更稳健,但计算量略大。PCL里默认用重心,源码里就是这么实现的。

还有一个常考的点是统计学滤波(Statistical Outlier Removal),原理是计算每个点到邻域的k个近邻的平均距离,假设这个平均距离符合高斯分布,距离均值超过μ + ασ倍的点视为离群点并剔除。笔试如果考到这个,大概率会问你α和k怎么选。k取20到50之间比较常见,α取1.0到3.0之间,α越大剔除越保守。这里有个工程经验:对机械式激光雷达,近距离的点云密度大,远距离密度小,用一个全局的α可能在近处误删点、在远处漏删点,所以更适合在局部区域分别统计或者做自适应阈值。

3.2 平面分割与地面提取:RANSAC之外的第二手准备

地面分割在结构化道路感知里几乎是必考的环节。笔试最常见的考法是让你写出RANSAC拟合平面的步骤,并分析其参数设计。RANSAC的思路很朴素:随机选三个点确定一个平面,计算所有点到该平面的距离,距离小于阈值的点作为内点,统计内点数量,重复多次取内点最多的平面作为最终结果。你需要写出完整步骤并说明distance threshold和迭代次数怎么定。

但光会RANSAC还不够,现在地面分割的主流方案是三点法或射线法。笔试如果加大难度,可能给你一个不均匀分布的点云,问RANSAC为什么效果差。答案在于:激光雷达的点云近处密集、远处稀疏,RANSAC对全局用一个距离阈值,会导致远处地面上真实的点被当成外点,而近处地面外的一些点可能被误认为内点。

更稳健的方案是分块处理。把点云按方位角划分成若干扇形区域,在每个区域内沿射线方向做地面拟合,通过相邻点的坡度或高度差判断是否属于地面。这种方法对应了速腾、禾赛等雷达在道路场景中的常用处理策略。笔试你如果能把RANSAC的局限性和工程替代方案讲清楚,会给阅卷人留下“有实战经验”的印象。

3.3 配准与特征提取:ICP和NDT的优劣分野

配准在激光雷达感知中主要用于建图和定位。ICP(Iterative Closest Point)是绝对的高频考点。笔试会让你写出ICP的完整流程:找最近邻对应点、计算变换、变换点云、迭代直至收敛。然后会追问:ICP的缺点是什么?答案是:依赖初始位姿、容易陷入局部最优、对噪声和外点敏感。

NDT(Normal Distribution Transform)是另一个常考方法。它把空间划分成体素网格,对每个体素内的点云用高斯分布建模,配准时优化的是点在该体素分布下的概率。和ICP相比,NDT对初始位姿的要求更低,收敛更快,但不适合动态场景。笔试如果问“场景中有大量动态物体,怎么选配准方案”,你需要从体素大小、动态物体滤除、多帧累积等角度展开,而不是只背优缺点。

关于特征提取,速腾笔试考过2D和3D特征的对比。比如FPFH(Fast Point Feature Histogram)是怎么提取的,它为什么比PFH快。核心是FPFH对每个点计算简化特征直方图,再在邻域内加权聚合,时间复杂度从O(nk²)降到O(nk)。还会考到法向量估计,PCA最小二乘拟合局部邻域的切平面,最小特征值对应的特征向量就是法向量方向。这个考法很基础,但你需要特别说明法向量方向的一致性处理,否则后续特征计算会出问题。

4. 深度学习与目标检测题:从网络结构到工程落地的全方位考察

除了传统点云算法,深度学习在感知链路中的比重越来越大。速腾的笔试也会覆盖3D目标检测、BEV感知、多模态融合这些热点方向。这部分考的不是简单的know-how,而是要求你能理解各种结构的适用场景和计算开销,在工程上做平衡。

4.1 从PointNet到PointNet++:排列不变性与局部特征

PointNet是点云深度学习的开山之作,笔试几乎必考。常考的是PointNet如何实现排列不变性——通过对称函数max pooling聚合所有点的特征,得到一个全局特征向量。但你如果只说这点就太浅了,面试官希望你能解释max pooling作为对称函数的信息损失:全局max会丢失局部几何细节,因此有了PointNet++。

PointNet++的核心是分层抽取局部特征,通过采样、分组、特征提取三个步骤完成对局部区域的建模。笔试可能让你画出PointNet++的流程图,并解释FPS(最远点采样)的作用。FPS保证采样点尽可能均匀覆盖空间,避免特征集中在点云密集区域。这里有个细节:FPS的复杂度是O(n²),在处理大规模点云时是性能瓶颈,所以工程上常用随机采样代替FPS。BAT的很多优化里就做了这个替换。如果你在笔试时能点出这个计算复杂度的考虑,说明你真的在工程里跑过模型。

4.2 BEV检测与Transformer的崛起:鸟瞰图的“降维打击”

3D目标检测有一个重要分支是BEV(Bird's Eye View)方法。把点云投影到鸟瞰视角,在2D网格上做检测,好处是目标尺寸、朝向在BEV空间里更容易建模,而且天然适合和2D图像特征做融合。卷完Lift-Splat-Shoot、BEVFormer之后,这个方向几乎成了自动驾驶感知的标配。

笔试常考的是BEV表示和Range View表示的对比。BEV的优点是空间概念直观、目标尺度一致、跨传感器融合方便;缺点是稀疏区域特征少,需要专门的2D CNN或Transformer处理。Range View(距离视图)保留原始传感器结构,计算量小,但目标特征在图像空间里会被拉长变形,3D框回归不稳定。你在答题时如果能结合速腾的激光雷达产品线来讲——比如不同线束对BEV分辨率的影响——会更有说服力。

Transformer在感知中的应用也是热点。笔试可能会问自注意力机制的时间和空间复杂度,或者问为什么在感知里要限制注意力范围。答案:全局自注意力是O(N²)的计算和内存复杂度,N是BEV网格数量,对于100x100的网格就是10⁴个token,计算量还很可观。工程上通过局部窗口注意力(如Swin Transformer的窗口设计)或者可变形注意力(如Deformable DETR)来降低复杂度,只关注一部分稀疏的关键采样点。这类题的得分关键在于你是否有复杂度分析的意识,而不只是复述概念。

4.3 Anchor与NMS:不要小看“过时”的组件

现在很多新模型都声称去掉了Anchor,但笔试依然会考Anchor的概念,因为它是理解检测模型的基础。Anchor是预设的候选框,需要设置尺度、长宽比、朝向角度。3D检测中的Anchor一个特殊之处是朝向角度的设置。因为BEV空间里物体朝向很重要,如果朝向角预测错90度,IoU可能很低但视觉上看着差异不大,所以很多模型会额外预测角度残差。

NMS(非极大值抑制)也是高频考点。笔试常问NMS的流程和缺点。标准NMS先按置信度排序,保留最高分框,删除与它IoU超过阈值的其他框,然后迭代处理剩余框。缺点是需要手动调阈值,拥挤场景下容易误删,稀疏场景下可能漏检。改进方案有Soft-NMS(按IoU降低分数而不是直接删除)、DIoU-NMS(考虑中心点距离)等。虽然很多现代的端到端方法已经在用匈牙利匹配替代NMS,但理解NMS仍然是基础功。

5. 手撕代码题:在有限时间内展现工程能力

手撕代码是速腾笔试里最刺激的环节,限时短、环境不友好,拼的就是基本功和心态。根据社区反馈,速腾的手撕题重点在C++和基本数据结构的灵活使用,偶尔会掺一些简单几何计算。这部分我重点说一下常见的题型和写法思路。

5.1 必练的C++基础:智能指针与内存管理

感知算法工程师写C++不是写业务代码,而是写性能敏感的计算模块。笔试手撕的时候,如果题目要求实现一个点云容器,你应该立刻想到用vector存储点坐标,用shared_ptr或unique_ptr管理原始点云数据。裸指针不是不能写,但一个不留意就是内存泄漏或悬垂指针。

数据结构的代码要写得像背过一样流畅,比如K近邻搜索的KD-Tree实现。笔试如果让你实现最近邻搜索,你至少需要写出KD-Tree的构建和查询两个函数。构建部分就是递归切分,按维度轮流选,取中位数作为节点;查询部分从根节点往下走,维护一个当前最优距离,回溯时判断搜索另一侧子空间是否有必要。这里有个关键优化:优先访问更近一侧的子节点,可以在回溯时减少大量无效访问。

关于智能指针,你会经常看到std::shared_ptr和std::unique_ptr的选择问题。点云数据共享的场景多,用shared_ptr可以方便多个模块共享同一份数据,省去拷贝;但要注意循环引用问题,用weak_ptr破环。笔试如果时间充裕,可以在代码里故意用unique_ptr存储,然后多处操作时用原始指针引用,展示你对所有权语义的理解。这个细节在面试点评时会加分。

5.2 几何计算与点云模拟:高频手撕题实战解析

几何计算在手撕题里也非常常见。比如给定一个平面方程Ax + By + Cz + D = 0,计算点到平面的距离;给定一个旋转矩阵,求对应的欧拉角;或者给两条直线,判断是否相交并求交点。这些题本身不难,但在限时环境下容易因为三角函数公式记错而卡壳,所以要提前把常用公式烂熟于心。

点云模拟题也值得重点准备。比如题目说“生成一个包含两个空洞的平面点云,实现一个函数找出所有空洞区域”,这种题看着唬人,实际考察的还是聚类和邻域搜索。你可以用KD-Tree对每个点找近邻,近邻数量显著低于平均值的点所在区域就是空洞边缘。还有一种常见考法是“给定无序点云,按距离聚类”。可以用BFS或并查集实现,两点间距离小于阈值就归为一类。这种题目一看就是工程场景简化来的,考察的不是你知不知道一个现成的库函数,而是能不能用基础数据结构解决一个看起来“自动”的问题。

5.3 代码规范与注释:关键变量要写清意图

手撕代码时有一个很常见的问题:代码写对了,但变量命名随意,注释缺失,导致阅卷人很难快速理解你的思路。笔试环境一般不要求你写出生产级代码,但至少要做到结构清晰、关键算法步骤有注释。

我建议养成这样的代码风格:先用注释写出整体流程,比如“// Step 1: 构建KD-Tree”,然后逐行实现。注释不需要写废话,但要说清楚为什么这么做。比如“// 用中位数切分,确保左右子树规模接近,避免退化”就是一则有价值的注释。函数内部把核心中间结果用const声明,能有效避免误修改。整体代码控制在百行左右,宁可写得简洁清楚,也不要把各种边界情况堆成一团。

6. 常见失分点与备考路线:比刷题更重要的底层逻辑

最后这部分我想专门聊聊避坑和备考。因为我见过太多基础不错的同学,笔试分数却很不理想,问题往往不是知识不够,而是踩了各种意想不到的坑。这里整理一份常见失分点和备考建议,希望对你有实际帮助。

6.1 笔试现场最容易踩的五个坑

第一个坑是在推导题上跳步。数学推导题最忌讳一步得出答案,中间省略关键过程。阅卷人看的是你推导的思路是否正确,不是只看最终结果。比如SVD求解旋转矩阵,你直接写R = VU^T,但没写为什么在det特别情况下要修正,哪怕结果对了也可能被扣分。

第二个坑是算法选型不考虑数据规模。比如点云聚类题,你说用全局O(N²)遍历距离判断,如果N是10万级别,这个复杂度根本跑不动。你需要先分析数据规模,再提出用KD-Tree或栅格哈希做加速。这个问题暴露的是工程意识不足,不只是知识问题。

第三个坑是深度学习题只答结论不答原因。比如问你为什么PointNet++比PointNet效果好,你只答“因为它有局部特征聚合”,没有解释输入的置换不变性在局部和全局的差别,没有分析不同采样策略的影响,分数就上不去。

第四个坑是手撕题不关注内存效率。有些题可以用递归解决,但递归深度大了会栈溢出。比如并查集实现聚类时,路径压缩写成递归版本,可能在大规模点云上爆栈。用迭代式路径压缩才能保证稳健。

第五个坑是时间分配失衡。有些人在选择题上死磕一道不确定的题,结果后面的大题写不完。我的建议是:单选题如果超过两分钟还没头绪,先标记跳过,把会做的题全部拿到分,再回头处理剩余的题。最后至少留40分钟给手撕题,因为它分值最高。

6.2 考前一个月的高效准备节奏

针对速腾这类激光雷达公司的感知算法岗,我建议考前一个月按三个阶段安排:第一周打基础,把点云处理、矩阵论、概率论的核心公式和推导过一遍,尤其是ICP、NDT、RANSAC、卡尔曼滤波这些高频考点,做到能独立推导;第二周攻深度学习和手撕题,把PointNet++、BEV检测、Transformer注意力、NMS的代码细节过一遍,重点练KD-Tree、聚类、RANSAC、体素滤波的C++实现;第三周模考冲刺,按真实笔试的时间限制做整套模拟题,训练时间分配和抗压能力。

一个容易被忽略的准备点是熟悉速腾的产品线。笔试不太会直接考“速腾RS-LiDAR-M1的视场角是多少”,但如果你在答题的时候能结合固态激光雷达的扫描特性来讲点云稀疏区域的处理方法,或者结合补盲雷达的安装位置来分析遮挡问题,会让阅卷人觉得你真正理解了这个岗位的工作场景。这类“懂行业”的隐性加分项,往往比多答对一道选择题更有价值。

6.3 给下一届考生的一句实在话

回头看这场笔试,我最深的体会是:它筛选的并不是“刷题量最大”的人,而是“真正理解感知链路”的人。很多同学把精力花在背最新的SOTA模型结构上,结果在基础推导题上栽了跟头;也有一些同学把PCL、Open3D用得很熟练,但手撕题要求脱离库写核心逻辑时却无从下手。速腾的题目设计明显在引导你关注算法底层的数学原理和工程约束,这是做传感器算法必须有的素养。

关于备考,我的建议是不要只盯着“笔试通过”。把这场笔试当作一次系统梳理知识的机会,把点云处理、状态估计、3D检测、C++工程这几个方向都扎扎实实过一遍。无论你是否最终进入速腾,这套能力体系在自动驾驶、机器人、工业视觉领域都是通用的硬通货。把基础打牢,后面的路才会越走越宽。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询