在自動駕駛系統的車輛動力學建模中,自行車模型(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?αf?Fyr?=Cαr?αr?αf?=δ?vx?vy?+aψ˙??αr?=vx?bψ˙??vy???
計算耗時可能達到10ms以上,難以滿足實時控制需求。
2.2 參數易獲取性
自行車模型僅需軸距(L)和轉向傳動比等少量參數,而復雜模型需要詳細的車輛參數(如輪胎側偏剛度( C_{\alpha} )、懸架剛度等),這些數據可能因車型不同而難以獲取。
2.3 適用場景匹配
在低速城市道路(<50km/h)和中等曲率轉彎場景下,自行車模型的預測誤差通常小于5%,足以滿足控制精度要求。而高速或極限工況(如漂移)則需要更精確的模型。
3. 復雜汽車模型的應用場景
盡管自行車模型廣泛使用,但在以下場景中需切換至復雜模型:
- 高速穩定性控制(>80km/h):需考慮橫向載荷轉移對輪胎抓地力的影響。
- 極限工況仿真:如緊急避障時車輛進入非線性區域的動力學行為。
- 車輛動力學測試:評估ESP(電子穩定程序)等系統時需精確建模。
示例代碼(雙軌模型片段):
def double_track_model(state, delta, Fx):# 狀態變量: [vx, vy, omega, X, Y, psi]# 輸入: 前輪轉角delta, 驅動力Fxm = 1500 # 質量 (kg)Iz = 2500 # 繞Z軸轉動慣量 (kg·m2)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_fFyr = C_alpha_r * alpha_rdvx = (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) / Izreturn [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 pltclass BicycleModel:def __init__(self, L=2.0, max_steer=30.0): # L:軸距,max_steer:最大轉向角self.L = Lself.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_dotdef 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_statefor _ 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.0delta = 0.5# 模擬時間步長0.1s,共100步dt = 0.1steps = 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) / vxalpha_r = (vy - self.lr * omega) / vx# 計算前后輪胎的側向力Fyf = self.C_alpha_f * alpha_fFyr = self.C_alpha_r * alpha_r# 計算車輛的加速度和角加速度dvx = (Fx - Fyf * np.sin(delta)) / self.m + vy * omegadvy = (Fyf * np.cos(delta) + Fyr) / self.m - vx * omegadomega = (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 = omegareturn [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_statefor _ 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弧度,驅動力1000Ndelta = 0.1Fx = 1000.0# 模擬時間步長0.01s,共200步dt = 0.01steps = 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. 實際工程中的混合策略
在自動駕駛系統中,常采用分層建模策略:
- 上層路徑規劃:使用自行車模型快速生成參考軌跡。
- 底層控制:根據車速動態切換模型:
def select_vehicle_model(speed):if speed < 15: # m/s (約54km/h)return BicycleModel()else:return DoubleTrackModel()
- 仿真驗證:在PreScan/CarSim等工具中使用高精度模型驗證算法。
7. 關鍵結論
場景 | 推薦模型 | 理由 |
---|---|---|
低速園區物流車 | 自行車模型 | 計算快、參數少、精度足夠 |
高速公路L3級自動駕駛 | 雙軌模型 | 需考慮高速穩定性 |
控制算法開發 | 自行車模型 | 快速迭代、易調試 |
車輛動力學測試 | 多體動力學模型 | 高保真度、匹配實車數據 |
8. 總結
自行車模型因其簡潔性和實時性成為自動駕駛控制算法的首選,而復雜模型則用于特定場景驗證和車輛動力學深度分析。實際工程中需根據車速、控制頻率和可用參數動態選擇模型,以平衡精度與計算效率。
下一篇將講解混合策略的應用示例以及可視化驗證代碼,歡迎關注!