1. 系统架构与设计理念
这套自动驾驶规划系统的核心思想源自Apollo EM Planner的经典分层架构,但针对教学和科研场景进行了模块化重构。我在实际开发中发现,将路径规划与速度规划解耦的设计,能够显著降低系统复杂度,特别适合中小型团队进行算法迭代。
系统采用C++14标准开发,整体架构分为三个主要层次:
- 感知接口层:负责接收和预处理传感器数据
- 规划算法层:包含动态规划路径规划、速度规划等核心模块
- 执行控制层:处理轨迹跟踪和车辆控制
关键设计决策:选择动态规划而非A或RRT等算法,主要考虑到DP在结构化道路场景下的两个优势:一是能保证找到全局最优解(或近似最优解),二是计算效率可满足实时性要求(在100ms内完成规划)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 参考线生成模块实现细节
2.1 Clothoid曲线数学原理
Clothoid曲线(又称欧拉螺旋)的曲率k随弧长s线性变化:
code复制k(s) = k0 + σ·s
其中k0为初始曲率,σ为曲率变化率。这种特性使其特别适合描述车辆转向过程,因为方向盘的转动本质上也是在连续调整曲率。
实际实现时,我们采用分段Clothoid拟合的方法:
- 将原始路点按5米间隔重采样
- 对每两个相邻点计算初始曲率和曲率变化率
- 使用Ipopt求解器优化参数,保证G2连续性
2.2 坐标转换实现技巧
Frenet坐标系转换有个常见陷阱:当参考线曲率较大时,简单的投影法会导致坐标震荡。我们的解决方案是:
cpp复制// 改进的投影算法伪代码
FrenetPoint CartesianToFrenet(const CartesianPoint& p) {
double min_dist = INFINITY;
FrenetPoint result;
// 先在粗粒度上搜索最近点
for (double s = s_min; s <= s_max; s += 5.0) {
CartesianPoint ref = reference_line.interpolate(s);
double dist = distance(p, ref);
if (dist < min_dist) {
