自動駕駛系統的車輛動力學建模:自行車模型與汽車模型的對比分析


在自動駕駛系統的車輛動力學建模中,自行車模型(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. 復雜汽車模型的應用場景

盡管自行車模型廣泛使用,但在以下場景中需切換至復雜模型:

  1. 高速穩定性控制(>80km/h):需考慮橫向載荷轉移對輪胎抓地力的影響。
  2. 極限工況仿真:如緊急避障時車輛進入非線性區域的動力學行為。
  3. 車輛動力學測試:評估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. 總結

自行車模型因其簡潔性實時性成為自動駕駛控制算法的首選,而復雜模型則用于特定場景驗證車輛動力學深度分析。實際工程中需根據車速控制頻率可用參數動態選擇模型,以平衡精度與計算效率。

下一篇將講解混合策略的應用示例以及可視化驗證代碼,歡迎關注!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74227.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言入門教程100講(6)類型修飾符

文章目錄 1. 什么是類型修飾符&#xff1f;2. 常見的類型修飾符3. 類型修飾符的使用3.1 short 和 long3.2 signed 和 unsigned 4. 類型修飾符的組合5. 示例代碼代碼解析&#xff1a;輸出結果&#xff1a; 6. 常見問題問題 1&#xff1a;short 和 long 的具體大小是多少&#xf…

Linux-Ubuntu 系統學習筆記 | 從入門到實戰

&#x1f4d8; Linux-Ubuntu 系統學習筆記 | 從入門到實戰 &#x1f4dc; 目錄 環境安裝基本操作Linux操作系統介紹文件系統常用命令用戶權限管理編輯器vimGCC編譯器動態庫與靜態庫Makefile 1. 環境安裝 &#x1f31f; 下載鏡像 推薦使用清華大學開源鏡像站下載Ubuntu鏡像&a…

防火墻帶寬管理

拓撲 配置 [fw]interface GigabitEthernet 0/0/0 [fw-GigabitEthernet0/0/0]service-manage all permit [fw]interface GigabitEthernet 1/0/0 [fw-GigabitEthernet1/0/0]ip address 12.0.0.1 24 [fw]interface GigabitEthernet 1/0/1 [fw-GigabitEthernet1/0/1]ip ad…

一人系統 之 為什么要做一人系統?

一人系統 之 賺錢認知篇&#xff08;下&#xff09; 本文 2119個字&#xff0c;大概閱讀時間 16分鐘。 在上一篇文章中&#xff0c;主要講了以下三個內容&#xff1a; 什么是好的工作&#xff1f;時薪高&#xff0c;并且有能力提升&#xff0c;而且最終可以獨立創業的工作&…

基于springboot的電影院管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 互聯網技術的成熟和普及&#xff0c;勢必會給人們的生活方式帶來不同程度的改變。越來越多的經營模式中都少不了線上運營&#xff0c;互聯網正強力推動著社會和經濟發展。國人對民族文化的自信和不同文化的包容&#xff0c;再加上電影行業的發展&#xff0c;如此繁榮吸引…

Java安全-類的動態加載

類的加載過程 先在方法區找class信息&#xff0c;有的話直接調用&#xff0c;沒有的話則使用類加載器加載到方法區(靜態成員放在靜態區&#xff0c;非靜態成功放在非靜態區)&#xff0c;靜態代碼塊在類加載時自動執行代碼&#xff0c;非靜態的不執行;先父類后子類&#xff0c;…

ROS多機通信功能包——Multibotnet

引言 這是之前看到一位大佬做的集群通信中間件&#xff0c;突發奇想&#xff0c;自己也來做一個&#xff0c;實現更多的功能、更清楚的架構和性能更加高效的ROS多機通信的功能包 鏈接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

C++:背包問題習題

1. 貨幣系統 1371. 貨幣系統 - AcWing題庫 給定 V 種貨幣&#xff08;單位&#xff1a;元&#xff09;&#xff0c;每種貨幣使用的次數不限。 不同種類的貨幣&#xff0c;面值可能是相同的。 現在&#xff0c;要你用這 V 種貨幣湊出 N 元錢&#xff0c;請問共有多少種不同的…

IT工具 | node.js 進程管理工具 PM2 大升級!支持 Bun.js

P(rocess)M(anager)2 是一個 node.js 下的進程管理器&#xff0c;內置負載均衡&#xff0c;支持應用自動重啟&#xff0c;常用于生產環境運行 node.js 應用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2發布最新版本v6.0.5&#xff0c;這…

2025年01月02日浙江鼎永前端面試

目錄 webpack 和 vite 區別react fiber 架構vue diff 算法react diff 算法hooks 源碼垂直水平布局項目介紹單點登錄大文件上傳微前端 1. webpack 和 vite 區別 Webpack 和 Vite 是兩種不同的前端構建工具&#xff0c;它們在設計理念、性能表現和使用場景上存在顯著差異。以下…

1.企業級AD活動目錄核心解析:架構、組件與集成實踐

在當今數字化時代&#xff0c;企業級網絡環境日益復雜&#xff0c;高效、安全的資源管理和用戶認證成為企業 IT 運營的關鍵。AD&#xff08;Active Directory&#xff09;活動目錄作為微軟 Windows 系列服務器中的重要目錄服務&#xff0c;為企業級網絡管理提供了強大的解決方案…

【數據分享】2014-2024年我國各城市逐年空氣質量指數(AQI)數據

空氣質量指數&#xff08;AQI&#xff09;是一個衡量空氣污染程度的綜合指標&#xff0c;它并不直接表示具體污染物的濃度值&#xff0c;而是基于多種污染物的濃度進行的綜合評價&#xff0c;具體基于六種主要污染物的濃度&#xff1a;PM2.5、PM10、SO?、NO?、O?和CO。AQI是…

【C++】深入理解list迭代器的設計與實現

深入理解list迭代器的設計與實現 引言1、鏈表基礎結構2、鏈表迭代器的封裝2.1 初步封裝迭代器類2.2 引入const迭代器2.2.1 參考STL源代碼2.2.2 完善迭代器 3、迭代器實現機制結語 引言 在STL容器中&#xff0c;list作為經典的雙向鏈表容器&#xff0c;其迭代器設計體現了C模板編…

C語言基礎系列【27】typedef

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距離公式

一、各類距離公式總結 常見距離公式 歐氏距離&#xff1a; 曼哈頓距離&#xff08;L1&#xff09;?&#xff1a; 切比雪夫距離&#xff08;Chessboard&#xff09;?&#xff1a; 1、點與點距離(歐氏距離) ?二維空間? 設兩點坐標為 P1(x1,y1)、P2(x2,y2)&#xff0c;其距離…

Vue.js 模板語法全解析:從基礎到實戰應用

引言 在 Vue.js 的開發體系中&#xff0c;模板語法是構建用戶界面的核心要素&#xff0c;它讓開發者能夠高效地將數據與 DOM 進行綁定&#xff0c;實現動態交互效果。通過對《Vue.js 快速入門實戰》中關于 Vue 項目部署章節&#xff08;實際圍繞 Vue 模板語法展開&#xff09;…

論文筆記(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理問答&#xff08;ERQA&#xff09;基準測試2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零樣本和少樣本機器人控制 3. 使用 Gemini Robotics 執行機器人動作3…

centos7搭建postgresql12主從

主從搭建 192.168.159.101 node1 主庫&#xff08;讀寫&#xff09; 192.168.159.102 node2 備庫&#xff08;只讀&#xff09; 兩臺機器首先安裝postgrsql 主庫 postgres用戶操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置僅用于遠程訪問, 流復制后續還有額外…