总体思路
凸优化虽然做为优化中的一个特例,但非常多的工程问题都可以转变为凸优化问题,因此应用需求比较多,被大量学者研究,成果颇丰。由于本文重点在应用,不讲解凸优化,如果感兴趣可以参考书籍《Convex Optimization》。
使用凸优化对路径进行优化的过程可以如下:
生成初始路径是为了更容易生成凸多边形,而凸多边形则是为了给优化的目标函数添加约束条件(保证无碰撞)。其中生成初始路径有非常多的方法,如A* 算法、hybirdA*、rrt等,此处不对这些算法进行讲解,以下将重点介绍生成凸多边形区域和构造优化问题上。具体程序可以参考这里
生成凸多边形
在地图中生成凸多边形应当满足以下条件:
- 凸多边形与障碍物不相交;
- 相邻的两个凸多边形有重叠部分;
- 路径起点和终点包含在凸多边形中;
由于使用栅格地图,可以选用矩形做为凸多边形可以减化一部分操作。由于初始路径已知,沿着初始路径进行搜索即可得到一系列凸多边形区域,由于方法多种多样,便不做详细说明。最终生成的凸多边形区域如下图所示。

构造目标函数
当生成凸多边形区域后,只需要保证路径在凸多边形区域中即可保证路径与障碍物无碰撞,同时还有保证路径尽可能光滑,当然这样的路径存在无数条(目标函数不同,得到的路径就会不同)。
为了构造出凸的目标函数,可以使用特定的曲线表示路径,本文采用多条多项式曲线表示路径,将曲线的参数做为优化的变量,如下图所示。

- 每个凸多边形都对应一条曲线(体现在变量个数上);
- 每条曲线都在凸多边形中(可以不严格满足,体现在约束方程中);
- 曲线之间的交点在凸多边形的相交区域当中(体现在约束方程中);
- 相邻的两条曲线终点和起点的一阶导相等(体现在约束方程中);
- 所有曲线二阶导平方的积分尽可能小(体现在目标函数中);
- 第一条曲线的起点为路径起点,最后一条曲线的终点为路径的终点;
其中,条件1确定优化变量个数,条件2保证路径无碰撞,条件3,4,5保证生成光滑的曲线。目标函数如式(1)所示。
J
=
∑
i
=
0
N
∫
0
t
f
i
x
¨
i
2
+
y
¨
i
2
d
t
(1)
J=\sum _{i=0} ^N \int _0 ^{t_{fi}} \ddot x _i ^2 + \ddot y _i ^2 dt \tag1
J=i=0∑N∫0tfix¨i2+y¨i2dt(1)
式(1)中, t f i t_{fi} tfi可根据每个凸多边形的长度确定(方式不唯一),通过将多项式(4次多项式)代入式(1)中,得式(2)。
min U J = U T H U = [ M M 1 M 0 0 … 0 M M 2 M 0 … 0 0 M M 3 M … ⋮ ⋮ ⋮ ⋱ ] U (2) \min _U J = U^THU = \begin{gathered} \begin{bmatrix} MM_1M & 0 & 0 & \dots \\ 0 & MM_2M & 0 & \dots \\ 0 & 0 & MM_3M & \dots \\ \vdots & \vdots & \vdots & \ddots \end{bmatrix} \quad \end{gathered} U \tag2 UminJ=UTHU=⎣⎢⎢⎢⎡MM1M00⋮0MM2M0⋮00MM3M⋮………⋱⎦⎥⎥⎥⎤U(2)
式(2)中, U U U为所有4次多项式的系数,总共有10n个系数(包括 x x x和 y y y方向), M = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 12 ] M=\begin{gathered} \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 6 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 12 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 2 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 6 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 12 \\ \end{bmatrix} \quad \end{gathered} M=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡00000000000000000000002000000000060000000000120000000000000000000000200000000006000000000012⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤, M i = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t i t i 2 / 2 t i 3 / 3 0 0 0 0 0 0 t i 2 / 2 t i 3 / 3 t i 4 / 4 0 0 0 0 0 0 t i 3 / 3 t i 4 / 4 t i 5 / 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t i t i 2 / 2 t i 3 / 3 0 0 0 0 0 0 t i 2 / 2 t i 3 / 3 t i 4 / 4 0 0 0 0 0 0 t i 3 / 3 t i 4 / 4 t i 5 / 5 ] M_i=\begin{gathered} \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & t_i & t_i^2/2 & t_i^3/3 & 0 & 0 & 0 & 0 \\ 0 & 0 & t_i^2/2 & t_i^3/3 & t_i^4/4 & 0 & 0 & 0 & 0 \\ 0 & 0 & t_i^3/3 & t_i^4/4 & t_i^5/5 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & t_i & t_i^2/2 & t_i^3/3 \\ 0 & 0 & 0 & 0 & 0 & 0 & t_i^2/2 & t_i^3/3 & t_i^4/4 \\ 0 & 0 & 0 & 0 & 0 & 0 & t_i^3/3 & t_i^4/4 & t_i^5/5 \\ \end{bmatrix} \quad \end{gathered} Mi=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0000000000000000000000titi2/2ti3/30000000ti2/2ti3/3ti4/40000000ti3/3ti4/4ti5/50000000000000000000000titi2/2ti3/30000000ti2/2ti3/3ti4/40000000ti3/3ti4/4ti5/5⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
上述目标函数在没有约束条件的情况下,目标函数最小值和变量均为0。需要添加条件2、 3、 4、 5才能得到最终的曲线。约束条件方程如式(3)所示。
l
b
≤
A
U
≤
u
b
(3)
lb \leq AU \leq ub \tag3
lb≤AU≤ub(3)
式(3)中, l b lb lb 和 u b ub ub包含了起点、终点位置、凸多边形的边界等, A A A为相关的常数矩阵,具体内容可以参考github上的程序:https://github.com/Shenyii/navigation_1.git 。
构造完目标函数后,可以发现这是一个线性QP问题,也是一个凸优化问题,因此可以使用相关工具对目标函数进行求解,如OSQP求解器。
实验效果



注意事项
- 目标函数的定义多种多样,不同的目标函数将得到不同的路径;
- 更高次的多项式增加了求解变量的个数,使得优化时间增加;
- 通过增加曲线中间点约束,使曲线尽可能在凸多边形中;
- 只适用与将机器人质点化处理的路径优化;