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


在自动驾驶系统的车辆动力学建模中,自行车模型 (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. 总结

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

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

相关推荐
superlls21 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
honder试试21 小时前
焊接自动化测试平台图像处理分析-模型训练推理
开发语言·python
民乐团扒谱机21 小时前
逻辑回归算法干货详解:从原理到 MATLAB 可视化实现
数学建模·matlab·分类·数据挖掘·回归·逻辑回归·代码分享
田里的水稻21 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
心本无晴.21 小时前
Python进程,线程
python·进程
纪元A梦21 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
wheeldown1 天前
【数学建模】在烟雾导弹遮蔽模型中的实际参考文献
数学建模
Jayden_Ruan1 天前
C++逆向输出一个字符串(三)
开发语言·c++·算法
点云SLAM1 天前
C++ 常见面试题汇总
java·开发语言·c++·算法·面试·内存管理
叙白冲冲1 天前
哈希算法以及面试答法
算法·面试·哈希算法