3. 轨迹规划基础

大家好,我是你们这堂课的老朋友。今天咱们聊点实在的——轨迹规划的基础。很多新手工程师容易把“路径规划”和“轨迹规划”混为一谈,觉得不就是找条路走嘛。嗯,这里面的门道可不少。我当年刚入行时也犯过这个错,结果在实车测试时差点撞上锥桶,从那以后我就把这两个概念刻在骨子里了。

路径规划 vs 轨迹规划:到底差在哪?

说白了,路径规划只关心“走哪条路”,它输出的是空间上的一条几何曲线。比如从A点到B点,绕过障碍物,路径规划告诉你:沿着这条线走就行。它不考虑时间,也不管速度。

而轨迹规划呢?它要回答“怎么走”。不仅要知道路径,还要知道每个时刻的位置、速度、加速度,甚至加加速度。说白了,轨迹 = 路径 + 时间信息。

我举个例子你就明白了。你开车去公司,导航给你规划了一条路线——这就是路径规划。但具体什么时候加速、什么时候减速、路口怎么平稳通过——这就是轨迹规划的事。你想想看,如果只有路径没有轨迹,车开到路口突然急刹,乘客不骂娘才怪。

核心区别一句话总结:

  • 路径规划:空间上的几何曲线,无时间维度
  • 轨迹规划:时间上的运动状态序列,包含位置、速度、加速度

我在项目中遇到过最典型的场景是:路径规划给出了一条完美的避障路径,但轨迹规划没跟上,结果车辆在弯道处速度过快,直接冲出车道。所以这两个模块必须协同设计,缺一不可。

为什么需要Frenet坐标系?

好了,路径和轨迹的区别搞清楚了。那问题来了:我们用什么坐标系来描述轨迹?

常见的笛卡尔坐标系(x, y)在直道上挺好用,但一遇到弯道就麻烦了。你想想看,一条弯曲的道路,用笛卡尔坐标描述,每个点的x和y都在变,而且道路曲率越大,计算越复杂。更头疼的是,车辆的横向和纵向运动在笛卡尔坐标系下是耦合的,解耦起来非常麻烦。

这时候,Frenet坐标系就派上用场了。它把问题简化成两个独立的方向:

  • 纵向(s):沿着道路中心线的距离
  • 横向(d):偏离道路中心线的距离

说白了,Frenet坐标系就是“贴着路走”的坐标系。道路怎么弯,坐标系就怎么弯。这样一来,车辆的横向控制(比如变道)和纵向控制(比如加减速)就可以分开处理,互不干扰。

我个人习惯:在做轨迹规划时,先用Frenet坐标系把问题拆成横向和纵向两个子问题,分别求解,再合并成完整的轨迹。这样代码结构清晰,调试也方便。

Frenet坐标系与笛卡尔坐标系的转换

实际应用中,我们通常需要在Frenet坐标系和笛卡尔坐标系之间来回切换。比如传感器数据是笛卡尔坐标系的,但规划是在Frenet坐标系下做的,最后控制指令又要转回笛卡尔坐标系。

转换公式其实不复杂,但要注意几个关键点:

转换方向 输入 输出 关键参数
笛卡尔 → Frenet (x, y, θ, v, a) (s, d, ṡ, ḋ, d̈) 参考线位置、曲率
Frenet → 笛卡尔 (s, d, ṡ, ḋ, d̈) (x, y, θ, v, a) 参考线位置、曲率

这里我特别提醒一点:参考线的质量直接决定了转换的精度。如果参考线本身不平滑,转换出来的轨迹也会有问题。我曾经因为参考线采样点太稀疏,导致轨迹在弯道处出现抖动,查了两天才找到原因。

避坑指南:我曾经在Frenet转笛卡尔时忽略了道路曲率的变化率,结果生成的轨迹在曲率突变处出现加速度跳变。后来我加上了曲率的一阶导数补偿,问题才解决。记住:曲率变化率不可忽略!

Frenet坐标系下的轨迹表示

在Frenet坐标系下,一条完整的轨迹可以表示为:

纵向轨迹:s(t) = s₀ + ṡ₀·t + ½·a_s·t² + ...
横向轨迹:d(t) = d₀ + ḋ₀·t + ½·d̈·t² + ...

实际工程中,我们通常用多项式来表示。比如五次多项式可以保证位置、速度、加速度都连续。我一般用五次多项式做横向规划,用四次多项式做纵向规划——这样既能保证平滑性,又不会过拟合。

你可能会问:为什么横向和纵向用不同阶数的多项式?嗯,这是因为横向运动(比如变道)对平滑性要求更高,而纵向运动(比如跟车)更关注响应速度。这是我踩过几次坑后总结出来的经验。

知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图:

轨迹规划基础:知识体系 路径规划 vs 轨迹规划 路径规划:空间几何曲线 轨迹规划:时间+空间状态 协同设计:缺一不可 Frenet坐标系 纵向 s:沿道路中心线距离 横向 d:偏离中心线距离 横纵向解耦,独立规划 坐标转换 笛卡尔 ↔ Frenet 双向转换 参考线质量决定精度 注意曲率变化率补偿 轨迹表示方法 多项式拟合(五次/四次) 保证位置/速度/加速度连续 横向平滑优先,纵向响应优先

这张图把本章的核心内容串起来了。你仔细看,路径规划和轨迹规划是并列关系,Frenet坐标系是它们之间的桥梁,坐标转换和轨迹表示则是具体实现手段。搞懂这四个模块,轨迹规划的基础就算打牢了。

本章要点回顾:

  1. 路径规划只关心空间路径,轨迹规划还要考虑时间
  2. Frenet坐标系把横纵向解耦,简化规划问题
  3. 坐标转换时注意参考线质量和曲率变化率
  4. 多项式拟合是常用的轨迹表示方法,阶数选择有讲究

好了,今天就聊到这儿。这些概念看起来简单,但真正用好还需要大量实践。我建议你找个开源轨迹规划库,把Frenet坐标系的转换代码跑一遍,亲手调调参数,感受会更深。