用Python从零实现一个自行车模型(Bicycle Model),手把手教你理解自动驾驶的底层逻辑

张开发
2026/4/12 20:49:56 15 分钟阅读

分享文章

用Python从零实现一个自行车模型(Bicycle Model),手把手教你理解自动驾驶的底层逻辑
用Python从零实现自行车模型解锁自动驾驶的底层逻辑自行车模型Bicycle Model是理解自动驾驶车辆运动学的基石。这个简化模型将四轮车辆抽象为两轮结构让我们能够专注于核心运动原理。本文将带你从零开始用Python实现一个完整的自行车模型并通过可视化理解其行为。1. 自行车模型基础与假设自行车模型的核心在于简化现实世界的复杂性。想象一下当你驾驶汽车低速转弯时左右前轮的转向角度差异可以忽略不计。这正是自行车模型的基本假设之一单轮抽象将左右两侧轮胎合并为一个虚拟轮胎低速场景忽略轮胎侧向力速度5m/s时成立二维平面不考虑垂直方向Z轴运动刚性车身忽略悬架系统和载荷转移class BicycleModel: def __init__(self, lf1.2, lr1.5): self.lf lf # 前轴到重心的距离 self.lr lr # 后轴到重心的距离 self.L lf lr # 轴距这个模型的关键参数包括δf前轮转向角radV车速m/sΨ航向角车辆纵轴与全局X轴夹角β滑移角车速方向与车辆纵轴夹角2. 运动方程推导与实现自行车模型的运动学可以通过四个微分方程描述。让我们逐步推导并实现这些方程2.1 航向角变化率根据几何关系航向角变化率Ψ˙与转向角的关系为def yaw_rate(self, V, delta_f, beta): return (V * np.cos(beta) * np.tan(delta_f)) / self.L2.2 位置更新方程车辆在全局坐标系中的位置变化由以下方程决定def position_update(self, V, beta, psi): x_dot V * np.cos(beta psi) y_dot V * np.sin(beta psi) return x_dot, y_dot2.3 滑移角计算滑移角β反映了车速方向与车辆朝向的差异def slip_angle(self, delta_f): return np.arctan((self.lr * np.tan(delta_f)) / self.L)2.4 完整运动模型整合以上方程我们得到完整的运动学模型def kinematic_model(self, state, delta_f, V, dt): x, y, psi state beta self.slip_angle(delta_f) # 更新状态 x V * np.cos(beta psi) * dt y V * np.sin(beta psi) * dt psi (V * np.cos(beta) * np.tan(delta_f)) / self.L * dt return np.array([x, y, psi])3. Python实现与可视化现在让我们用Matplotlib创建一个交互式仿真环境import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider def simulate(): model BicycleModel() fig, ax plt.subplots(figsize(10, 8)) plt.subplots_adjust(bottom0.3) # 初始化状态 state np.array([0, 0, 0]) # x, y, psi trajectory [state.copy()] # 创建控件 ax_delta plt.axes([0.25, 0.2, 0.65, 0.03]) ax_vel plt.axes([0.25, 0.15, 0.65, 0.03]) delta_slider Slider(ax_delta, 转向角(rad), -0.5, 0.5, valinit0) vel_slider Slider(ax_vel, 速度(m/s), 0, 5, valinit1) def update(val): nonlocal state, trajectory delta delta_slider.val V vel_slider.val state model.kinematic_model(state, delta, V, 0.1) trajectory.append(state.copy()) ax.clear() plot_vehicle(ax, state, delta) plot_trajectory(ax, trajectory) ax.set_xlim(-10, 10) ax.set_ylim(-10, 10) fig.canvas.draw_idle() delta_slider.on_changed(update) vel_slider.on_changed(update) plt.show()这个仿真环境允许你实时调整转向角-0.5到0.5弧度车速0到5 m/s4. 参数影响分析自行车模型的行为受多个参数影响我们通过实验来分析这些影响4.1 轴距的影响轴距(m)转弯半径(δf0.3rad)稳定性2.06.47低2.78.74中3.511.33高# 测试不同轴距下的转弯半径 def test_wheelbase(): deltas np.linspace(0.1, 0.5, 5) for L in [2.0, 2.7, 3.5]: radii [] model BicycleModel(lfL/2, lrL/2) for delta in deltas: radius L / np.tan(delta) radii.append(radius) plt.plot(deltas, radii, labelfL{L}m) plt.legend()4.2 速度与转向角组合# 测试不同速度下的轨迹 def test_velocity(): model BicycleModel() velocities [1, 2, 3] deltas [0.1, 0.2, 0.3] fig, axes plt.subplots(1, 3, figsize(15, 5)) for ax, delta in zip(axes, deltas): for V in velocities: state np.array([0, 0, 0]) trajectory [state.copy()] for _ in range(100): state model.kinematic_model(state, delta, V, 0.1) trajectory.append(state.copy()) trajectory np.array(trajectory) ax.plot(trajectory[:,0], trajectory[:,1], labelfV{V}m/s) ax.set_title(fδf{delta}rad) ax.legend()5. 模型局限性及改进方向虽然自行车模型简单实用但它有明显的局限性低速限制仅适用于速度5m/s的场景忽略动力学不考虑轮胎力、质量分布等因素简化转向实际车辆使用阿克曼转向几何对于更精确的建模可以考虑class EnhancedBicycleModel(BicycleModel): def __init__(self, lf, lr, tau0.5): super().__init__(lf, lr) self.tau tau # 转向延迟时间常数 def steering_delay(self, delta_d, delta_f, dt): # 一阶转向延迟模型 return delta_f (delta_d - delta_f)/self.tau * dt这个增强模型引入了转向系统延迟更接近真实车辆的响应特性自行车模型是理解自动驾驶基础的第一步。通过这个Python实现你可以直观地看到参数变化如何影响车辆行为为后续学习更复杂的模型打下坚实基础。

更多文章