1. 前言
本文详细讲解Apollo的曲线平滑的数学原理,原文在《开发者说丨离散点曲线平滑原理》,参考Apollo代码在此,以下为整理内容。

2. 离散点曲线平滑的数学原理
如下图所示,P 0  ,P 1 ,P 2 ,P 3  ,…,P n , 一共n+1个离散点组成原始参考线。本节介绍一种方法通过对原始参考线上离散点的有限偏移对原始参考线进行平滑。

在这里插入图片描述

2.1. 优化变量
优化变量:离散点坐标( x i , y i ) (x_i,y_i)(x 
i
​    
 ,y 
i
​    
 )

2.2. 优化目标
优化目标:平滑度、长度、相对原始点偏移量

2.3. 目标函数
目标函数:c o s t = c o s t 1 + c o s t 2 + c o s t 3 。其中c o s t 1为平滑度代价,c o s t 2 为长度代价,c o s t 3  为相对原始点偏移量代价。
在这里插入图片描述

cost 1物理意义:如下图中红色向量P 1 P 3 ⃗ \vec 的模,它可以理解为:向量P 1 P 0 ⃗ \vec 和向量P 1 P 2 ⃗ \vec 相加结果(P 1 P 3 ⃗ )的模平方。如果这三个点在一条直线上,那么这个值最小;三个点组成的两个线段的夹角θ 越大,即曲线越趋于平直,也因此越平滑。
在这里插入图片描述

关于平滑度的表示除了上面提到的c o s t 1 形式之外,还存在其他形式去表示,如下图所示,连续3点P 0 ,P1,P 2,其中向量P 0 P 1 ⃗ = ( x 1 − x 0 , y 1 − y 0 ) \vec 和P 1 P 2 ⃗ = ( x 2 − x 1 , y 2 − y 1 ) \vec 之间的夹角θ 。
在这里插入图片描述

cosθ值越大,θ \thetaθ越小,P 0 ,P 1 ,P 2 越接近直线,曲线越平滑。

在这里插入图片描述

因此,c o s t 1 可以表示为:

在这里插入图片描述

这两种代价形式也是开源Apollo代码中discretized_points_smoothing中cos_theta_ipopt_interface、fem_pos_deviation_ipopt_interface、fem_pos_deviation_osqp_interface、fem_pos_deviation_sqp_osqp_interface方法中对应用到的基本原理。

c o s t 2 物理意义:代表离散点之间距离平方之和。

c o s t 3 物理意义:代表优化后的离散点相对原始参考点偏移距离平方之和。

2.4. 约束

约束条件包含三个:位置约束,曲率约束,松弛变量。这里我们希望原始参考点的偏移量不应该太大,因此偏移量构成了第一个约束,如图中红色框所示把散点偏移量(X方向Y方向)给限制在一定的范围内。

在这里插入图片描述

位置约束

在这里插入图片描述

曲率约束
除此之外,我们在路径规划的时候通常需要考虑转弯半径的约束,也就是路径需要满足一定的曲率约束。关于曲率的计算我们的主要思想在这里采取是三点构成一个圆的思想去求解半径,具体原理如下图所示:

在这里插入图片描述

如图所示,假设P 0 ,P 1  ,P 2 三点处在同一个圆上,当θ \thetaθ较小时,向量P 1 P 0 ⃗ \vec 和向量P 1 P 2 ⃗ \vec 的模近似等于弧长,因此有:
在这里插入图片描述

根据O − P 0 − P 1 等腰三角形几何关系有:
在这里插入图片描述

由于∣ P 1 P 0 ⃗ ∣ = ∣ P 1 P 2 ⃗ ∣ |\vec ,所以C 是的P 1 P 3  的中点,由此得:

在这里插入图片描述

根据C − P 0 − P 1  直角三角形几何关系有:

在这里插入图片描述

把P 1 C 代入P 1 P 3 ⃗ \vec  得:

在这里插入图片描述


把θ 2 代入得:

在这里插入图片描述

把θ 1 代入得:

在这里插入图片描述

我们希望路径曲率约束满足车辆运动学最小转弯半径的约束,也就是满足P 1 P 3 ⃗ ≤ R m i n \vec即满足:

在这里插入图片描述

根据上式其中n-2个点中间点满足:

在这里插入图片描述

其中:△ s 是散点之间平均长度,c u r c s t r 是最大去率约束。
为了保证有解以及求解更快的收敛这里引入了大于0的松弛变量s t a c k i 。因此:

在这里插入图片描述

2.5. 总结

目标函数

在这里插入图片描述

约束条件

在这里插入图片描述

附录_曲率约束的线性化
至此,作为一个优化问题,模型基本建立,通过观察我们可以知道目标函数为二次方程,但是很遗憾约束条件里面关于曲率约束是非线性的。此问题除了直接使用IPOPT求解之外,经过思考我们可以通过线性化方法把曲率约束转化成线性约束之后就可以把问题转化为二次优化问题使用OSQP加速求解。

假设:
在这里插入图片描述

泰勒展开:

在这里插入图片描述

线性化只保留一阶项:

在这里插入图片描述

在F ( x ) 原始参考点x r e f 处的值为:
在这里插入图片描述

在F ( x ) F(x)F(x)原始参考点x r e f x_{ref}x 
ref
​    
 处的导数为:
从曲率约束方程我们可以看到包含6个变量:x i − 1 ,x i ,x i + 1 ,y i − 1 ,y i ,y i + 1 ,对方程求导得:
在这里插入图片描述

其中包含6个变量:x i − 1 ,x i ,x i + 1 ,y i − 1 ,y i  ,y i + 1 :

在这里插入图片描述


因此:

在这里插入图片描述

带入曲率约束方程得:

在这里插入图片描述

曲率线性化约束化简:

在这里插入图片描述