动手学运动规划:1.5 Frenet坐标系

All tragedy erased, I see only wonders. 我忘却了所有的悲剧,所见皆是奇迹。

—Hollow Knight 空洞骑士

🏰代码及环境配置:请参考0.2 环境配置和代码运行 | 动手学运动规划!


Frenet坐标系是一种在几何学和物理学中常用的坐标系,特别是在轨迹规划和机器人控制中,它能够更直观地表示车辆在弯曲道路上的位置。

1.5.1 概念与优点

通常情况下我们会使用笛卡尔坐标系描述物体的位置,但笛卡尔坐标系对车辆来说信息并不直观,即使给出了车辆位置(x,y). 比如说我们很难直接根据道路边界,其他车辆的(x,y)坐标快速确定对方与自车的相对位置关系.

为了对这些问题进行简化, 在规划算法中经常使用到Frenet坐标系坐标系:

在Frenet坐标系中,车辆的位置由两个坐标描述:s和d。它将道路中心线作为参考线, s表示沿道路的纵向位移,即从道路起点到车辆当前位置的曲线距离;d表示横向位移,即车辆质心到道路中心线的法向距离。

这样做的好处有:

  • 直观表达:Frenet坐标系能够直观表达车辆在道路上的行驶距离和偏离中心线的距离,从而简化了对车辆运动状态的描述。
  • 解耦运动:在Frenet坐标系下,车辆的运动可以分解为沿道路中心线的纵向运动和垂直于道路中心线的横向运动。这种解耦使得车辆运动的规划和控制更加简单和高效。
  • 适应复杂道路:由于实际道路大多不是笔直的,Frenet坐标系能够更好地适应曲线路径,提供比笛卡尔坐标系更准确的车辆位置信息。

这张图形象的展示了Frenet坐标系与Cartesian 坐标系的关系. 正是因为结构化道路存在一条较为清晰的参考线, 使得Frenet坐标系可以方便的应用到算法中.

1.5.2 仅需要低阶信息的坐标转换

在实际工程应用中,大部分场景下我们只需要获取转换后的0阶信息:(s,l). 这时可以用尽量少的计算来实现.

1.5.2.1 Cartesian ( x p , y p ) (x_p, y_p) (xp,yp) → Frenet ( s p , d p ) (s_p, d_p) (sp,dp)

首先我们给出定义:

arg ⁡ min ⁡ s = s ∗ ∣ D ( x p , y p , s ) ∣ Γ = { ( x , y ) ∈ R 2 ∣    x = f x ( s ) , y = f y ( s ) ,   s . t .   s ∈ [ 0 , L ] } \arg \min _{s=s^*}\left| D(x_p,y_p,s) \right| \\ \Gamma = \left\{ (x, y) \in \mathbb{R}^2 \mid \ \ x = f_x(s), y = f_y(s), \ s.t. \ s \in [0, L] \right\} args=sminD(xp,yp,s)Γ={ (x,y)R2  x=fx(s),y=fy(s), s.t. s[0,L]}

  • ( x p , y p ) (x_p, y_p) (xp,yp)是需要转换的笛卡尔点
  • Γ \Gamma Γ是一个定义在笛卡尔坐标系下的指引线,是一系列点的集合
  • 指引线上的点由参数化方程 f x ( s ) , f y ( s ) f_x(s), f_y(s) fx(s),fy(s)确定
  • s是以指引线起点为原点的累积长度,
  • L是指引线的总长度
  • D ( s ) D(s) D(s)是点 ( x p , y p ) (x_p, y_p) (xp,yp) ( x p , y p ) (x_p,y_p) (xp,yp) [ x ( s ) , y ( s ) ] [x(s), y(s)] [x(s),y(s)]处的法向投影长度

那么问题就是找到使得法向投影最短的指引线上的 ( x ( s ∗ ) , y ( s ∗ ) ) (x(s^*), y(s^*)) (x(s),y(s)). s ∗ s^* s就是转换后Frenet坐标系的 s p s_p sp, D ( x p , y p , s ∗ ) D(x_p,y_p,s^*) D(xp,yp,s)就是Frenet坐标系的 l p l_p lp.

由于无法保证指引线与 ( x p , y p ) (x_p, y_p) (xp,yp)的相对位置关系, 所以这个问题大概率是非凸的. 在工程上, 指引线可能不是一条连续的样条, 也可能是一系列的离散点. 一般采取暴力遍历或者是增加一些剪枝来减少计算. 但是总的来说, 为了确定能够准确转换的(s,d), 需要计算出全局最优解.

遍历或者采样指引线上的点, 间隔越短精度越高. 使用向量的叉积即可快速计算 D ( x p , y p , s ) D(x_p,y_p,s) D(xp,yp,s), 从而计算出坐标转换结果 ( s , d ) (s,d) (s,d)

1.5.2.2 Frenet ( s p , d p ) (s_p, d_p) (sp,dp) → Cartesian ( x p , y p ) (x_p, y_p) (xp,yp)

Frenet向笛卡尔坐标系转换则简单的多, 只需要在指引线上获取 ( x s , y s ) (x_s,y_s) (xs,ys)坐标之后, 在该点的法向(根据d的方向决定顺时针法向还是逆时针法向)上, 延长 d p d_p dp距离即可

( x p , y p ) → = ( x s , y s ) → + n u n i t → ⋅ d p \overrightarrow{(x_p, y_p)}=\overrightarrow{(x_s, y_s)}+\overrightarrow{n_{unit}}\cdot d_p (xp

### 关于 UniApp 框架的推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构和技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计和实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub 和 GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值