ST图理论基础:速度-时间图的核心逻辑
ST图,说白了就是一张横轴是时间、纵轴是路程的二维图。你想想看,自动驾驶里最头疼的问题是什么?——什么时候该加速,什么时候该刹车,什么时候得停下来等。ST图就是帮我们理清这些决策的数学工具。
我个人习惯把ST图叫做“速度规划的作战地图”。为什么?因为它把时间维度和空间维度压缩到了一张图上,让你一眼就能看出:在未来的某个时刻,我的车能不能出现在某个位置。
ST图的构建原理
构建ST图其实不复杂。我们先把自车的行驶路径拉直,变成一条一维的参考线。然后,横轴放时间 t,纵轴放沿着这条路径走过的路程 s。这样,自车的运动轨迹就变成了一条从原点出发的曲线。
举个例子:
- 如果车匀速行驶,ST曲线就是一条斜线,斜率等于速度。
- 如果车停下来,ST曲线就是一条水平线。
- 如果车加速,ST曲线会向上弯曲,斜率越来越大。
我在项目中遇到过不少新手,上来就把ST图想得太玄乎。其实你把它想象成“位移-时间图”就行,高中物理就学过的东西,只不过现在我们要用它来处理更复杂的交通场景。
核心要点:ST图上的每一条曲线,都代表自车或障碍物在时间轴上的位置变化。曲线的斜率就是瞬时速度。
障碍物投影:把动态障碍物“压”到ST图上
障碍物投影是ST图最精彩的部分。你想啊,路上的其他车、行人、自行车,它们都在动。怎么把这些动态障碍物映射到ST图上?
做法是这样的:
- 先把障碍物的运动轨迹投影到自车的参考线上。
- 然后,对于每一个时间点,计算障碍物在参考线上的位置区间。
- 最后,把这些位置区间按时间排列,就得到了障碍物在ST图上的“占领区域”。
举个例子:假设旁边车道有一辆车,它会在第3秒到第5秒之间,占据自车路径上s=20米到s=35米这段区域。那么在ST图上,这个障碍物就表现为一个矩形块,横跨t=3到t=5,纵跨s=20到s=35。
避坑指南:我曾经犯过一个错误——只考虑了障碍物的中心点投影,忽略了它的车身长度。结果规划出来的轨迹差点蹭上人家的保险杠。记住,障碍物投影一定要考虑它的物理尺寸,包括长宽和可能的运动不确定性。
障碍物投影的精度直接决定了后续速度规划的安全性。我个人建议,对于高速场景,投影的时间步长不要超过0.1秒;对于低速泊车场景,0.2秒也够用。
可行域定义:你的车能走的空间
有了自车轨迹和障碍物投影,接下来就是定义“可行域”了。可行域,说白了就是ST图上那些没有被障碍物占领、同时满足车辆动力学约束的区域。
可行域的定义通常包含以下几个约束:
| 约束类型 | 说明 | 在ST图上的表现 |
|---|---|---|
| 障碍物约束 | 不能进入障碍物占领的区域 | 排除所有障碍物投影块 |
| 速度上限 | 不能超过道路限速和车辆极速 | ST曲线的斜率不能超过最大速度 |
| 加速度上限 | 加减速度不能超过舒适性和物理极限 | ST曲线的二阶导数受限 |
| 终点约束 | 必须在指定时间到达指定位置 | ST曲线必须经过终点坐标 |
嗯,这里要注意:可行域不一定是连续的。有时候障碍物会把ST图切成好几块,你的任务就是找到一条从起点到终点、完全落在可行域内的光滑曲线。
警告:不要试图让ST曲线贴着障碍物边界走。我在实际调试中发现,留出至少0.5秒的安全时间裕度,能大幅降低因感知延迟或控制误差导致的碰撞风险。这个裕度值可以根据车速动态调整,但最小不要低于0.3秒。
ST图的可视化与实战意义
下面这张SVG图展示了ST图的核心结构。你可以看到自车轨迹、障碍物投影和可行域之间的关系。
从这张图里你能看到几个关键信息:
- 自车的ST轨迹必须从原点出发,最终到达目标位置。
- 障碍物A和B占据了部分时空区域,自车轨迹需要绕开它们。
- 可行域的上边界由速度上限决定,下边界由道路边界或前车约束决定。
- 安全裕度是必须留的,不能贴着障碍物走。
实战技巧:我在做实车测试时发现,ST图上的可行域并不是越大越好。太大的可行域意味着搜索空间太大,求解器容易陷入局部最优。我通常的做法是,先根据经验给一个合理的速度初值,把搜索范围缩小到可行域的一个子集里,然后再做精细优化。这样既保证了实时性,又不会错过最优解。