1. 运动学自行车模型是什么?

如果你玩过遥控汽车,就会知道控制它前进、转向的基本原理。运动学自行车模型就是把这个原理数学化,用来描述真实汽车的运动规律。想象一下把四轮汽车简化成自行车——前轮控制方向,后轮提供动力,这就是模型的核心思想。

我第一次接触这个模型时,发现它用五个关键参数就能描述车辆状态:x和y坐标表示位置,θ是车头朝向,v是速度,δ是前轮转角。这就像用五个旋钮控制玩具车,只不过现在我们要用数学方程来表达它们之间的关系。

模型基于三个重要假设:首先忽略车辆上下颠簸,只考虑平面运动;其次假设左右轮胎行为完全一致;最后假设轮胎不会打滑。这些简化让模型在低速场景下特别有效,比如自动泊车或城市道路跟车。

2. 模型推导的详细过程

2.1 后轴参考点模型

让我们从最常用的后轴中心参考点开始推导。假设你在停车场画了个直角坐标系,车辆后轴中心的位置是(xr, yr),车头方向与x轴夹角为θ。当前轮转过δ角度时,车辆会绕某个瞬时旋转中心做圆周运动。

通过几何关系可以发现,旋转半径R与转向角δ满足tanδ=L/R,其中L是轴距。结合圆周运动公式v=ωR(ω是角速度),我们得到ω=v·tanδ/L。这时候车辆在x和y方向的速度分量就是v·cosθ和v·sinθ。

把这些组合起来,就得到后轴参考点的运动方程:

dx/dt = v·cosθ
dy/dt = v·sinθ
dθ/dt = v·tanδ/L

2.2 前轴参考点模型

有时候我们需要以前轴中心为参考点,比如设计前视控制系统时。这时候速度方向变为δ+θ,推导过程类似但要注意速度方向的改变。最终模型变为:

dx/dt = v·cos(θ+δ)
dy/dt = v·sin(θ+δ)
dθ/dt = v·sinδ/L

2.3 质心参考点模型

更精确的模型会以车辆质心(cg)为参考点。这里引入了侧滑角β的概念——车辆实际运动方向与车头方向的夹角。通过几何关系可得β=arctan((Lr·tanδ)/L),其中Lr是后轴到质心的距离。

质心模型的运动方程考虑了侧滑效应:

dx/dt = v·cos(θ+β)
dy/dt = v·sin(θ+β)
dθ/dt = v·cosβ·tanδ/L

3. 模型参数的实际意义

3.1 轴距L的影响

在实车测试中,我发现轴距直接影响转向灵敏度。长轴距车辆(如卡车)需要更大的转向角才能达到与小轿车相同的转弯半径。某次测试中,将模型中的L从2.5米调整为2.8米后,控制器的转向输出需要增加约12%才能保持相同路径跟踪性能。

3.2 最大转向角限制

真实车辆转向角都有物理限制,通常乘用车在30°左右。在代码实现时必须加入饱和限制:

MAX_STEER = math.radians(30)  # 转换为弧度
delta = np.clip(desired_delta, -MAX_STEER, MAX_STEER)

忽略这个限制会导致仿真结果严重偏离实际。

3.3 速度v的非线性影响

低速时模型很准确,但超过60km/h后轮胎侧滑效应变得显著。我曾对比过同一模型在20km/h和80km/h下的路径跟踪误差,后者比前者大了近3倍。这时就需要引入动力学模型进行补偿。

4. Python实现与仿真

4.1 基础实现代码

下面是一个完整的运动学模型Python类实现:

import numpy as np

class KinematicBicycleModel:
    def __init__(self, x=0, y=0, yaw=0, v=0, L=2.5, max_steer=30):
        self.x = x
        self.y = y
        self.yaw = yaw  # 航向角
        self.v = v  # 速度
        self.L = L  # 轴距
        self.max_steer = np.radians(max_steer)
        
    def update(self, a, delta, dt):
        delta = np.clip(delta, -self.max_steer, self.max_steer)
        
        self.x += self.v * np.cos(self.yaw) * dt
        self.y += self.v * np.sin(self.yaw) * dt
        self.yaw += self.v * np.tan(delta) / self.L * dt
        self.v += a * dt
        
        return self.x, self.y, self.yaw, self.v

4.2 仿真案例分析

假设我们要实现一个简单的路径跟踪场景:

  1. 初始状态:x=0, y=0, 车头朝东(θ=0)
  2. 控制策略:保持速度2m/s,前轮正弦变化δ=10°·sin(t)
  3. 仿真时长10秒
model = KinematicBicycleModel()
states = []
for t in np.arange(0, 10, 0.1):
    delta = np.radians(10) * np.sin(t)
    x, y, yaw, v = model.update(a=0, delta=delta, dt=0.1)
    states.append([x, y, yaw])

运行后会得到一条优美的S形轨迹,这验证了模型对周期性转向输入的响应。

5. 在自动驾驶中的应用实践

5.1 与PID控制器的结合

在自动泊车项目中,我们使用PID控制器输出转向角指令。运动学模型在这里有两个作用:一是作为预测模型预测未来轨迹;二是帮助调试PID参数。通过调整模型中的L参数,可以快速验证控制器对不同车型的适应性。

5.2 在MPC中的应用

模型预测控制(MPC)需要频繁调用车辆模型。运动学模型计算量小的优势在这里非常明显。一个实际技巧是对模型进行离散化处理:

def discrete_model(state, control, dt):
    x, y, yaw, v = state
    a, delta = control
    
    new_x = x + v*np.cos(yaw)*dt
    new_y = y + v*np.sin(yaw)*dt 
    new_yaw = yaw + v*np.tan(delta)/L*dt
    new_v = v + a*dt
    
    return np.array([new_x, new_y, new_yaw, new_v])

5.3 实际部署的注意事项

真实系统中需要考虑传感器延迟。我们的经验是:当车速为36km/h(10m/s)时,200ms的延迟会导致2米的定位偏差。解决方法是在模型中加入延迟补偿,使用过去一段时间的历史控制量进行状态预测。

6. 模型的局限性及改进

虽然运动学模型简单易用,但在以下场景需要特别注意:

  1. 高速行驶时(>60km/h):轮胎侧滑效应显著
  2. 低附着路面:冰雪路面即使低速也会打滑
  3. 紧急避障:忽略轮胎力学特性

这时可以采用混合建模方法:正常工况使用运动学模型,异常工况切换至动力学模型。我们在某L4级项目中采用这种策略,CPU占用率比全时动力学模型降低了40%。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐