这个方法参考的是高老师的一篇论文,注意下方图片的黄色区域,这个方法的思想就是,这个黄色区域是与障碍物没有碰撞的,假设我们能把我们的轨迹约束在这些区域里,那么我们肯定也能找到一条没有碰撞的曲线。
但是呢,之前我们选择的曲线表达式,也就是在 M i n i m u m Minimum Minimum S n a p Snap Snap当中使用的多项式曲线表达式,如下所示:
p
μ
(
t
)
=
{
∑
j
=
0
N
η
1
j
(
t
−
T
0
)
j
T
0
≤
t
≤
T
1
∑
j
=
0
N
η
2
j
(
t
−
T
1
)
j
T
1
≤
t
≤
T
2
⋮
⋮
∑
j
=
0
N
η
M
j
(
t
−
T
M
−
1
)
j
T
M
−
1
≤
t
≤
T
M
p_{\mu}(t)=\left\{
将这种多项式的曲线约束在黄色的约束里面是非常麻烦的,所以想到了用另外一种曲线来代替,这边使用的是贝塞尔曲线。
这条贝塞尔曲线是在蓝色的凸多边形里面,贝塞尔曲线有一个凸包特性,这个曲线会在一个凸包里面,假设这个凸包是在上方黄色的安全区域里面,那么就可以把轨迹约束在安全区域里面了。
b n ( t ) = b 0 n ( t ) = ∑ j = 0 n b j B j n ( t ) \mathbf{b}^n(t)=\mathbf{b}_0^n(t)=\sum_{j=0}^n \mathbf{b}_j B_j^n(t) bn(t)=b0n(t)=j=0∑nbjBjn(t)
可以看出,这个 b j b_j bj就是控制点,对应的是上图当中的小黑点, n = 10 n = 10 n=10表示贝塞尔曲线的阶数, 10 10 10阶是最高的阶数了, 10 10 10阶的贝塞尔曲线是有 11 11 11个控制点的,假设有 m m m个控制点,其阶数就是 n − 1 n - 1 n−1的。 b j b_j bj即为控制点, B j B_j Bj即为伯恩斯坦多项式( n n n次的标量多项式)
构造步骤:可以看看大佬的Blog
可以看出贝塞尔曲线的凸包特性。
贝塞尔曲线方程完全展开:
B
i
n
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
B_i^n(t)=\left(
n
、
i
n、i
n、i就是组合的表达形式,二次项的形式。
上述已经说了,又变成了二次项的形式,
b
0
1
(
t
)
=
(
1
−
t
)
b
0
+
t
b
1
b
1
1
(
t
)
=
(
1
−
t
)
b
1
+
t
b
2
b
0
2
(
t
)
=
(
1
−
t
)
b
0
1
+
t
b
1
1
b
0
2
(
t
)
=
(
1
−
t
)
2
b
0
+
2
t
(
1
−
t
)
b
1
+
t
2
b
2
所以,就可以将原先的多项式曲线表达形式,进行贝塞尔曲线的转化,就是把多项式曲线,重新展开,再进行排列,又回到了多项式的形式,所以,贝塞尔曲线就是一种特殊的多项式曲线。
所以,成为多项式曲线,之前在 M i n i m u m Minimum Minimum S n a p Snap Snap中的方法又可以拿起来使用了。优化过程就可以转变成 M i n i m u m Minimum Minimum S n a p Snap Snap那种形式。
这是一个6阶的贝塞尔曲线转换的情况,以上为转换的映射矩阵。
每一个栅格保存了距离最近的障碍物,红线的路径假设是A*算法求出来的,红色虚线路径上的小点,地图上保存了距离这个点最近的障碍物的距离,这样在二维上可以画出圆,表示安全的范围,这个球还是可以扩展,形成一个大范围的安全区域,可以在圆里找到内接的矩阵/正方形,这些还是可以扩展一些。
如下是扩展完成的图。
这样就是有很多长方体(三维),贝塞尔曲线就约束在长方体里面,就肯定是安全区域。
一个性质,贝塞尔曲线的导数仍然是贝塞尔曲线。
一个多项式,转换为贝塞尔曲线,然后继续使用 M i n i m u m Minimum Minimum S n a p Snap Snap的方法去优化。