第四节:车辆运动学建模——单车运动模型与轨迹预测基础

各位同学,今天我们聊点硬核的——车辆运动学建模。

说实话,做V2X交叉路口优化,你绕不开一个问题:车接下来会怎么走? 你想想看,如果连车下一秒在哪儿都算不准,那什么协同、什么优化都是空谈。所以,运动学建模就是整个算法体系的“地基”。

我个人习惯把这一节分成两块来讲:单车运动模型轨迹预测基础。前者是物理规律,后者是工程应用。咱们一个一个来。

4.1 单车运动模型:匀加速与恒定曲率

先问个问题:一辆车在路上跑,它的运动状态怎么描述?

嗯,最朴素的想法——位置、速度、加速度。但实际工程中,我们还需要考虑转向。所以,我一般把单车模型拆成两个子模型:纵向运动模型横向运动模型

4.1.1 匀加速运动模型

这个最简单,也最常用。说白了,就是假设车辆在短时间内加速度不变。

公式长这样:

s(t) = s₀ + v₀ * t + 0.5 * a * t²
v(t) = v₀ + a * t

其中:

  • s₀:初始位置
  • v₀:初始速度
  • a:加速度(恒定)
  • t:时间

我在项目中遇到过一个问题:直接用这个模型预测3秒后的位置,结果偏差很大。为什么?因为真实道路上的加速度不可能一直不变。所以,我建议预测周期不要超过2秒,超过之后误差会指数级增长。

小技巧: 实际代码中,我会把加速度设为一个随时间衰减的变量。比如,a(t) = a₀ * e^(-λt)。这样更贴近真实驾驶行为。

4.1.2 恒定曲率运动模型

车辆转弯时,光用匀加速模型就不够了。这时候需要引入曲率的概念。

恒定曲率模型假设:车辆在转弯过程中,转向角速度不变。说白了,就是方向盘角度固定。

公式稍微复杂一点:

x(t) = x₀ + (v/ω) * [sin(θ₀ + ω*t) - sin(θ₀)]
y(t) = y₀ + (v/ω) * [cos(θ₀) - cos(θ₀ + ω*t)]
θ(t) = θ₀ + ω * t

其中:

  • ω:角速度(恒定)
  • θ₀:初始航向角
  • v:线速度

这里有个坑——当ω趋近于0时,公式会除以0。我曾经在代码里忘了处理这个边界情况,结果仿真直接崩了。所以,实际工程中,我会加一个判断:如果|ω| < 1e-6,就退化为匀加速直线模型。

注意: 恒定曲率模型只适用于小角度转弯。如果车辆在掉头或急转弯,这个模型的误差会很大。这时候建议用更复杂的自行车模型或动力学模型。

4.2 轨迹预测基础

有了运动模型,下一步就是预测轨迹。说白了,就是用数学模型推演车辆未来的位置序列

我个人把轨迹预测分为三个层次:

  1. 物理层预测:基于运动学模型,不考虑环境因素
  2. 行为层预测:考虑车道、交通规则等
  3. 交互层预测:考虑其他车辆的影响

今天我们先讲第一层——物理层预测。这是后面所有预测的基础。

4.2.1 预测流程

我习惯的预测流程是这样的:

  1. 获取当前状态:位置、速度、航向角、加速度、角速度
  2. 选择模型:根据当前状态判断用匀加速还是恒定曲率
  3. 迭代计算:以固定时间步长(比如0.1秒)向前推算
  4. 生成轨迹:输出未来N个时间点的位置序列

代码实现大概长这样:

def predict_trajectory(state, dt, horizon):
    """
    state: [x, y, v, theta, a, omega]
    dt: 时间步长 (s)
    horizon: 预测步数
    """
    trajectory = []
    x, y, v, theta, a, omega = state
    
    for _ in range(horizon):
        # 判断模型
        if abs(omega) < 1e-6:
            # 匀加速直线
            x += v * dt * cos(theta)
            y += v * dt * sin(theta)
            v += a * dt
        else:
            # 恒定曲率转弯
            x += (v/omega) * (sin(theta + omega*dt) - sin(theta))
            y += (v/omega) * (cos(theta) - cos(theta + omega*dt))
            theta += omega * dt
            v += a * dt
        
        trajectory.append([x, y, v, theta])
    
    return trajectory
核心要点: 预测不是一次算完就完事了。实际系统中,每收到一帧新数据,就要重新预测一次。这叫滚动时域预测

4.2.2 误差分析与处理

你可能会问:预测出来的轨迹,到底有多准?

嗯,这个问题很关键。我根据经验总结了一个误差表:

预测时长 匀加速模型误差 恒定曲率模型误差 建议使用场景
0.5秒内 < 0.3m < 0.2m 紧急制动、碰撞预警
1.0秒内 < 1.0m < 0.8m 跟车、变道辅助
2.0秒内 < 3.0m < 2.5m 交叉口通行优化
3.0秒以上 > 5.0m > 4.0m 仅作参考,不建议直接使用

我曾经在一个项目中,直接用2秒的预测结果做路径规划,结果车辆在路口差点撞上护栏。后来排查发现,是预测误差累积导致的。从那以后,我定了一个规矩:超过2秒的预测,必须加置信度标签

避坑指南: 如果你发现预测轨迹总是偏左或偏右,别急着调模型参数。先检查一下传感器的安装位置和标定数据。我遇到过好几次,问题出在IMU的安装角度偏差上。

4.3 小结与思考

今天的内容,说白了就是两件事:怎么描述车的运动,以及怎么用这个描述去猜车接下来会去哪儿

匀加速模型适合直道,恒定曲率模型适合弯道。两者结合,基本能覆盖90%的日常驾驶场景。但记住,模型永远是模型的,真实世界的噪声、延迟、不确定性,都需要你在工程中去处理。

最后留个思考题:如果车辆在弯道中突然加速,这时候应该用哪个模型?或者,有没有一种模型能同时处理纵向和横向的耦合?

嗯,这个问题,我们下一节讲自行车模型的时候再细聊。