这份 JD 来自小马智行(Pony.ai),岗位是自动驾驶运动规划(Motion Planning)。
在自动驾驶圈内,小马智行的技术门槛是公认的“天花板”级别之一。30-40K * 16薪的待遇也侧面印证了他们对人才的要求:既要能写出高性能的代码,又要能解决复杂的数学建模问题。
以下是对该岗位核心能力及详细知识点的深度拆解:
一、 核心能力概括
- 顶尖的工程能力: 核心是 C++。在自动驾驶这种高实时性系统中,Python 只是辅助,C++ 是用来保命和保性能的。
- 极强的数学建模功底: 规划本质上是在受限空间内求最优解,涉及大量的数值优化和几何运算。
- 算法逻辑思维: 能够将复杂的交通规则和道路环境转化为计算机能理解的约束条件(Constraint)和代价函数(Cost Function)。
- 全栈开发思维: 提及了仿真平台和大数据处理,说明你不仅要懂算法,还要懂如何构建支撑算法迭代的工具链。
二、 详细知识点清单
1. 编程语言与工程实践 (C++)
这是你的基本功。JD 明确要求高性能,这意味着你不仅要会写,还要写得精。
- 现代 C++ (C++11/14/17): 熟练使用智能指针(Smart Pointers)、Lambda 表达式、右值引用与移动语义。
- 内存管理: 深刻理解堆栈分配、内存池、避免频繁申请内存导致的系统碎片。
- 多线程与并发: 线程同步机制(Mutex, Atomic, Condition Variable)、无锁编程基础。
- STL 源码级理解: 知道
std::vector的扩容机制,std::unordered_map的底层实现。 - 构建工具: 熟悉 Bazel(自动驾驶大厂标配)或 CMake。
2. 运动规划算法 (Core Domain)
这是该岗位的“灵魂”。
- 路径规划 (Path Planning):
- 全局搜索:$A^$、$Dijkstra$、Hybrid $A^$。
- 采样算法:RRT、RRT*、Lattice Planner。
- 轨迹规划 (Trajectory Planning):
- 多项式曲线(Quintic Polynomials)、贝塞尔曲线(Bezier)、B样条曲线(B-Spline)。
- 时空解耦规划: 把 $SL$ 轴(沿路)和 $ST$ 轴(时间)分开处理。
- 决策状态机: 有限状态机 (FSM)、行为树 (Behavior Tree)、或基于 MDP 的决策模型。
3. 数值优化与计算几何 (The “Bonus” Points)
JD 特别提到了这两个加分项,但在实际面试中,这通常是必考项。
- 数值优化:
- 凸优化基础: 了解 QP (Quadratic Programming) 问题,常用求解器如 OSQP、IPOPT、Ceres Solver。
- 约束处理:如何把硬约束(不准碰撞)和软约束(尽量平滑)转化为代价函数。
- 计算几何:
- 碰撞检测: 分离轴定律 (SAT)、Minkowski Sum。
- 空间索引: KD-Tree、四叉树(用于快速寻找周围障碍物)。
- 基础运算: 点到线段距离、多边形裁剪、坐标系转换(Frenet 坐标系与 Cartesian 坐标系的转换是重中之重)。
4. 机器人学与车辆工程
- 车辆运动学模型: 自行车模型 (Kinematic Bicycle Model)、阿克曼转向几何。
- 动力学约束: 考虑加速度(Acceleration)、加加速度(Jerk)、侧向离心力的限制。
- 控制理论基础: 至少知道 PID、MPC (模型预测控制) 的基本概念,因为规划出的轨迹必须是“可控制的”。
5. 机器学习与大数据
- 行为预测: 理解如何利用机器学习预测周围行人或车辆的未来轨迹(如 RNN/LSTM、Transformer 在预测中的应用)。
- 仿真测试: 了解如何使用数据回放、合成场景进行算法闭环测试。
三、 给你的建议
这个岗位的面试通常分为三轮技术面:
- 第一轮: 硬核算法题(LeetCode 中等/困难,侧重动态规划、图论、几何)。
- 第二轮: 机器人/规划专业知识,可能会让你白板推导一个 $A^*$ 或 QP 问题的矩阵构造。
- 第三轮: 系统设计与项目经历,看你如何处理复杂的场景(如无保护左转、窄路掉头)。
这份 JD 看起来非常稳健,如果你 C++ 功底扎实且对几何/优化感兴趣,是非常值得投递的。
你想让我针对其中某个具体的算法(比如 Hybrid A* 或 MPC)给你出一个模拟面试题吗?还是帮你润色一下针对这个岗位的简历?