纯跟踪算法本质解密:航向角偏差=预瞄角?数学证明与工程实践

定义关键问题

在深入纯跟踪算法核心前,必须澄清一对容易被混淆但至关重要的概念:

概念坐标系物理意义计算方式
航向角偏差(α_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(ld2Lsin(α)), ld=kvv+lo
其中, α \alpha α 表示航向角偏差,通过以下公式计算:
α = arctan ⁡ ( y r − y x r − x ) − ψ \alpha = \arctan\left(\frac{y_{\text{r}}-y}{x_{\text{r}}-x}\right) - \psi α=arctan(xrxyry)ψ

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(yty,xtx)ψ

物理意义 α 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=xtxΔy=yty
坐标旋转:消除航向角影响
[ 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} [xbodyybody]=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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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:\…