一架无人机需要用 12 秒绕过矩形障碍。规划器先选定左侧、上方和右侧三块允许飞行的区域,再调整轨迹,让各段曲线留在分配给它们的区域中。
上一篇 B 样条轨迹优化:一步一步计算控制点的移动 用距离代价把轨迹推离障碍,最后再检查是否安全。本篇换一种思路:先规定安全区域,再只在区域内挑选轨迹。
安全飞行走廊用一组相互衔接的凸自由区域,表达轨迹可以经过的范围。 区域边界可以转化为控制点的不等式,直接参与轨迹优化。
下面用九个 B 样条控制点生成六段运动,同时求出三个中间控制点的位置,并核验整条曲线。
一、固定起终运动,留下三个待求坐标
1. 地图、控制点与时间
在固定高度的水平面内,用 (x,y) 描述无人机中心。坐标按米计,+y 表示水平面内的侧向。
地图范围为 −3≤x≤15、−1≤y≤6,矩形禁行区域为:
5≤x≤7,0≤y≤2.
禁行区域已经计入机体尺寸与预留间距,中心点接触其边界也计为碰撞。
使用三次均匀 B 样条,控制点为:
| 控制点 |
坐标 |
控制点 |
坐标 |
控制点 |
坐标 |
| P0 |
(−2,0) |
P3 |
(4,a) |
P6 |
(10,0) |
| P1 |
(0,0) |
P4 |
(6,b) |
P7 |
(12,0) |
| P2 |
(2,0) |
P5 |
(8,c) |
P8 |
(14,0) |
a,b,c 是本次待求的三个纵坐标。初始方案取:
a=b=c=3.
每段使用相邻四个控制点,共六段,每段持续 h=2 秒。节点向量保持为:
U=(−3,−2,−1,0,1,2,3,4,5,6,7,8,9).
整体参数为 u=t/2,有效范围 0≤u≤6。第 i 段记为 Ci(s),其中:
s=2t−2i,0≤s≤1.
2. 哪些边界状态保持不变?
首尾各三个控制点固定,因此所有候选都满足:
p(0)v(0)a(0)=(0,0),=(1,0),=(0,0),p(12)v(12)a(12)=(12,0),=(1,0),=(0,0).
位置、速度、加速度分别按米、米/秒、米/秒²计。下文的 a,b,c 表示控制点坐标,a(t) 表示运动加速度。
这是一段以非零速度进入、以非零速度离开的绕障运动。调整 P3,P4,P5 会改变六段曲线的部分或全部内部形状,起终状态仍由固定的控制点保留。
本例要求全程满足:
∥v(t)∥≤2m/s,∥a(t)∥≤1m/s2.
本次以整段 Jerk 平方积分为目标,避障要求通过走廊约束表达。 时间、横坐标和走廊在求解期间都保持不变。
二、先把允许经过的区域画出来
1. 三个矩形组成一条走廊
选择以下三块区域:
| 区域 |
横向范围 |
侧向范围 |
分配的曲线段 |
| 左侧 FL |
0≤x≤4.5 |
0≤y≤4.5 |
C0,C1 |
| 上方 FM |
4≤x≤8 |
2.5≤y≤4.5 |
C2,C3 |
| 右侧 FR |
7.5≤x≤12 |
0≤y≤4.5 |
C4,C5 |
这些矩形都在地图内,也都与禁行区域分开:左侧区域最多到 x=4.5<5,右侧从 x=7.5>7 开始,上方区域满足 y≥2.5>2。
相邻区域还有交叠。例如,左侧与上方的交叠为:
4≤x≤4.5,2.5≤y≤4.5.
曲线可以通过交叠部分,从一个区域接续到下一个区域。

这里每个矩形都是凸集:其中任意两点的连线仍在矩形内。整条走廊由这些局部区域的并集组成,各段分别使用自己的区域。
2. 哪些曲线段会经过障碍附近?
横坐标等距且始终固定,将它们代入 B 样条公式,可得:
xi(s)=2i+2s.
所以各段的横向范围为:
| 曲线段 |
横向范围(米) |
曲线段 |
横向范围(米) |
| C0 |
0~2 |
C3 |
6~8 |
| C1 |
2~4 |
C4 |
8~10 |
| C2 |
4~6 |
C5 |
10~12 |
只有 C2,C3 经过障碍的横向范围 5≤x≤7。把这两段限制在上方走廊,就能让它们从障碍上方通过;其余各段分别使用左右走廊。
这些区域是本例根据矩形地图直接构造的。它们与曲线段的对应关系,是优化问题的已知输入。
三、把“整段留在区域里”写成有限个条件
1. 为每段换一组局部 Bézier 控制点
第 i 段使用 Pi,Pi+1,Pi+2,Pi+3。对应的四个局部 Bézier 控制点为:
Q0(i)Q1(i)Q2(i)Q3(i)=6Pi+4Pi+1+Pi+2,=32Pi+1+Pi+2,=3Pi+1+2Pi+2,=6Pi+1+4Pi+2+Pi+3.
上标 (i) 表示所属曲线段。转换保留原曲线,只改变这一段的表示方式。
四个局部控制点全部在同一个凸区域内,便能保证整段 Bézier 曲线在该区域内。 原因是曲线点由这四个点非负加权得到,权重之和为 1。
因此,对每段只需给四个 Q 写出区域条件。
2. 看中间两段:纵坐标怎样依赖三个变量?
把控制点坐标代入:
| 局部点 |
C2 中的坐标 |
C3 中的坐标 |
| Q0 |
(4, (4a+b)/6) |
(6, (a+4b+c)/6) |
| Q1 |
(14/3, (2a+b)/3) |
(20/3, (2b+c)/3) |
| Q2 |
(16/3, (a+2b)/3) |
(22/3, (b+2c)/3) |
| Q3 |
(6, (a+4b+c)/6) |
(8, (b+4c)/6) |
例如,C2 的第一个点为:
Q0(2)=6P2+4P3+P4=6(2,0)+4(4,a)+(6,b)=(4,64a+b).
横坐标已经在 [4,8] 内,纵坐标需要满足:
2.5≤64a+b≤4.5.
乘以 6,得到:
15≤4a+b≤27.
每一项都有具体含义:4a+b 决定这段曲线进入上方走廊的位置,15 和 27 来自走廊的上下边界。
对表中其余各点,同样要求纵坐标在 [2.5,4.5] 内。例如:
7.57.51515≤2a+b≤13.5,≤a+2b≤13.5,≤a+4b+c≤27,≤b+4c≤27.
左右两侧的曲线段则对各自的 Q 使用 0≤Qy≤4.5。所有约束都只是 a,b,c 的加减与常数倍。
3. 区域边界怎样变成轨迹约束?
以条件 4a+b≥15 为例,从区域到优化变量共四步:
- 上方走廊要求 y≥2.5;
- C2 第一个局部控制点的纵坐标是 (4a+b)/6;
- 于是要求 (4a+b)/6≥2.5;
- 得到对优化变量的线性限制 4a+b≥15。
这样,优化器每次选择控制点时,都需要满足明确的不等式。各段的凸包包含关系再把这些有限条件传递到整个连续区间。
四、用三个变量给整条运动评分
1. 六段 Jerk 怎样计算?
对三次均匀 B 样条,第 i 段的 Jerk 为:
ji=h3Pi+3−3Pi+2+3Pi+1−Pi.
它来自三次多项式对实际时间求三次导数。每段内 Jerk 恒定,本例 h3=8。横坐标等距,横向 Jerk 为零,只需计算侧向部分:
| 曲线段 |
侧向三阶差 |
侧向 Jerk |
| C0 |
a |
a/8 |
| C1 |
b−3a |
(b−3a)/8 |
| C2 |
c−3b+3a |
(c−3b+3a)/8 |
| C3 |
−3c+3b−a |
(−3c+3b−a)/8 |
| C4 |
3c−b |
(3c−b)/8 |
| C5 |
−c |
−c/8 |
例如,C2 使用侧向坐标 0,a,b,c,三阶差就是:
c−3b+3a−0.
2. 对各段平方并累加
选择平滑代价:
Js=∫012∥j(t)∥2dt.
每段持续 2 秒,因此:
Js(a,b,c)=321[a2+(b−3a)2+(c−3b+3a)2+(−3c+3b−a)2+(3c−b)2+c2].
其中 1/32=2/82:持续时间乘上 Jerk 分母平方的倒数。以下坐标数值按米计,代价按 m2/s5 计。
初始 a=b=c=3 时,六个三阶差依次为:
3, −6, 3, −3, 6, −3.
所以:
Js(3,3,3)=329+36+9+9+36+9=3.375.
将平方展开并合并,还可以写成:
Js=85a2−1615ab+83ac+85b2−1615bc+85c2.
一个控制点同时影响前后若干段,代价中便出现了 ab、bc 这样的交叉项。三个位置需要一起选择。
五、把速度与加速度上限也写进问题
1. 相邻控制边限制速度
速度可以表示为导数控制向量的凸组合,控制向量为:
Dj=2Pj+1−Pj.
横坐标之差恒为 2,因此每个 Dj 的横向分量都是 1。若一条控制边的纵向差为 δ:
Dj=(1,δ/2).
要求它的大小不超过 2:
1+4δ2≤4⟹∣δ∣≤23.
本例需要检查的非固定纵向差为:
a,b−a,c−b,−c.
因此加入:
∣a∣, ∣b−a∣, ∣c−b∣, ∣c∣≤23.
这里的写法表示四个绝对值分别满足上限。每个条件都能写成线性上下界,例如:
−23≤b−a≤23.
2. 二阶控制点差限制加速度
加速度是相邻两个向量 Ej 的线性插值:
Ej=4Pj−2Pj+1+Pj+2.
它们的横向分量都是零,侧向分子依次为:
0,a,b−2a,a−2b+c,b−2c,c,0.
为了保证加速度大小不超过 1,加入:
∣a∣, ∣b−2a∣, ∣a−2b+c∣, ∣b−2c∣, ∣c∣≤4.
这些导数控制向量条件提供全时间区间的运动上界。 约束住所有参与加权的向量,就约束住了整段速度与加速度。
至此,完整问题已经确定:以 a,b,c 为变量,最小化 Js,同时满足全部局部控制点的走廊条件,以及上面两组运动条件。
六、一步一步求出三个控制点
这个例子可以用手算得到解。先从全部走廊条件中保留两条必要条件:
4a+b≥15,b+4c≥15.
第一条来自 C2 的入口,第二条来自 C3 的出口。
暂时只用这两条约束,会得到一个更大的候选集合。先求这个集合中的最低代价,再将结果代回全部条件:如果它全部通过,就同时是完整问题的最优解。 因为完整问题的候选都包含在这个更大集合中。
1. 先把左右两个变量合到一起
地图、固定控制点、时间和代价都左右对称。令两侧纵坐标的平均值为:
z=2a+c.
将代价按平均值整理,可以得到:
Js(a,b,c)=Js(z,b,z)+327(a−c)2.
后面的平方项大于或等于零。把两侧都改成平均值 z,能够保留或降低代价。
两条必要约束取平均后,也得到:
4z+b≥15.
因此,这个简化问题至少有一个最优解满足:
a=c=z.
代价随之变成:
Js(z,b,z)=813z2−15zb+5b2.
2. 为什么最低点会落在 4z+b=15 上?
在只保留这条要求的候选集合中,假设 4z+b>15。将 z,b 同时乘以:
λ=4z+b15,0<λ<1.
新坐标满足:
4(λz)+λb=15.
代价中的每一项都是坐标的二次项,因此新的代价为:
Js,new=λ2Js<Js.
例如,若 4z+b=16,将两个坐标同时乘 15/16,仍满足这条要求,代价变成原来的 (15/16)2。
所以,这个简化问题的最低点满足:
4z+b=15,b=15−4z.
三个待求坐标现在都可以用 z 表示:
a=z,b=15−4z,c=z.
3. 代入后,得到一个二次函数
将 b=15−4z 代入代价:
Js(z)=813z2−15z(15−4z)+5(15−4z)2.
分别展开:
−15z(15−4z)=−225z+60z2,
5(15−4z)2=1125−600z+80z2.
合并相同次幂:
Js(z)=8153z2−825z+1125.
在最低点,导数为零:
8306z−825=0.
于是:
z=306825=102275≈2.696078.
代回另外两个坐标:
ab=c=102275≈2.696078,=15−4×102275=51215≈4.215686.
代价还可以整理为:
Js(z)=8153(z−102275)2+544875.
因此最低值为:
Js=544875≈1.608456.

这个结果已经同时给出三个控制点:
| 控制点 |
初始位置 |
优化后位置 |
| P3 |
(4,3) |
(4,2.6961) |
| P4 |
(6,3) |
(6,4.2157) |
| P5 |
(8,3) |
(8,2.6961) |
两侧稍微降低,中间抬高,整段加速度变化随之重新分配。接下来核验这个候选是否满足完整要求。

七、把候选代回,逐段验证
1. 所有局部控制点是否在对应走廊内?
使用求出的 a,b,c,每段四个局部 Bézier 控制点的纵坐标为:
| 曲线段 |
Q0,y |
Q1,y |
Q2,y |
Q3,y |
纵向范围 |
| C0 |
0 |
0 |
0 |
0.4493 |
[0,4.5] |
| C1 |
0.4493 |
0.8987 |
1.7974 |
2.5 |
[0,4.5] |
| C2 |
2.5 |
3.2026 |
3.7092 |
3.7092 |
[2.5,4.5] |
| C3 |
3.7092 |
3.7092 |
3.2026 |
2.5 |
[2.5,4.5] |
| C4 |
2.5 |
1.7974 |
0.8987 |
0.4493 |
[0,4.5] |
| C5 |
0.4493 |
0 |
0 |
0 |
[0,4.5] |
全部满足各自的上下界。表中采用小数显示,验证使用精确分数。
横坐标方面,每段四个局部控制点依次为:
2i,2i+32,2i+34,2i+2.
它们也全部位于分配的走廊横向范围内。
例如,中间两段的入口与出口恰好满足:
64a+b=6b+4c=2.5.
这两项约束在结果中取等号,称为有效约束。这里接触的是允许区域的边界;这条边界位于禁行区上方,仍留有间隔。

由此得到完整的包含关系:
- 每段的四个局部 Bézier 控制点都在指定凸区域内;
- 由凸包性质,每段曲线都在指定凸区域内;
- 各个区域都在地图内,且与禁行区分离;
- 因此整条连续轨迹满足本例的几何避障要求。
2. 速度上限怎样核验?
将最优坐标代入相邻控制点之差。最大的侧向差是:
max{∣a∣,∣b−a∣,∣c−b∣,∣c∣}=102275≈2.696078.
于是所有速度控制向量的大小都不超过:
jmax∥Dj∥=1+(204275)2≈1.678455<2.
速度是这些向量的凸组合,因此整条轨迹都满足速度限制。
3. 加速度上限怎样核验?
七个侧向二阶差除以 4,得到加速度控制向量的侧向分量:
0,0.674020,−0.294118,−0.759804,−0.294118,0.674020,0.
最大绝对值为:
jmax∥Ej∥=204155≈0.759804<1.
每段加速度是相邻两个 E 的插值,所以整个区间都满足限制。
4. 起终状态和段间衔接怎样核验?
首尾各三个控制点保持不变,起终位置、速度、加速度满足第一节的设定。节点与分段时间保持不变,相邻段继续共享同一组控制点关系,位置、速度和加速度连续。
例如,第 4 秒处,C1 结束,C2 开始。两侧都给出:
p(4)=(4,2.5),
v(4)=2hP4−P2=(1,204215)≈(1,1.053922),
a(4)=h2P2−2P3+P4=(0,−175)≈(0,−0.294118).
这里的同一状态既是前一段的末端,也是后一段的起点。
候选已经通过全部走廊、边界与运动条件。 它在只保留两条必要约束的更大集合中取得最低代价,因此也在本例完整约束集合中取得最低代价。
八、从运动曲线看优化改变了什么
计算几个时刻,得到:
| 时间(秒) |
位置(米) |
速度(米/秒) |
加速度(米/秒²) |
| 0 |
(0,0) |
(1,0) |
(0,0) |
| 4 |
(4,2.5000) |
(1,1.0539) |
(0,−0.2941) |
| 5 |
(5,3.3681) |
(1,0.6434) |
(0,−0.5270) |
| 6 |
(6,3.7092) |
(1,0) |
(0,−0.7598) |
| 8 |
(8,2.5000) |
(1,−1.0539) |
(0,−0.2941) |
| 12 |
(12,0) |
(1,0) |
(0,0) |
第 6 秒位于绕行曲线的最高位置。侧向速度为零,侧向加速度为负,运动方向逐渐转向右下方。


比较两种方案:
| 项目 |
初始 a=b=c=3 |
优化后 |
| Jerk 平方积分 |
3.3750 |
1.6085 |
| 第 6 秒侧向位置(米) |
3.0000 |
3.7092 |
| 速度控制向量上界(米/秒) |
1.8028 |
1.6785 |
| 实际速度峰值(米/秒) |
1.5052 |
1.5189 |
| 加速度大小峰值(米/秒²) |
0.7500 |
0.7598 |
| 走廊与起终状态 |
全部满足 |
全部满足 |
速度上界与实际峰值分别计算:上界来自导数控制向量,实际峰值来自每段速度函数的极值。优化降低了 Jerk 的累计代价,本例实际速度与加速度峰值略有增加,并保持在限制内。
九、把算例整理成一个约束优化问题
1. 决策变量、目标和约束
本例可以写为:
a,b,cmin满足Js(a,b,c)Qk(i)(a,b,c)∈Fi,i=0,…,5, k=0,…,3,∣a∣,∣b−a∣,∣c−b∣,∣c∣≤23,∣a∣,∣b−2a∣,∣a−2b+c∣,∣b−2c∣,∣c∣≤4.
Fi 指第 i 段被分配的走廊。起终要求已经通过固定首尾控制点写入参数化。
目标是线性表达式的平方和,约束可以全部写成线性不等式。因此,这个固定时间、固定横坐标、固定走廊的问题是一个凸二次规划(QP)。
上面的手算利用对称性与两条有效约束求解;更多控制点时,可以直接把这些变量和约束交给求解器。
2. 换成一般的凸多面体,约束仍是线性的
本例的走廊是坐标轴对齐的矩形,每条边界只涉及一个坐标。三维环境中的走廊通常是一般的凸多面体,可以写成若干个半空间的交集:
Fi={x∣Aix≤bi}.
局部控制点 Qk(i) 是 B 样条控制点的固定线性组合,所以包含条件 AiQk(i)≤bi 仍是控制点的线性不等式,问题依旧是 QP。
实际规划器一般不手工画走廊,而是先用图搜索或采样得到一条无碰撞路径,再沿路径在点云或栅格地图中逐段膨胀出凸区域,让相邻区域彼此交叠。走廊的大小决定可选轨迹的范围:区域越贴合自由空间,可选方案越多;区域过小或相邻区域交叠不足,约束就可能无解。
3. 最优结论对应哪个范围?
本例比较的是三次均匀 B 样条,在 12 秒的固定时间安排下,采用上述走廊分配,并满足控制点与导数充分条件的轨迹。
固定走廊已经选定了“从障碍上方通过”这一绕行方案。其他绕行方向、分段时间或控制点数量,对应另外的候选集合,需要相应地重新建模。
控制点包含条件提供整段安全的充分保证,也会限制曲线的可选范围。需要扩大可选范围时,可以细分曲线段、调整走廊,或采用更精细的连续几何验证。
4. 复算这个例子
配套文件 safe_corridor_example.py 只使用 Python 标准库。运行:
1
| python safe_corridor_example.py
|
程序从三个独立变量出发,用精确分数求解两条必要约束组成的问题,再核验全部局部 Bézier 控制点、速度与加速度上界、起终状态和段间衔接。
它还会用另一套曲线表示核对位置,用多项式导数重新累计 Jerk 代价,并输出正文中的数值。程序中的区间保证来自凸包与导数界,取样计算用于交叉检查。加上 --json verified.json 参数,可以把计算结果保存为文件。
小结
安全飞行走廊先给每段轨迹规定一个凸自由区域,再把区域边界变成控制点的线性条件。曲线的凸包性质将有限个控制点约束传递到整个连续区间。
在这个九控制点算例中,同时调整三个中间纵坐标,得到约 2.6961、4.2157、2.6961 米。Jerk 平方积分从 3.3750 降到 1.6085,整条曲线通过走廊、速度、加速度及边界状态检查。
走廊规定允许的空间,参数化连接控制点与整段曲线,目标函数决定可行方案之间的取舍。 到这里,轨迹已经给出每个时刻的位置、速度和加速度;下一步把这些加速度换算成多旋翼所需的推力与姿态,检查机体能否真正飞出这条轨迹。