《自動駕駛軌跡規劃實戰:Lattice Planner實現避障路徑生成(附可運行Python代碼)》—— 零基礎實現基于離散優化的避障路徑規劃


《自動駕駛軌跡規劃實戰:Lattice Planner實現避障路徑生成(附可運行Python代碼)》
—— 零基礎實現基于離散優化的避障路徑規劃


一、為什么Lattice Planner成為自動駕駛的核心算法?

在自動駕駛的路徑規劃領域,Lattice Planner(格子規劃器)憑借其結構化采樣+動態優化的特性,成為Waymo、Aptiv等頭部企業的核心算法。與傳統A*、RRT算法不同,Lattice Planner通過橫向位移采樣+縱向速度規劃的復合策略,能夠在10ms內生成滿足車輛運動學約束的平滑軌跡。本文將手把手實現一個簡化版Lattice Planner,并針對經典“避障場景”進行代碼級解析。


二、算法原理精講(附數學推導圖示)

2.1 軌跡生成三要素
s(t) = s_0 + v_0 t + \frac{1}{2}a t^2 \quad \text{(縱向運動方程)}
d(s) = c_0 + c_1 s + c_2 s^2 + c_3 s^3 \quad \text{(橫向多項式擬合)}
2.2 成本函數設計
評價維度權重系數計算公式
舒適性0.4∑(jerk2)
安全性0.3障礙物距離倒數
路徑貼合度0.2參考線偏移量
能耗效率0.1速度變化率

三、Python代碼實現(可直接運行)

3.1 環境初始化
import numpy as np
import matplotlib.pyplot as pltclass Vehicle:def __init__(self):self.width = 2.0    # 車寬self.length = 4.5   # 車長self.max_acc = 2.0  # 最大加速度(m/s2)self.max_jerk = 1.5 # 最大加加速度(m/s3)obstacles = [{'x': 30, 'y': 1.8, 'r': 1.2},{'x': 45, 'y': -1.5, 'r': 0.8}
]  # 障礙物坐標及半徑
3.2 軌跡采樣核心函數
def generate_lattice_paths(current_state, horizon=5.0, dt=0.1):""":param current_state: 當前狀態 [s, s_dot, d, d_dot]:param horizon: 規劃時長(s):return: 候選軌跡列表"""paths = []# 縱向速度采樣(3種模式)for s_dot_end in np.linspace(8, 12, 3):  # 8m/s~12m/s# 橫向位移采樣(5種偏移)for d_end in np.linspace(-1.5, 1.5, 5):  t = np.arange(0, horizon + dt, dt)# 縱向四次多項式擬合s_coeff = np.polyfit([0, horizon], [current_state[0], current_state[0] + s_dot_end*horizon], 4)# 橫向五次多項式擬合d_coeff = np.polyfit([0, horizon], [current_state[2], d_end], 5)path = {'s': np.polyval(s_coeff, t),'d': np.polyval(d_coeff, t),'s_dot': np.polyval(np.polyder(s_coeff), t),'d_dot': np.polyval(np.polyder(d_coeff), t)}paths.append(path)return paths
3.3 碰撞檢測與最優選擇
def select_optimal_path(paths, obstacles):min_cost = float('inf')best_path = Nonefor path in paths:# 計算舒適性成本jerk_cost = np.mean(np.diff(path['s_dot'])**2)# 計算安全成本collision_cost = 0for t in range(len(path['s'])):x = path['s'][t]y = path['d'][t]for obs in obstacles:dist = np.sqrt((x - obs['x'])**2 + (y - obs['y'])**2)if dist < (obs['r'] + 1.5):  # 1.5m為安全距離collision_cost += 1 / max(dist, 0.1)# 計算總成本total_cost = 0.4*jerk_cost + 0.3*collision_costif total_cost < min_cost:min_cost = total_costbest_path = pathreturn best_path
3.4 可視化運行
def plot_scenario(paths, best_path, obstacles):plt.figure(figsize=(10, 6))# 繪制障礙物for obs in obstacles:circle = plt.Circle((obs['x'], obs['y']), obs['r'], color='r', alpha=0.3)plt.gca().add_patch(circle)# 繪制所有候選路徑for path in paths:plt.plot(path['s'], path['d'], 'gray', alpha=0.2)# 高亮最優路徑plt.plot(best_path['s'], best_path['d'], 'b', linewidth=2)plt.xlabel('Longitudinal Position (m)')plt.ylabel('Lateral Position (m)')plt.grid(True)plt.axis('equal')plt.show()# 主程序
if __name__ == "__main__":ego_state = [20, 10, 0, 0]  # [s, s_dot, d, d_dot]candidate_paths = generate_lattice_paths(ego_state)optimal_path = select_optimal_path(candidate_paths, obstacles)plot_scenario(candidate_paths, optimal_path, obstacles)

完整代碼

#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as pltclass Vehicle:def __init__(self):self.width = 2.0    # 車寬self.length = 4.5   # 車長self.max_acc = 2.0  # 最大加速度(m/s2)self.max_jerk = 1.5 # 最大加加速度(m/s3)obstacles = [{'x': 30, 'y': 1.8, 'r': 1.2},{'x': 45, 'y': -1.5, 'r': 0.8}
]  # 障礙物坐標及半徑
def generate_lattice_paths(current_state, horizon=5.0, dt=0.1):""":param current_state: 當前狀態 [s, s_dot, d, d_dot]:param horizon: 規劃時長(s):return: 候選軌跡列表"""paths = []# 縱向速度采樣(3種模式)for s_dot_end in np.linspace(8, 12, 3):  # 8m/s~12m/s# 橫向位移采樣(5種偏移)for d_end in np.linspace(-1.5, 1.5, 5):  t = np.arange(0, horizon + dt, dt)# 縱向四次多項式擬合s_coeff = np.polyfit([0, horizon], [current_state[0], current_state[0] + s_dot_end*horizon], 4)# 橫向五次多項式擬合d_coeff = np.polyfit([0, horizon], [current_state[2], d_end], 5)path = {'s': np.polyval(s_coeff, t),'d': np.polyval(d_coeff, t),'s_dot': np.polyval(np.polyder(s_coeff), t),'d_dot': np.polyval(np.polyder(d_coeff), t)}paths.append(path)return paths
def select_optimal_path(paths, obstacles):min_cost = float('inf')best_path = Nonefor path in paths:# 計算舒適性成本jerk_cost = np.mean(np.diff(path['s_dot'])**2)# 計算安全成本collision_cost = 0for t in range(len(path['s'])):x = path['s'][t]y = path['d'][t]for obs in obstacles:dist = np.sqrt((x - obs['x'])**2 + (y - obs['y'])**2)if dist < (obs['r'] + 1.5):  # 1.5m為安全距離collision_cost += 1 / max(dist, 0.1)# 計算總成本total_cost = 0.4*jerk_cost + 0.3*collision_costif total_cost < min_cost:min_cost = total_costbest_path = pathreturn best_path
def plot_scenario(paths, best_path, obstacles):plt.figure(figsize=(10, 6))# 繪制障礙物for obs in obstacles:circle = plt.Circle((obs['x'], obs['y']), obs['r'], color='r', alpha=0.3)plt.gca().add_patch(circle)# 繪制所有候選路徑for path in paths:plt.plot(path['s'], path['d'], 'gray', alpha=0.2)# 高亮最優路徑plt.plot(best_path['s'], best_path['d'], 'b', linewidth=2)plt.xlabel('Longitudinal Position (m)')plt.ylabel('Lateral Position (m)')plt.grid(True)plt.axis('equal')plt.show()# 主程序
if __name__ == "__main__":ego_state = [20, 10, 0, 0]  # [s, s_dot, d, d_dot]candidate_paths = generate_lattice_paths(ego_state)optimal_path = select_optimal_path(candidate_paths, obstacles)plot_scenario(candidate_paths, optimal_path, obstacles)

四、運行結果分析

在這里插入圖片描述

(注:實際運行后將顯示包含障礙物區域和最優路徑的軌跡圖,灰色為候選路徑,藍色為最優避障路徑)


五、工程優化建議

  1. 引入Frenet坐標系:將全局坐標轉換為(s,d)坐標系,簡化橫向/縱向解耦計算
  2. 動態權重調整:根據場景危險程度自動調整成本函數權重(如障礙物接近時加大安全權重)
  3. 運動學約束檢查:添加最大曲率、加速度邊界條件校驗
  4. 多線程優化:對候選軌跡的代價計算進行并行加速

六、結語

通過不到100行的Python代碼,我們實現了一個完整的Lattice Planner避障規劃原型系統。該代碼在Python 3.8+環境下可直接運行(需安裝numpy和matplotlib)。在實際自動駕駛系統中,還需融合高精地圖、感知預測模塊等,但核心的軌跡生成與優化思想與此文一脈相承。

技術亮點

  1. 采用多項式參數化方法保證軌跡平滑性
  2. 引入多維度加權成本函數實現最優決策
  3. 模塊化設計便于功能擴展

原創聲明:本文代碼及算法思路均為作者原創,轉載需注明出處。關注技術博客獲取更多自動駕駛實戰教程!

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

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

相關文章

切換到舊提交,同時保證當前修改不丟失

在 Git 中&#xff0c;可以通過以下幾種方式切換到之前的提交&#xff0c;同時保留當前的提交&#xff08;即不丟失工作進度&#xff09;&#xff1a; 1. 使用 git checkout 創建臨時分離頭指針&#xff08;推薦用于查看&#xff09; git checkout <commit-hash>這會讓…

zookeeper 操作總結

zookeeper 中的節點類型 節點類型命令選項說明?持久節點?無選項&#xff08;默認&#xff09;永久存在&#xff0c;除非手動刪除。?臨時節點?-e與客戶端會話綁定&#xff0c;會話結束自動刪除&#xff08;?不能有子節點?&#xff09;。?順序節點?-s節點名自動追加遞增…

nova14 ultra,是如何防住80°C熱水和10000KPa水壓沖擊的?

暴雨突襲&#xff0c;手忙腳亂護住背包&#xff0c;卻擔心手機被雨水浸濕&#xff1b;泳池里想記錄美好時刻&#xff0c;卻擔心手機掉入水中 &#xff1b;廚房里充滿了高溫水汽&#xff0c;近距離拍攝美食瞬間&#xff0c;手機屏幕花屏&#xff0c;讓人失去了對美食的興趣…… …

flutter加載dll 報錯問題

解決flutter加載dll 報錯問題 LoadLibrary 報錯 126 or 193 明確一點&#xff1a;flutter構建exe 時默認是MSVC的。 1. 先檢查dll 的位數是否滿足 file ***.dll output: PE32 executable (DLL) (console) x86-64, for MS Windows, 19 sections 這種是64位的機器。 滿足的話可…

Mac 版不能連接華為 GaussDB 嗎?我看 Windows 版可以連接?

&#x1f9d1;?&#x1f4bb; GaussDB 用戶 Mac 版不能連接華為 GaussDB 嗎&#xff1f;我看Windows 版可以連接。 &#x1f9d1;?&#x1f527; 官方技術中心 由于 GaussDB 數據庫本身未支持 macOS 系統&#xff0c;所以在 macOS 上的 Navicat 中也未支持該數據庫。 &…

【MySQL成神之路】MySQL索引相關介紹

1 相關理論介紹 一、索引基礎概念 二、索引類型 1. 按數據結構分類 2. 按功能分類 三、索引數據結構原理 B樹索引特點&#xff1a; 哈希索引特點&#xff1a; 四、索引使用原則 1. 創建索引原則 2. 避免索引失效情況 五、索引優化策略 六、索引維護與管理 七、特殊…

五、web安全--XSS漏洞(1)--XSS漏洞利用全過程

本文章僅供學習交流&#xff0c;如作他用所承受的法律責任一概與作者無關1、XSS漏洞利用全過程 1.1 尋找注入點&#xff1a;攻擊者首先需要找到目標網站中可能存在XSS漏洞的注入點。這些注入點通常出現在用戶輸入能夠直接輸出到頁面&#xff0c;且沒有經過適當過濾或編碼的地方…

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker(Ubuntu 服務器)

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker&#xff08;Ubuntu 服務器&#xff09; 在日常項目開發中&#xff0c;我們經常會將 Spring Boot 項目打包并部署到服務器上的 Docker 環境中。為了提升效率、減少重復操作&#xff0c;我們可以通過 Shell 腳本實現自動…

高考加油(Python+HTML)

前言 詢問DeepSeek根據自己所學到的知識來生成多個可執行的代碼&#xff0c;為高考學子加油。最開始生成的都會有點小問題&#xff0c;還是需要自己調試一遍&#xff0c;下面就是完整的代碼&#xff0c;當然了最后幾天也不會有多少人看&#xff0c;都在專心的備考。 Python勵…

HTTP協議接口三種測試方法之-JMeter(保姆教程)

在當今 API 驅動的開發世界中&#xff0c;高效、可靠的 HTTP 接口測試是保障應用質量的關鍵。作為開源性能測試工具中的王者&#xff0c;Apache JMeter 不僅擅長壓力測試&#xff0c;更是進行功能性和回歸測試的利器。本文將手把手教你如何用 JMeter 構建強大的 HTTP 測試計劃&…

聊聊JVM怎么調優?(實戰總結)

JVM 核心配置與調優指南 一、堆內存與年輕代配置&#xff08;影響最大&#xff09; 堆內存大小&#xff1a; 在資源允許的前提下&#xff0c;堆內存應盡可能設置得更大。關鍵點&#xff1a; 必須將堆內存的最大值 (-Xmx) 和最小值 (-Xms) 設置為相同值。動態擴容會觸發 Full G…

開疆智能Profinet轉Profibus網關連接費斯托閥島總線模塊配置案例

本案例是通過開疆智能Profibus轉Profinet網關將費托斯閥島接入到西門子1200PLC的配置案例。 首先我們先了解一下Profibus報文以及他的通訊原理。 除了起始符 SD 和結束符 ED 這些固定數值之外&#xff0c;還有功能碼&#xff08;Function Code, FC&#xff09;和服務訪問點&…

ARM內核一覽

經常看介紹某某牛批芯片用的又是ARM什么核&#xff0c;看的云里霧里&#xff0c;所以簡單整理整理。&#xff08;內容來自官網和GPT&#xff09; 1 ARM 內核總體分類 系列特點應用場景Cortex-M超低功耗、低成本、實時性嵌入式系統、微控制器、IoTCortex-R高可靠性、硬實時汽車…

RT Thread Nano V4.1.1 rtconfig.h 注釋 Configuration Wizard 格式

rtcomfig.h 以下是對 [rtconfig.h](file://c:\Users\admin\Downloads\rtthread-nano-master\rt-thread\bsp\stm32f407-msh\RT-Thread\rtconfig.h) 文件中每一個配置項的詳細注釋說明: 基本配置(Basic Configuration) [RT_THREAD_PRIORITY_MAX](file://c:\Users\admin\Downl…

UniApp網頁版集成海康視頻播放器

注意&#xff1a;本人全部集成好后使用最新的海康平臺下載插件進行替換后就不能預覽視頻 使用Uni插件進行集成&#xff1a;海康視頻H5播放器組件 - DCloud 插件市場 CSDN資源下載&#xff1a;https://download.csdn.net/download/wangdaoyin2010/90910975 注意&#xff1a;初…

WPF【10_2】數據庫與WPF實戰-示例

客戶預約關聯示例圖 MainWindow.xaml 代碼 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…

理解 Kubernetes 的架構與控制平面組件運行機制

文章目錄 K8s架構K8s核心組件控制平面組件&#xff08;部署在 Master 節點&#xff09;1. 查看組件運行情況2. 查看組件 help 命令 Node端組件&#xff08;部署在每個工作節點&#xff09; K8s內部工作原理 Kubernetes&#xff08;也稱為 K8s&#xff09;是一個開源的容器編排和…

Express+MySQL后臺開發實戰:從模塊化到錯誤處理的全鏈路解析

ExpressMySQL后臺開發實戰&#xff1a;從模塊化到錯誤處理的全鏈路解析 摘要&#xff1a;本文將以Node.jsExpress框架為基礎&#xff0c;結合MySQL數據庫實戰&#xff0c;深度剖析后臺系統中數據庫模塊化設計、安全查詢、錯誤處理等核心開發要點。 一、項目環境與技術棧 ├─…

Spring AI 智能體代理模式(Agent Agentic Patterns)

AgentAgenticPatterns 簡介 在最近的一篇研究報告《構建高效代理》 中&#xff0c;Anthropic分享了關于構建高效大語言模型&#xff08;LLM&#xff09;代理的寶貴見解。這項研究特別有趣的地方在于&#xff0c;它強調簡單性和可組合性&#xff0c;而非復雜的框架。讓我們來探…

基于 Vue3 與 exceljs 實現自定義導出 Excel 模板

在開發中&#xff0c;我們需要常常為用戶提供更多的數據錄入方式&#xff0c;Excel 模板導出與導入是一個常見的功能點。本文將介紹如何使用 Vue3、exceljs 和 file-saver 實現一個自定義導出 Excel 模板&#xff0c;并在特定列添加下拉框選擇的數據驗證功能。 技術選型 excelj…