自动驾驶之轨迹规划5——Apollo规划中的离散点曲线平滑数学原理
1. 前言
本文详细讲解Apollo的曲线平滑的数学原理,原文在《开发者说丨离散点曲线平滑原理》,参考Apollo代码在此,以下为整理内容。
2. 离散点曲线平滑的数学原理
如下图所示,P0P_0P0,P1P_1P1,P2P_2P2,P3P_3P3,…,PnP_nPn, 一共n+1n+1n+1个离散点组成原始参考线。本节介绍一种方法通过对原始参考线上离散点的有限偏移对原始参考线进行平滑。
2.1. 优化变量
优化变量:离散点坐标(xi,yi)(x_i,y_i)(xi,yi)
2.2. 优化目标
优化目标:平滑度、长度、相对原始点偏移量
2.3. 目标函数
目标函数:cost=cost1+cost2+cost3cost=cost_1+cost_2+cost_3cost=cost1+cost2+cost3。其中cost1cost_1cost1为平滑度代价,cost2cost_2cost2为长度代价,cost3cost_3cost3为相对原始点偏移量代价。
cost1cost_1cost1物理意义:如下图中红色向量P1P3⃗\vec {P_1P_3}P1P3的模,它可以理解为:向量P1P0⃗\vec {P_1P_0}P1P0和向量P1P2⃗\vec {P_1P_2}P1P2相加结果(P1P3⃗\vec {P_1P_3}P1P3)的模平方。如果这三个点在一条直线上,那么这个值最小;三个点组成的两个线段的夹角θ\thetaθ越大,即曲线越趋于平直,也因此越平滑。
关于平滑度的表示除了上面提到的cost1cost_1cost1形式之外,还存在其他形式去表示,如下图所示,连续3点P0P_0P0,P1P_1P1,P2P_2P2,其中向量P0P1⃗=(x1−x0,y1−y0)\vec {P_0P_1}=(x_1-x_0,y_1-y_0)P0P1=(x1−x0,y1−y0)和P1P2⃗=(x2−x1,y2−y1)\vec {P_1P_2}=(x_2-x_1,y_2-y_1)P1P2=(x2−x1,y2−y1)之间的夹角θ\thetaθ。
cosθcos\thetacosθ值越大,θ\thetaθ越小,P0P_0P0,P1P_1P1,P2P_2P2越接近直线,曲线越平滑。
因此,cost1cost_1cost1可以表示为:
这两种代价形式也是开源Apollo代码中discretized_points_smoothing中cos_theta_ipopt_interface、fem_pos_deviation_ipopt_interface、fem_pos_deviation_osqp_interface、fem_pos_deviation_sqp_osqp_interface方法中对应用到的基本原理。
cost2cost_2cost2物理意义:代表离散点之间距离平方之和。
cost3cost_3cost3物理意义:代表优化后的离散点相对原始参考点偏移距离平方之和。
2.4. 约束
约束条件包含三个:位置约束,曲率约束,松弛变量。这里我们希望原始参考点的偏移量不应该太大,因此偏移量构成了第一个约束,如图中红色框所示把散点偏移量(X方向Y方向)给限制在一定的范围内。
位置约束:
曲率约束:
除此之外,我们在路径规划的时候通常需要考虑转弯半径的约束,也就是路径需要满足一定的曲率约束。关于曲率的计算我们的主要思想在这里采取是三点构成一个圆的思想去求解半径,具体原理如下图所示:
如图所示,假设P0P_0P0,P1P_1P1,P2P_2P2三点处在同一个圆上,当θ\thetaθ较小时,向量P1P0⃗\vec {P_1P_0}P1P0和向量P1P2⃗\vec {P_1P_2}P1P2的模近似等于弧长,因此有:
根据O−P0−P1O-P_0-P_1O−P0−P1等腰三角形几何关系有:
由于∣P1P0⃗∣=∣P1P2⃗∣|\vec {P_1P_0}|=|\vec {P_1P_2}|∣P1P0∣=∣P1P2∣,所以CCC是的P1P3P_1P_3P1P3的中点,由此得:
根据C−P0−P1C-P_0-P_1C−P0−P1直角三角形几何关系有:
把P1CP_1CP1C代入P1P3⃗\vec {P_1P_3}P1P3得:
把θ2\theta_2θ2代入得:
把θ1\theta_1θ1代入得:
我们希望路径曲率约束满足车辆运动学最小转弯半径的约束,也就是满足P1P3⃗≤Rmin\vec {P_1P_3}≤R_{min}P1P3≤Rmin即满足:
根据上式其中n-2个点中间点满足:
其中:△s△ s△s是散点之间平均长度,curcstrcur_cstrcurcstr是最大去率约束。
为了保证有解以及求解更快的收敛这里引入了大于0的松弛变量stackistack_istacki。因此:
2.5. 总结
目标函数
约束条件
附录_曲率约束的线性化
至此,作为一个优化问题,模型基本建立,通过观察我们可以知道目标函数为二次方程,但是很遗憾约束条件里面关于曲率约束是非线性的。此问题除了直接使用IPOPT求解之外,经过思考我们可以通过线性化方法把曲率约束转化成线性约束之后就可以把问题转化为二次优化问题使用OSQP加速求解。
假设:
泰勒展开:
线性化只保留一阶项:
在F(x)F(x)F(x)原始参考点xrefx_{ref}xref处的值为:
在F(x)F(x)F(x)原始参考点xrefx_{ref}xref处的导数为:
从曲率约束方程我们可以看到包含6个变量:xi−1x_{i-1}xi−1,xix_{i}xi,xi+1x_{i+1}xi+1,yi−1y_{i-1}yi−1,yiy_{i}yi,yi+1y_{i+1}yi+1,对方程求导得:
其中包含6个变量:xi−1x_{i-1}xi−1,xix_{i}xi,xi+1x_{i+1}xi+1,yi−1y_{i-1}yi−1,yiy_{i}yi,yi+1y_{i+1}yi+1:
因此:
带入曲率约束方程得:
曲率线性化约束化简:
自动驾驶之轨迹规划5——Apollo规划中的离散点曲线平滑数学原理相关推荐
- 自动驾驶系统设计的那些底层软件开发中的重点解读
作者 | Jessie 出品 | 焉知 知圈 | 进"计算平台群"请加微yanzhi-6,备注计算 众所周知,随着自动驾驶和智能网联技术的飞速发展,传统的汽车开放系统架构CP Au ...
- 自动驾驶之轨迹规划6——Apollo EM Motion Planner
1. 概述 <Baidu Apollo EM Motion Planner>是Apollo官方的出的文章(虽然是官方文章,但其中有表述不是很严谨,也有一些小错误,大家可以审视的研读这篇文章 ...
- 百度Apollo自动驾驶专题讲座笔记之运动规划模块
在百度技术学院有Apollo的技术专题课程,对各个模块都有一个入门级的课程,对于了解各个模块间的相互作用关系有很大的作用,很适合对自动驾驶领域感兴趣的人的入门课程.感谢百度Apollo开放了这么好的课 ...
- 自动驾驶算法详解(1) : Apollo路径规划 Piecewise Jerk Path Optimizer的python实现
本文作为Apollo Planning决策规划代码详细解析系列文章的补充,将使用Python代码以及anaconda环境,来实现Apollo 决策规划Planning 模块里的 Piecewise J ...
- 自动驾驶的分级,感知与规划基本意义
自动驾驶课程学习(二) 文章目录 前言 一.自动驾驶分级 二.感知 1.目标 2.挑战 3. 计划 前言 继续撰写,上一节笔记链接(https://blog.csdn.net/weixin_49344 ...
- 【自动驾驶】基于采样的路径规划算法——PRM(含python实现)
文章目录 参考资料 1. 基本概念 1.1 基于随机采样的路径规划算法 1.2 概率路图算法(Probabilistic Road Map, PRM) 1.3 PRM算法的优缺点 1.4 PRM算法伪 ...
- [自动驾驶-车辆轨迹预测] 资料准备及学习视频
关于车辆轨迹预测的学习资料 因为要引入车辆预测模块来确保下游规划模块的准确性及稳定性,开始学习关于车辆轨迹预测相关的知识,部署相关的模型至实践项目中.发现网上关于车辆预测部分的资料较少,本文搜索一些资 ...
- 自动驾驶(八十)---------Apollo之导航模块
没想到自动驾驶系列文章能写到80篇,因为我之前做事很浮躁,总是蜻蜓点水.走马观花,所以能写这么多我都诧异了,仔细一想支持我写到现在的原因有两点:分享的快乐.成长的乐趣. 说到成长,很多以前似懂非懂的技 ...
- 百度黑莓宣布联手搞自动驾驶,QNX系统成Apollo平台基础
李杉 编译整理 量子位 出品 | 公众号 QbitAI 就在昨天夜里,百度Apollo项目和黑莓展开了合作,黑莓的股价应声上涨了近13%. 百度和黑莓的合作领域在车联网和自动驾驶,据美国科技媒体Ven ...
- 【自动驾驶】高精地图在无人驾驶中的应用
高精地图是无人驾驶核心技术之一,精准的地图对无人车定位.导航与控制,以及安全至关重要.本文是"无人驾驶技术系列"第七篇,首先介绍高精地图与传统地图的区别,然后介绍其特点及制作过程. ...
最新文章
- LeetCode实战:删除链表中的节点
- node.js php模板,node.js中EJS 模板的使用教程
- 什么时候你应该用JSON Web Token
- Java:在JPA中使用规范模式
- vim 安装vim-prettier
- 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
- C++数据结构03--静态链式线性表的实现
- oracle 截取字符(substr),检索字符位置(instr)
- python有趣小程序-Python全栈开发-有趣的小程序
- eclipse for php开发环境,eclipse for php 开发环境配置
- ORACLE中将一个值赋值到另一个表的值
- Java项目——个人博客系统
- kuangbin专题一 简单搜索
- mugen linux主程序,MUGEN主程序
- 多人上传文件公共网盘_360安全云盘多人共享完整版
- Excel 批量增加行高,解决打印表格部分行显示不全的问题
- 网易上线短视频创作平台“网易知识公路“
- HTML5-VScode-常用标签的样式以及复合写法
- Android 集成高德地图SDK
- Caliburn.Micro将枚举 绑定到ComboBox
热门文章
- AspxGridView 排序分组刷新DetailRow的问题
- 61php飞信发送类(phpfetion)v1.5,资源索引 L_PC6下载
- “变速齿轮”研究手记
- phpdesigner8 php7.0,让getter和setter在phpDesigner8中运行
- phpdesigner 8 注册码
- 吉他效果器插件-IK Multimedia AmpliTube 5 MAX 5.0.3 macOS
- 电驴v1.2.2.45574最新版官方下载
- 从零实现加密隧道(二):socks5 协议详解
- php jmail实例,Jmail发邮件的例子
- spring调用webservice