自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析
在自动驾驶系统的车辆动力学建模中,单轮 Differential 模型(Bicycle Model)与多体汽车动力学模型各有不同的应用场景及其 respective 优缺点。本文将从多个角度对这两种建模方法进行详细比较,并阐述选择其中一种的理论依据与实际意义。
1. 模型定义与核心差异
| 特性 | 自行车模型 | 复杂汽车模型(如双轨模型) | 
|---|---|---|
| 简化假设 | 将四轮车辆简化为两轮(前轮转向,后轮驱动) | 考虑四轮独立运动、悬架系统、轮胎侧偏特性 | 
| 自由度 | 2-3自由度(位置x,y,航向角θ) | 6+自由度(含横向、俯仰、侧倾等运动) | 
| 计算复杂度 | 低(适合实时控制) | 高(需解算微分代数方程) | 
| 参数需求 | 仅需轴距、转向比等基础参数 | 需轮胎刚度、悬架参数、质心位置等细节 | 
| 典型应用场景 | 低速路径跟踪、实时控制 | 高速稳定性分析、极限工况仿真 | 
2. 为什么自动驾驶常用自行车模型?
2.1 计算效率优势
基于运动学的核心模型构建了自行车的运动学方程:
\delta = \arctan\left(\frac{L}{R}\right)
其中符号(L)定义了轴距参数(L),符号(R)定义了转弯半径参数(R). 该计算过程仅依赖于基本的三角函数运算,在不到1ms的时间单位内完成计算 ,符合控制系统对实时性的需求(通常要求更新频率在10到100赫兹之间)。
相较于单轨模型而言,在双轨模型中需解算非线性方程组:
\begin{cases} F_{yf} = C_{\alpha f} \alpha_f \\ F_{yr} = C_{\alpha r} \alpha_r \\ \alpha_f = \delta - \frac{v_y + a \dot{\psi}}{v_x} \\ \alpha_r = \frac{b \dot{\psi} - v_y}{v_x} \end{cases}
计算所需时间可能不少于10ms以上 ,这使得实时控制难以得到满足。
2.2 参数易获取性
自行车模型只需轴距(L)和转向传动比等较少的参数即可实现基本性能匹配,而针对复杂车辆则需要较为详尽的参数配置以保证动态性能的一致性。由于不同车型的特点差异,在获取这些数据时也会面临诸多挑战。
2.3 适用场景匹配
在以下场景中进行研究:低速城市道路 (速度限制在<50km/h)和中等曲率转弯 场景。在此条件下,自行车模型的预测误差一般不超过5%,即可满足精度控制需求。然而,在高速行驶或极端工况(例如车速达到时速100以上)的情况下,则需要采用更为精确的模型以确保性能。”
3. 复杂汽车模型的应用场景
尽管自行车模型广泛使用,但在以下场景中需切换至复杂模型:
- 高速动态稳定控制 (>80km/h):应在分析车轮偏移所导致的轮胎着地性能变化。
 - 极端工况仿真 :例如,在紧急避障过程中车辆进入非线性运动状态时的表现。
 - 汽车动力学测试 :用于评估ESP等辅助驾驶系统时必须进行精确建模。
 
示例代码(双轨模型片段) :
    def double_track_model(state, delta, Fx):
    # 状态变量: [vx, vy, omega, X, Y, psi]
    # 输入: 前轮转角delta, 驱动力Fx
    m = 1500  # 质量 (kg)
    Iz = 2500  # 绕Z轴转动惯量 (kg·m²)
    lf, lr = 1.2, 1.5  # 前后轴到质心距离 (m)
    C_alpha_f, C_alpha_r = 80000, 80000  # 前后轮胎侧偏刚度 (N/rad)
    
    alpha_f = delta - (state[1] + lf * state[2]) / state[0]
    alpha_r = (state[1] - lr * state[2]) / state[0]
    
    Fyf = C_alpha_f * alpha_f
    Fyr = C_alpha_r * alpha_r
    
    dvx = (Fx - Fyf * np.sin(delta)) / m + state[1] * state[2]
    dvy = (Fyf * np.cos(delta) + Fyr) / m - state[0] * state[2]
    domega = (lf * Fyf * np.cos(delta) - lr * Fyr) / Iz
    
    return [dvx, dvy, domega, state[0]*np.cos(state[4]) - state[1]*np.sin(state[4]),
            state[0]*np.sin(state[4]) + state[1]*np.cos(state[4]), state[2]]
        4. 自行车模型代码实现及应用举例
    import numpy as np
    import matplotlib.pyplot as plt
    
    class BicycleModel:
    def __init__(self, L=2.0, max_steer=30.0):  # L:轴距,max_steer:最大转向角
        self.L = L
        self.max_steer = np.deg2rad(max_steer)  # 转换为弧度
    
    def kinematic_model(self, x, y, theta, v, delta):  # x,y:位置,theta:航向角,v:速度,delta:前轮转角
        delta = np.clip(delta, -self.max_steer, self.max_steer)  # 限制转向角在最大值内
        beta = np.arctan(1 / (2 * self.L * np.tan(delta) / v))  # 滑移角计算
        x_dot = v * np.cos(theta + beta)  # x方向速度
        y_dot = v * np.sin(theta + beta)  # y方向速度
        theta_dot = v / self.L * np.tan(delta) * np.cos(beta)  # 航向角变化率
        return x_dot, y_dot, theta_dot
    
    def simulate(self, initial_state, v, delta, dt, steps):  # 初始状态,速度,转向角,时间步长,步数
        x_traj = [initial_state[0]]  # x轨迹
        y_traj = [initial_state[1]]  # y轨迹
        theta_traj = [initial_state[2]]  # 航向角轨迹
        current_state = initial_state
        for _ in range(steps):
            x_dot, y_dot, theta_dot = self.kinematic_model(*current_state, v, delta)
            current_state = (
                current_state[0] + x_dot * dt,
                current_state[1] + y_dot * dt,
                current_state[2] + theta_dot * dt
            )
            x_traj.append(current_state[0])
            y_traj.append(current_state[1])
            theta_traj.append(current_state[2])
        return x_traj, y_traj, theta_traj
    
    # 应用举例:低速园区物流车路径跟踪
    if __name__ == "__main__":
    # 初始化自行车模型,轴距2米,最大转向角30度
    bike_model = BicycleModel(L=2.0, max_steer=30.0)
    # 初始状态:位置(0,0),航向角0弧度
    initial_state = (0.0, 0.0, 0.0)
    # 设置速度为5m/s,转向角为0.5弧度(约28.6度)
    v = 5.0
    delta = 0.5
    # 模拟时间步长0.1s,共100步
    dt = 0.1
    steps = 100
    # 进行模拟
    x_traj, y_traj, theta_traj = bike_model.simulate(initial_state, v, delta, dt, steps)
    # 绘制轨迹
    plt.figure(figsize=(10, 6))
    plt.plot(x_traj, y_traj, label="Vehicle Trajectory")
    plt.scatter([x_traj[0]], [y_traj[0]], c='r', label="Start Point")
    plt.scatter([x_traj[-1]], [y_traj[-1]], c='g', label="End Point")
    plt.xlabel("X (m)")
    plt.ylabel("Y (m)")
    plt.title("Bicycle Model Simulation for Low-speed Park Logistics Vehicle")
    plt.legend()
    plt.grid()
    plt.show()
        应用举例说明 :
以具体应用为例,在低速园区物流车场景中运用自行车模型时会表现出良好的性能特征。通过设定车辆的初始位置、速度与转向角参数进行配置后系统能够自动推导出车辆在园区道路上的行驶路径并完成轨迹模拟过程的具体操作步骤如下首先根据设定好的参数启动系统随后系统会动态更新并计算出每段时间内车辆的位置状态信息最终能够输出完整的运行轨迹数据曲线通过对上述过程进行多次重复测试并结合实际运行数据可观察到自行车模型能够在预定条件下稳定地沿预定曲率的道路行驶从而验证了该模型在低速运行环境下的有效性及其计算效率
5. 双轨模型代码实现及应用举例
    class DoubleTrackModel:
    def __init__(self, m=1500, Iz=2500, lf=1.2, lr=1.5, C_alpha_f=80000, C_alpha_r=80000):
        self.m = m  # 车辆质量
        self.Iz = Iz  # 绕Z轴转动惯量
        self.lf = lf  # 前轴到质心距离
        self.lr = lr  # 后轴到质心距离
        self.C_alpha_f = C_alpha_f  # 前轮胎侧偏刚度
        self.C_alpha_r = C_alpha_r  # 后轮胎侧偏刚度
    
    def dynamic_model(self, state, delta, Fx):
        vx, vy, omega, X, Y, psi = state
        # 计算前后轮胎的侧偏角
        alpha_f = delta - (vy + self.lf * omega) / vx
        alpha_r = (vy - self.lr * omega) / vx
        # 计算前后轮胎的侧向力
        Fyf = self.C_alpha_f * alpha_f
        Fyr = self.C_alpha_r * alpha_r
        # 计算车辆的加速度和角加速度
        dvx = (Fx - Fyf * np.sin(delta)) / self.m + vy * omega
        dvy = (Fyf * np.cos(delta) + Fyr) / self.m - vx * omega
        domega = (self.lf * Fyf * np.cos(delta) - self.lr * Fyr) / self.Iz
        # 计算位置和航向角的变化
        dX = vx * np.cos(psi) - vy * np.sin(psi)
        dY = vx * np.sin(psi) + vy * np.cos(psi)
        dpsi = omega
        return [dvx, dvy, domega, dX, dY, dpsi]
    
    def simulate(self, initial_state, delta, Fx, dt, steps):
        vx_traj = [initial_state[0]]
        vy_traj = [initial_state[1]]
        omega_traj = [initial_state[2]]
        X_traj = [initial_state[3]]
        Y_traj = [initial_state[4]]
        psi_traj = [initial_state[5]]
        current_state = initial_state
        for _ in range(steps):
            state_dot = self.dynamic_model(current_state, delta, Fx)
            current_state = [
                current_state[0] + state_dot[0] * dt,
                current_state[1] + state_dot[1] * dt,
                current_state[2] + state_dot[2] * dt,
                current_state[3] + state_dot[3] * dt,
                current_state[4] + state_dot[4] * dt,
                current_state[5] + state_dot[5] * dt
            ]
            vx_traj.append(current_state[0])
            vy_traj.append(current_state[1])
            omega_traj.append(current_state[2])
            X_traj.append(current_state[3])
            Y_traj.append(current_state[4])
            psi_traj.append(current_state[5])
        return vx_traj, vy_traj, omega_traj, X_traj, Y_traj, psi_traj
    
    # 应用举例:高速公路L3级自动驾驶车辆稳定性分析
    if __name__ == "__main__":
    # 初始化双轨模型
    double_track = DoubleTrackModel()
    # 初始状态:纵向速度20m/s,侧向速度0,角速度0,位置(0,0),航向角0弧度
    initial_state = [20.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    # 设置前轮转角0.1弧度,驱动力1000N
    delta = 0.1
    Fx = 1000.0
    # 模拟时间步长0.01s,共200步
    dt = 0.01
    steps = 200
    # 进行模拟
    vx_traj, vy_traj, omega_traj, X_traj, Y_traj, psi_traj = double_track.simulate(initial_state, delta, Fx, dt, steps)
    # 绘制纵向速度、侧向速度和角速度的变化
    time = np.arange(0, steps*dt, dt)
    plt.figure(figsize=(12, 8))
    plt.subplot(3, 1, 1)
    plt.plot(time, vx_traj)
    plt.xlabel("Time (s)")
    plt.ylabel("Longitudinal Speed (m/s)")
    plt.title("Longitudinal Speed Variation")
    plt.grid()
    plt.subplot(3, 1, 2)
    plt.plot(time, vy_traj)
    plt.xlabel("Time (s)")
    plt.ylabel("Lateral Speed (m/s)")
    plt.title("Lateral Speed Variation")
    plt.grid()
    plt.subplot(3, 1, 3)
    plt.plot(time, omega_traj)
    plt.xlabel("Time (s)")
    plt.ylabel("Yaw Rate (rad/s)")
    plt.title("Yaw Rate Variation")
    plt.grid()
    plt.tight_layout()
    plt.show()
    # 绘制车辆行驶轨迹
    plt.figure(figsize=(10, 6))
    plt.plot(X_traj, Y_traj, label="Vehicle Trajectory")
    plt.scatter([X_traj[0]], [Y_traj[0]], c='r', label="Start Point")
    plt.scatter([X_traj[-1]], [Y_traj[-1]], c='g', label="End Point")
    plt.xlabel("X (m)")
    plt.ylabel("Y (m)")
    plt.title("Double Track Model Simulation for Highway L3 Autonomous Vehicle")
    plt.legend()
    plt.grid()
    plt.show()
        具体应用场景描述
借助上述代码运行以及具体的案例分析,从而能够更加透彻地掌握自行车模型和双轨模型在不同自动驾驶场景下的应用与特点。
6. 实际工程中的混合策略
在自动驾驶系统中,常采用分层建模 策略:
- 上层路径规划:基于自行车模型实时生成参考轨迹。
- 底层控制:根据速度反馈动态调整控制策略。
 
 
    def select_vehicle_model(speed):
    if speed < 15:  # m/s (约54km/h)
        return BicycleModel()
    else:
        return DoubleTrackModel()
        - 仿真验证 :在PreScan/CarSim等工具中使用高精度模型验证算法。
 
7. 关键结论
| 场景 | 推荐模型 | 理由 | 
|---|---|---|
| 低速园区物流车 | 自行车模型 | 计算快、参数少、精度足够 | 
| 高速公路L3级自动驾驶 | 双轨模型 | 需考虑高速稳定性 | 
| 控制算法开发 | 自行车模型 | 快速迭代、易调试 | 
| 车辆动力学测试 | 多体动力学模型 | 高保真度、匹配实车数据 | 
8. 总结
自行车模型因其紧凑性和即时性能成为自动驾驶控制算法的主要依赖对象,在此领域具有显著优势;而更为复杂的模型则应用于特定场景的验证测试以及深入分析车辆的动力学特性。在实际工程应用中,则需要依据行驶速度、控制频率以及可用参数等因素动态地选择合适的模型结构,以实现最佳的性能与效率平衡。
下一篇文章将介绍一种混合策略在自动驾驶车辆动力学建模中的应用,并详细阐述其在实现自动驾驶分层控制架构中的重要性
