純跟蹤算法本質解密:航向角偏差=預瞄角?數學證明與工程實踐

定義關鍵問題

在深入純跟蹤算法核心前,必須澄清一對容易被混淆但至關重要的概念:

概念坐標系物理意義計算方式
航向角偏差(α_global)全局坐標系車輛航向與預瞄點方向的夾角預瞄點方位角 - 車輛航向角
預瞄角(α_body)車身坐標系預瞄點相對于車輛縱軸的夾角車身坐標下的反正切計算

關鍵疑問:為什么文獻中對二者的論述常常混用?是否真的 α_global ≡ α_body?

一、核心公式與參數

在這里插入圖片描述

1. 純跟蹤控制公式

本部分展示了車輛純跟蹤控制中常用的數學公式。我們通過這些公式計算車輛的轉向角度,并根據車速、預瞄點的位置等因素來調節轉向。以下是核心公式:
δ = arctan ? ( 2 L ? sin ? ( α ) l d ) , l d = k v ? v + l o \delta = \arctan\left(\frac{2L \cdot \sin(\alpha)}{l_{\text{d}}}\right), \ l_{\text{d}} = k_v \cdot v + l_{\text{o}} δ=arctan(ld?2L?sin(α)?),?ld?=kv??v+lo?
其中, α \alpha α 表示航向角偏差,通過以下公式計算:
α = arctan ? ( y r ? y x r ? x ) ? ψ \alpha = \arctan\left(\frac{y_{\text{r}}-y}{x_{\text{r}}-x}\right) - \psi α=arctan(xr??xyr??y?)?ψ

2. 參數說明表

符號含義單位典型值補充說明
δ \delta δ前輪轉角rad±0.52 (±30°)
L L L車輛軸距m2.5~3.5轎車約2.7m,SUV約2.9m
α \alpha α航向角偏差rad-即預瞄角
l d l_d ld?前視距離m3~20速度相關
k v k_v kv?速度增益s0.5~1.0調參重點
l 0 l_0 l0?最小視距m2~3保證低速性能
x , y x,y x,y車輛坐標m-全局坐標系
x r , y r x_{\text{r}}, y_{\text{r}} xr?,yr?預瞄點坐標m-
ψ \psi ψ車輛航向角rad-全局坐標系

二、等價性證明

在這一部分,我們將討論全局坐標系中航向角偏差與車身坐標系中預瞄角的計算公式,并證明這兩個坐標系中的角度計算是等價的。

1. 全局坐標系計算—航向角偏差

設車輛狀態向量為 S t a t e = [ x , y , ψ ] T \mathbf{State} = [x, y, \psi]^T State=[x,y,ψ]T,其中:

  • ( x , y ) (x, y) (x,y)為車輛在全局坐標系中的位置
  • ψ \psi ψ為車輛航向角(全局坐標系)

給定預瞄點坐標 ( x t , y t ) (x_t, y_t) (xt?,yt?),則航向角偏差定義為:
α global = arctan ? 2 ( y t ? y , x t ? x ) ? 預瞄點方位角 ? ψ \alpha_{\text{global}} = \underbrace{\arctan2(y_t - y, x_t - x)}_{\text{預瞄點方位角}} - \psi αglobal?=預瞄點方位角 arctan2(yt??y,xt??x)???ψ

物理意義 α global \alpha_{\text{global}} αglobal?表示車輛當前航向指向預瞄點方向之間的夾角

2. 車身坐標系計算—預瞄角

將預瞄點從全局坐標系轉換到車身坐標系的變換過程:
坐標平移:以車輛位置為坐標原點
Δ x = x t ? x Δ y = y t ? y \Delta x = x_t - x \\ \Delta y = y_t - y Δx=xt??xΔy=yt??y
坐標旋轉:消除航向角影響
[ x body y body ] = R ( ψ ) ? [ Δ x Δ y ] = [ cos ? ψ sin ? ψ ? sin ? ψ cos ? ψ ] [ Δ x Δ y ] \begin{bmatrix} x_{\text{body}} \\ y_{\text{body}} \end{bmatrix} = \mathbf{R}(\psi) \cdot \begin{bmatrix} \Delta x \\ \Delta y \end{bmatrix} = \begin{bmatrix} \cos\psi & \sin\psi \\ -\sin\psi & \cos\psi \end{bmatrix} \begin{bmatrix} \Delta x \\ \Delta y \end{bmatrix} [xbody?ybody??]=R(ψ)?[ΔxΔy?]=[cosψ?sinψ?sinψcosψ?][ΔxΔy?]

預瞄角計算
α body = arctan ? 2 ( y body , x body ) \alpha_{\text{body}} = \arctan2(y_{\text{body}}, x_{\text{body}}) αbody?=arctan2(ybody?,xbody?)

物理意義 α body \alpha_{\text{body}} αbody?表示在車輛自身視角下預瞄點與車頭正方向的夾角

3. 等價性數學證明

在這里插入圖片描述

4.等價性結論

α global ≡ α body \alpha_{\text{global}} \equiv \alpha_{\text{body}} αglobal?αbody?

三、Python代碼實現:

1. 等價性驗證代碼

import numpy as npdef calculate_angles(ego_x, ego_y, ego_yaw, target_x, target_y):"""驗證航向角偏差與預瞄角的等價性"""# 全局坐標系計算dx = target_x - ego_xdy = target_y - ego_ytarget_yaw = np.arctan2(dy, dx)yaw_error = target_yaw - ego_yawyaw_error = np.arctan2(np.sin(yaw_error), np.cos(yaw_error))  # 歸一化# 車身坐標系計算rotation_matrix = np.array([[np.cos(ego_yaw), np.sin(ego_yaw)],[-np.sin(ego_yaw), np.cos(ego_yaw)]])dx_body, dy_body = rotation_matrix @ np.array([dx, dy])preview_angle = np.arctan2(dy_body, dx_body)# 計算差異(應≈0)angle_diff = np.degrees(np.abs(yaw_error - preview_angle))return yaw_error, preview_angle, angle_diff

2. 完整純跟蹤控制器

class PurePursuitController:def __init__(self, wheelbase, k_v=0.6, l0=3.0, max_steer_deg=30.0):"""純跟蹤控制器:param wheelbase: 車輛軸距(m):param k_v: 速度前視增益:param l0: 基礎前視距離(m):param max_steer_deg: 最大轉向角(度)"""self.L = wheelbaseself.k_v = k_vself.l0 = l0self.max_steer = np.radians(max_steer_deg)def get_steering_angle(self, v, ego_x, ego_y, ego_yaw, target_x, target_y):"""計算轉向角:param v: 當前車速(m/s):param ego_x, ego_y: 車輛位置:param ego_yaw: 車輛航向(rad):param target_x, target_y: 預瞄點位置:return: 轉向角(rad)"""# 1. 計算動態前視距離lookahead = max(self.l0, self.k_v * v)  # 保證最小前視距離# 2. 計算航向角偏差(即預瞄角)dx = target_x - ego_xdy = target_y - ego_ytarget_yaw = np.arctan2(dy, dx)alpha = target_yaw - ego_yawalpha = np.arctan2(np.sin(alpha), np.cos(alpha))  # 歸一化到[-π, π]# 3. 純跟蹤公式steering = np.arctan(2 * self.L * np.sin(alpha) / lookahead)# 4. 轉向限幅return np.clip(steering, -self.max_steer, self.max_steer)

四、應用場景說明?

預瞄距離調參經驗

場景 k v k_v kv? l 0 l_0 l0?效果
城市道路0.3~0.53m平滑轉彎
高速公路0.8~1.05m提前預判
泊車場景0.1~0.32m精準控制

五、常見問題解答?

Q: 為什么不直接使用距離偏差代替角度偏差?
角度偏差具有方向敏感性,當車輛偏離路徑時:

  • 角度偏差:能立即反映偏離方向(左/右)
  • 距離偏差:不能反映偏離方向

Q: 如何防止預瞄點跳變?
采用路徑點篩選策略:

# 選擇最近路徑點前方lookahead距離的點
min_idx = np.argmin(np.sqrt((path_x-ego_x)**2 + (path_y-ego_y)**2))
target_idx = min_idx + int(lookahead / point_interval)

六、算法計算邏輯示意圖

在這里插入圖片描述

當然,航向角偏差如果是用預瞄點計算的,那么兩者就是等價的,否則根據實際情況判斷

七、參考

自動駕駛控制算法——純跟蹤算法(Pure Pursuit)

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

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

相關文章

自動駕駛叉車在倉庫環境中是否安全?

隨著自動駕駛叉車的興起,倉庫運營持續演進。叉車自動化技術的引入使倉庫設施變得更快、更安全且更具成本效益。然而一個關鍵問題依然存在:它們在繁忙的倉庫環境中是否安全? 一 、什么是自動駕駛叉車? 自動駕駛叉車,也…

Neo4j操作指南:修改節點數據與新增節點屬性

Neo4j操作指南:修改節點數據與新增節點屬性 引言 Neo4j作為領先的圖數據庫,提供了靈活的數據操作方式。在實際應用中,我們經常需要修改已有節點的數據或為節點添加新屬性。本文將詳細介紹如何使用Cypher查詢語言在Neo4j中完成這些操作&…

AI大模型學習之基礎數學:微積分在AI大模型中的核心-梯度與優化(梯度下降)詳解

微積分在AI大模型中的核心:梯度與優化(梯度下降) 人工智能(AI)大模型的訓練和優化依賴于數學基礎,其中微積分、線性代數和概率統計構成了其理論核心。微積分在AI中的核心作用在于提供優化工具,尤其是通過梯度和梯度下降方法,幫助模型在高維參數空間中找到損失函數的最…

記錄tweenjs踩坑

初次上手tweenjs&#xff0c;試了很多示例代碼都不生效&#xff0c;結果在html中生效&#xff0c;在vue3的項目中怎么都不生效 <!DOCTYPE html> <html lang"en"><head><title>Tween.js / simplest possible example!</title><meta…

PINA開源程序用于高級建模的 Physics-Informed 神經網絡

?一、軟件介紹 文末提供程序和源碼下載 PINA 是一個開源 Python 庫&#xff0c;旨在簡化和加速科學機器學習 &#xff08;SciML&#xff09; 解決方案的開發。PINA 基于 PyTorch、PyTorch Lightning 和 PyTorch Geometry 構建&#xff0c;提供了一個直觀的框架&#xff0c;用…

一種對外IP/MAC地址收斂的軟硬件系統

----------原創不易&#xff0c;歡迎點贊收藏。廣交嵌入式開發的朋友&#xff0c;討論技術和產品------------- 今天發一篇五年前的文章&#xff0c;不調單板。對以太網和交換片的較多理解&#xff0c;對系統級的優化。 大部分的網絡設備&#xff0c;都由多種單板組成&#x…

【flink】 flink 讀取debezium-json數據獲取數據操作類型op/rowkind方法

flink 讀取debezium-json數據獲取數據操作類型op/rowkind方法。 op類型有c&#xff08;create&#xff09;,u&#xff08;update&#xff09;,d&#xff08;delete&#xff09; 參考官網案例&#xff1a;此處的"op": "u",就是操作類型。 {"before&qu…

某手游cocos2dlua反編譯

一、獲取加載的luac文件 通過frida hook libccos2dlua.so 的luaL_loadbuffer函數對luac進行dump js代碼如下&#xff0c;得到dump后的lua文件 // 要加載的目標庫名 var targetLibrary "libcocos2dlua.so"; var dlopen Module.findExportByName(null, "dlope…

`toRaw` 與 `markRaw`:Vue3 響應式系統的細粒度控制

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

Python文件遷移之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作&#xff0c;還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil&#xff0c;我們可以更加輕松地實現文件系統的管理和維護&#xff0c;本文…

【服務器R環境架構】基于 micromamba下載 R 庫包

目錄 準備工作&#xff1a;下載并安裝R環境下載并安裝R環境方式1&#xff1a;下載 .tar.bz2 壓縮包進行解壓執行&#xff08;官方推薦&#xff09;方式2&#xff1a; 創建并激活R環境 下載R庫包安裝CRAN包在 micromamba 中安裝 GitHub 包&#xff08;如 BPST&#xff09; 參考 …

基于 Apache POI 實現的 Word 操作工具類

基于 Apache POI 實現的 Word 操作工具類 這個工具類是讓 AI 寫的&#xff0c;已覆蓋常用功能。 如不滿足場景的可以讓 AI 繼續加功能。 已包含的功能&#xff1a; 文本相關&#xff1a; 添加文本、 設置字體顏色、 設置字體大小、 設置對齊方式、 設置字符間距、 設置字體加粗…

時間序列預測、分類 | 圖神經網絡開源代碼分享(上)

本期結合《時間序列圖神經網絡(GNN4TS)綜述》&#xff0c;整理了關于圖神經網絡在時間序列預測、分類等任務上的開源代碼和學習資料以供大家學習、研究。 參考論文&#xff1a;《A Survey on Graph Neural Networks for Time Series: Forecasting, Classification, Imputation,…

Vue 添加水印(防篡改: 刪除水印元素節點、修改水印元素的樣式)

MutationObserver_API: 觀察某一個元素的變化// index.vue<template><div class="container"><Watermark text="版權所有" style="background: #28c848"><!-- 可給圖片、視頻、div...添加水印 --><div class=&quo…

如何處理開發不認可測試發現的問題

解決方案 第一步&#xff1a;收集確鑿證據 確保有完整的復現結果準備詳細的記錄材料&#xff1a; 截屏錄屏操作步驟記錄 帶著這些證據與開發人員進行溝通 第二步&#xff1a;多角度驗證 如果與開發人員溝通無果&#xff1a; 競品分析&#xff1a;查看市場上同類產品如何…

linux生產環境下根據關鍵字搜索指定日志文件命令

grep -C 100 "error" server.log 用于在 server.log 文件中查找包含 “error” 的行&#xff0c;并同時顯示該行前后100行的上下文。這是排查日志問題的常用技巧&#xff0c;解釋一下&#xff1a; 命令參數詳解 grep&#xff1a;文本搜索工具&#xff0c;用于在文件…

用vue和echarts怎么寫一個甘特圖,并且是分段式瀑布流

vue echarts 甘特圖功能 index.vue <template><div ref"echart" id"echart" class"echart"></div> </template><script setup>import { nextTick, onMounted, ref } from "vue";import * as echarts f…

Pandas使用教程:從入門到實戰的數據分析利器

一、Pandas基礎入門 1.1 什么是Pandas Pandas是Python生態中核心的數據分析庫&#xff0c;提供高效的數據結構&#xff08;Series/DataFrame&#xff09;和數據分析工具。其名稱源于"Panel Data"&#xff08;面板數據&#xff09;和"Python Data Analysis"…

NuttX Socket 源碼學習

概述 NuttX 的 socket 實現是一個精心設計的網絡編程接口&#xff0c;提供了標準的 BSD socket API。該實現采用分層架構設計&#xff0c;支持多種網絡協議族&#xff08;如 TCP/IP、UDP、Unix域套接字等&#xff09;&#xff0c;具有良好的可擴展性和模塊化特性。 整體架構設…

基于YOLO的語義分割實戰(以豬的分割為例)

數據集準備 數據集配置文件 其實語義分割和目標檢測類似&#xff0c;包括數據集制備、存放格式基本一致像這樣放好即可。 然后需要編寫一個data.yaml文件&#xff0c;對應的是數據的配置文件。 train: C:\圖標\dan\語義分割pig\dataset\train\images #絕對路徑即可 val: C:\…