自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析


在自动驾驶系统的车辆动力学建模中,自行车模型 (Bicycle Model)和更复杂的汽车模型(如双轨模型或多体动力学模型)各有其适用场景和优缺点。以下是两者的详细对比及选择原因解析:


1. 模型定义与核心差异

特性 自行车模型 复杂汽车模型(如双轨模型)
简化假设 将四轮车辆简化为两轮(前轮转向,后轮驱动) 考虑四轮独立运动、悬架系统、轮胎侧偏特性
自由度 2-3自由度(位置x,y,航向角θ) 6+自由度(含横向、俯仰、侧倾等运动)
计算复杂度 低(适合实时控制) 高(需解算微分代数方程)
参数需求 仅需轴距、转向比等基础参数 需轮胎刚度、悬架参数、质心位置等细节
典型应用场景 低速路径跟踪、实时控制 高速稳定性分析、极限工况仿真

2. 为什么自动驾驶常用自行车模型?

2.1 计算效率优势

自行车模型的核心运动学方程为:
δ = arctan ⁡ ( L R ) \delta = \arctan\left(\frac{L}{R}\right) δ=arctan(RL)

其中,( L )为轴距,( R )为转弯半径。其计算仅涉及简单的三角函数,可在1ms内完成,满足控制系统的实时性要求(通常需10-100Hz更新频率)。

相比之下,双轨模型需解算非线性方程组:
{ F y f = C α f α f F y r = C α r α r α f = δ − v y + a ψ ˙ v x α r = b ψ ˙ − v y v x \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} ⎩ ⎨ ⎧Fyf=CαfαfFyr=Cαrαrαf=δ−vxvy+aψ˙αr=vxbψ˙−vy

计算耗时可能达到10ms以上,难以满足实时控制需求。

2.2 参数易获取性

自行车模型仅需轴距(L)转向传动比等少量参数,而复杂模型需要详细的车辆参数(如轮胎侧偏刚度( C_{\alpha} )、悬架刚度等),这些数据可能因车型不同而难以获取。

2.3 适用场景匹配

低速城市道路 (<50km/h)和中等曲率转弯 场景下,自行车模型的预测误差通常小于5%,足以满足控制精度要求。而高速或极限工况(如漂移)则需要更精确的模型。


3. 复杂汽车模型的应用场景

尽管自行车模型广泛使用,但在以下场景中需切换至复杂模型:

  1. 高速稳定性控制(>80km/h):需考虑横向载荷转移对轮胎抓地力的影响。
  2. 极限工况仿真:如紧急避障时车辆进入非线性区域的动力学行为。
  3. 车辆动力学测试:评估ESP(电子稳定程序)等系统时需精确建模。

示例代码(双轨模型片段)

python 复制代码
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. 自行车模型代码实现及应用举例

python 复制代码
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. 双轨模型代码实现及应用举例

python 复制代码
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()

应用举例说明

在高速公路L3级自动驾驶场景中,双轨模型能够更精确地分析车辆在高速行驶时的稳定性。通过设置车辆的初始状态、前轮转角和驱动力,模拟出车辆在高速公路上的行驶动态。从模拟结果可以看出,车辆的纵向速度、侧向速度和角速度随时间的变化趋势,以及车辆的行驶轨迹。这有助于评估车辆在高速行驶时的稳定性和安全性,验证了双轨模型在高速场景下的必要性和精确性。

通过以上代码实现和应用举例,可以更深入地理解自行车模型和双轨模型在不同自动驾驶场景下的应用和特点。

6. 实际工程中的混合策略

在自动驾驶系统中,常采用分层建模策略:

  • 上层路径规划:使用自行车模型快速生成参考轨迹。

  • 底层控制 :根据车速动态切换模型:

    python 复制代码
    def select_vehicle_model(speed):
        if speed < 15:  # m/s (约54km/h)
            return BicycleModel()
        else:
            return DoubleTrackModel()
  • 仿真验证:在PreScan/CarSim等工具中使用高精度模型验证算法。


7. 关键结论

场景 推荐模型 理由
低速园区物流车 自行车模型 计算快、参数少、精度足够
高速公路L3级自动驾驶 双轨模型 需考虑高速稳定性
控制算法开发 自行车模型 快速迭代、易调试
车辆动力学测试 多体动力学模型 高保真度、匹配实车数据

8. 总结

自行车模型因其简洁性实时性 成为自动驾驶控制算法的首选,而复杂模型则用于特定场景验证车辆动力学深度分析 。实际工程中需根据车速控制频率可用参数动态选择模型,以平衡精度与计算效率。

下一篇将讲解混合策略的应用示例以及可视化验证代码,欢迎关注!

相关推荐
Godspeed Zhao2 小时前
自动驾驶中的传感器技术13——Camera(4)
人工智能·机器学习·自动驾驶·camera·摄像头
Godspeed Zhao2 小时前
自动驾驶中的传感器技术6——概述(6)-GNSS
人工智能·机器学习·自动驾驶·gnss·导航定位
码破苍穹ovo4 小时前
堆----1.数组中的第K个最大元素
java·数据结构·算法·排序算法
愤怒的小鸟~~~4 小时前
c语言创建的一个队列结构(含有这个头指针和这个尾指针的结构具有一定的参考价值)
c语言·开发语言·算法
叫我:松哥5 小时前
python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
人工智能·python·神经网络·数据挖掘·数据分析·cnn·课程设计
Joker-01115 小时前
深入 Go 底层原理(十二):map 的实现与哈希冲突
算法·go·哈希算法·map
2202_756749696 小时前
01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集及数据集的划分、特征工程(特征提取与无量纲化、特征降维)
人工智能·python·机器学习·分类·sklearn
王者鳜錸6 小时前
PYTHON从入门到实践-18Django从零开始构建Web应用
前端·python·sqlite
金融小师妹6 小时前
AI量化模型解析黄金3300关口博弈:市场聚焦“非农数据”的GRU-RNN混合架构推演
大数据·人工智能·算法
NewCarRen6 小时前
数据驱动的自动驾驶虚拟测试方法
人工智能·机器学习·自动驾驶