想象你是一家智能仓储公司的路线维护员。规划算法给机器人画出一条路径:它像在方格纸上走出的楼梯锯齿,每一步都要急转弯,还时不时绕一段冤枉路。如果直接让搬运小车照着跑,小车每到一个拐角就要猛打方向盘,不仅晃得厉害,轮子磨损也快。此时你要做的,就像经验丰富的修路师傅:把这条“石头台阶路”重新铺成一条平缓的公路,让车能顺顺畅畅地沿着中心线开过去。 修路师傅手里有几样工具:一根柔韧的钢尺样条用来穿过所有标记点,几段可局部调整的柔性杆用来只修一小段,还有一套“弹簧加路障”的平衡术用来在安全边界内拉直路线。它们对应着运动规划中的三类路径平滑策略:样条插值、B样条拟合、数值优化。路径平滑要做的事情,就是消除规划器输出中的尖角与冗余,在“平滑”“贴近原路径”“避开障碍”之间找到平衡,最终让跟踪控制器更容易执行。
对 AI 从业者来说,路径平滑是让规划算法从“能到”变为“开得稳”的关键一环。无论是在机器人、自动驾驶还是无人机系统中,掌握平滑策略与选型方法,是算法落地的必备技能。
目录
可视化演示
通过原始折线与平滑路径对比、Catmull-Rom样条拟合过程、以及曲率分布分析,展示路径平滑如何消除尖角冗余提升跟踪控制精度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
原始折线与平滑路径对比 RRT/A*输出离散waypoints形成尖角折线路径 样条平滑后路径连续曲率无突变 C2连续=位置+速度+加速度连续 平滑路径保证跟踪器速度平滑变化
问题缘起:尖角与冗余
拿到一张网格地图时,基于栅格或拓扑搜索的规划器往往会给出“踏步式”路径:直行一段、转弯九十度、再直行,偶尔还夹杂着为了绕开一个栅格而出现的来回冗余。你可以把它想成老城区里用石板错落铺成的台阶路,人走没问题,但让带轮子的搬运车走,每个台阶都会让车头猛地一摆。
路径平滑是运动规划的一步“后处理”:输入是几何路径点,输出是更适合跟踪控制器执行的平滑曲线。它要处理两类核心问题:一类是尖角,也就是路径上曲率过大甚至趋于无穷大的折点;另一类是冗余,也就是不必要的抖动、锯齿和绕圈。平滑的目标不是简单“把路拉直”,而是在保持原路径意图的前提下,降低尖角、去除抖动,并控制与原路径的偏差。
曲率是衡量尖角程度的天然指标。假设路径参数化为 \(x(s), y(s)\),点沿路径的切向变化越剧烈,曲率就越大。
直线段上曲率为零,圆弧半径为 \(r\) 时曲率为 \(1/r\),而直角折点处方向会在瞬间改变,曲率趋近于无穷大。修路时第一件事不是画线,而是先判断哪些尖角必须拆掉,哪些冗余弯道可以抹平。
对跟踪控制器来说,曲率越大,需要的横向加速度就越大;一旦超过车辆物理极限,实际轨迹就会偏离规划路径。因此,路径平滑首先要回答的问题就是:这条路最急的弯在哪里,它是否在车能承受的范围内。
- 一阶导数这里的 \(x'\)、\(y'\) 表示路径在该点的速度方向,相当于车头当前的朝向。
- 二阶导数\(x''\)、\(y''\) 表示方向变化的快慢,对应司机打方向盘的速度。
- 交叉项分子\(|x'y'' - y'x''|\) 把位置变化与方向变化交叉起来,度量“转弯有多急”。
- 速度归一化分母\((x'^2 + y'^2)^{3/2}\) 是速度大小的三次方,用来消除车速对曲率的影响。
样条插值:让路径穿过关键点
老修路师傅手里有一根弹性很好的钢制样条。他把木桩钉在地上,钢条被迫弯曲,结果会给出一条柔和的曲线,并且精确地穿过每一根木桩。样条插值做的事情正是如此:构造一条曲线,让它严格经过所有给定的路径点。
工程中最常用的是三次样条。它把路径分成若干小区间,每个区间用一条三次多项式曲线表示,同时要求相邻区间在连接点处不仅位置一致,切线方向甚至曲率也保持一致。这样拼出来的曲线整体连续、平滑,又不会像高次多项式那样随意摆动。
三次样条能够保证 \(C^2\) 连续,也就是位置、切线和曲率都连续,这是它受欢迎的重要原因。但它也有一个“强求”的缺点:因为曲线必须穿过每个点,如果某个路径点是噪声或冗余点,曲线就会被迫拐一个不自然的弯。而且样条是全局求解的,移动一个木桩,整根钢条的形状都会发生变化。这就像修路时如果硬要穿过每一块凸起的石头,路面反而会起伏不平。
- 每段起点高度\(a_i\) 是第 \(i\) 段曲线在左端点 \(x_i\) 处的取值,也就是该处的路径点位置。
- 段内斜率\(b_i\) 是第 \(i\) 段在起点的切线斜率,决定了曲线刚进入该区间时的走向。
- 曲率相关项\(c_i\) 与二阶导数有关,控制曲线在该段内的弯曲程度。
- 曲率变化率\(d_i\) 是三阶项系数,决定曲率沿路径的变化快慢,让曲线更加自然。
- 连接点连续条件相邻两段在公共点处满足位置、一阶导和二阶导连续。
B样条拟合:局部调控曲线
如果木桩太多太难伺候,师傅会换一种工具:不再用一根贯穿所有桩的钢条,而是用几段短柔性杆拼接,每一段只受附近几个控制桩的影响。拔掉其中一个桩,只有身边一小段曲线会变化,远处纹丝不动。这就是 B 样条的设计思路。
B 样条曲线由一组控制点 \(\mathbf{P}_i\) 和对应的基函数 \(N_{i,p}(u)\) 加权组合而成。控制点相当于修路时插在地面上的控制桩,曲线并不一定穿过它们,而是被它们“牵引”着走。因此 B 样条天然适合做拟合而非插值:面对大量带噪声的路径点时,可以让曲线从点群中间穿过,而不是勉强穿过每一个点。
在实际路径平滑中,节点向量可以预先确定,再通过最小二乘拟合求出控制点;也可以通过调节平滑因子控制曲线对原始路径点的“跟随程度”。B 样条兼顾了平滑性、局部性与计算效率,因此成为机器人运动规划后处理中最常用的工具之一。它相当于让修路师傅拥有了“哪里不平改哪里”的能力,而不必为了一个凸起重铺整条路。
- 参数变量\(u\) 是曲线的参数,通常归一化到 \([0,1]\),相当于沿路的里程读数。
- 控制点\(\mathbf{P}_i\) 是第 \(i\) 个控制点的坐标,它牵引曲线,但不保证曲线经过它。
- 基函数\(N_{i,p}(u)\) 是次数为 \(p\) 的 B 样条基函数,由节点向量递归定义。
- 局部支撑每个基函数只在相邻的 \(p+1\) 个区间内非零,所以移动一个控制点只影响局部。
- 曲线求和把所有控制点按基函数权重叠加,得到曲线上每个参数位置对应的坐标。
数值优化:约束下的平衡
前面几种方法主要靠几何公式构造曲线,而数值优化提供了另一种思路:把路径平滑看成寻找一个“受力平衡”的位置。想象路径是一根有弹性的橡皮筋,它被弹簧拉向原始参考线,又被墙面和障碍物限制在安全区域内,反复松手后,橡皮筋最终停在一个既不过分偏离、又不碰到障碍的平衡位置。
数值优化把路径点当作决策变量,把“平滑程度”“路径长度”“与参考路径的偏差”等要求写成目标函数,再把“不能碰到障碍”“最大曲率不能超限”等写成约束条件。求解器通过迭代不断微调每个路径点的位置,直到满足条件且目标函数不再显著下降。
除了目标函数,实际工程通常还会加入约束,例如 \(\kappa_{\max}\) 不超过车辆转向极限,以及路径点必须在安全可行域内。这类带约束的二次规划或非线性优化问题,可以用梯度下降、增广拉格朗日、SQP 等迭代算法求解。数值优化的优点是“约束想加就加”,缺点是计算开销更大、参数需要仔细调。它适合在城市窄巷里修路——既要绕开墙,又不能为了平滑而跑到墙外去。
- 相邻点距离项\(\|\mathbf{q}_{i+1}-\mathbf{q}_i\|^2\) 惩罚相邻点之间的距离,相当于把橡皮筋拉紧,让路径更紧凑。
- 离散二阶导项\(\|\mathbf{q}_{i+1}-2\mathbf{q}_i+\mathbf{q}_{i-1}\|^2\) 衡量路径在局部是否“走直线”,值越小表示方向变化越平缓。
- 参考偏差项\(\|\mathbf{q}_i-\mathbf{q}_i^{ref}\|^2\) 让平滑后的路径不要离原始路径太远,防止修路修到别人院子里去。
- 权重系数\(\alpha, \beta, \gamma\) 分别控制路径长度、平滑程度和贴近原路径的优先级。
平滑评估:如何才算“平滑”
路修好了不能直接交工,验收时要检查三件事:最急的弯是否足够缓、路线偏离原勘测线是否在允许范围内、以及施工时间是否可接受。路径平滑的评估也类似,不能只看路径点是否连着,还要看曲率、偏差和计算开销。
一条“好看”的路径未必是曲率处处为零的直线,而应该是曲率连续、最大曲率有限、且整体没有突兀抖动的曲线。对于跟踪控制器来说,曲率连续尤其重要:如果曲率发生跳变,控制器就要在瞬间改变前轮转向指令,产生冲击和跟踪误差。因此,路径平滑质量常用曲率平方沿弧长的积分来衡量。
除了曲率能量,还需要关注与原路径的偏差包络:平滑后的路径不能离原始路径太远,否则可能压到障碍物或偏离任务走廊。工程上常用最大偏差 \(\max_s \|\mathbf{q}(s)-\mathbf{q}_{ref}(s)\|\) 来限定安全范围。此外,计算开销也是评估指标之一,尤其对于实时控制,平滑算法必须在几十毫秒内完成。验收一条路,弯道质量、边界安全、施工时效三者缺一不可。
- 弧长变量\(s\) 表示沿路径从起点走到终点的弧长,单位是米。
- 局部曲率\(\kappa(s)\) 是位置 \(s\) 处的曲率,反映该点转弯有多急。
- 平方惩罚\(\kappa(s)^2\) 对大的曲率按平方放大,一个特别急的弯会比许多小弯更“扣分”。
- 全路径积分从起点到终点积分,得到整条路径的曲率能量,数值越小说明整体越平滑。
实践选型:按场景选方法
导航到不同工地,修路师傅会带不同工具:在开阔厂区修一条通道,用 B 样条局部调整就够;在障碍密集的狭窄巷道,则必须用数值优化把墙的约束直接放进计算。选型要先回答场景需求,再谈方法优劣。
样条插值适合路径点数量少、点位置准确且必须穿过的场景,比如机器人要依序经过几个固定工位;B 样条拟合适合路径点多、存在噪声、希望曲线平滑但不要求穿过每个点的场景;数值优化则适合带强约束的场景,比如汽车类机器人必须满足最大曲率限制,同时还要绕开障碍物。三者不是互斥的,也可以组合使用:先用 B 样条做快速平滑,再用优化做精细调整。
在实际项目中,跟踪控制精度与路径平滑质量直接相关:最大曲率越低、曲率越连续,控制器就越容易跟踪;反之,即使路径长度很短,一个过急的弯也会让车辆大幅偏离。建议先测量机器人的最小转弯半径和控制频率,再据此为平滑算法设定曲率上限。参数调优时,先固定一个平滑算法,再逐步调整权重,观察“平滑质量—路径偏差—计算耗时”三者之间的平衡,就像反复试铺一段路,直到车辆开上去又稳又不越界。
- 平滑得分项\(\hat{E}_{\kappa}\) 是归一化后的曲率能量,值越小表示路径越平滑。
- 偏差得分项\(\hat{E}_{dev}\) 是归一化后的最大路径偏差,控制与原路径的接近程度。
- 时间得分项\(\hat{C}_{time}\) 是归一化后的计算开销,越实时越好。
- 加权求和\(w_1, w_2, w_3\) 根据场景设定权重,形成最终选型评分 \(S\)。
AI 应用场景
智能仓储 AGV 路径后处理
阶段:运动规划后处理
解决的问题:栅格地图规划的路径充满 90 度折角和抖动,AGV 直接跟踪时频繁减速、打滑,且容易偏离目标。
具体案例:某电商仓库的潜伏式 AGV 在货架间运行,规划器输出几十个路径点。系统使用 B 样条拟合对路径做平滑,并将最大曲率限制在 0.4 rad/m 以内。平滑后 AGV 转弯不再急停,平均运行速度提升 20%,到位误差下降 35%。
自动驾驶局部路径平滑
阶段:局部路径规划
解决的问题:全局导航生成的参考线带有尖角,满足不了汽车运动学约束,必须重新优化出曲率连续且贴近参考线的可行驶路径。
具体案例:城市道路中,自动驾驶车辆检测到前方施工,变道路径经数值优化平滑后,最大曲率被限制在 0.08 rad/m,同时保留与障碍物的安全距离。车辆在变道过程中方向盘转角变化率显著降低,乘客体感更平顺。
无人机航迹平滑
阶段:航迹规划
解决的问题:无人机任务航点间用折线连接,飞行时因频繁转向导致姿态抖动和电量浪费。
具体案例:测绘无人机按固定航点飞行,系统用三次样条插值生成连续航迹,并对端点施加自然边界条件。航迹通过全部航点,曲率连续无突变,无人机在转弯处不再剧烈侧倾,单次任务续航提升约 12%。
Python 演示
import numpy as npfrom scipy.interpolate import splprep, splev def build_smooth_path(points, smoothing=1.0): pts = np.asarray(points, dtype=float).T tck, _ = splprep(pts, s=smoothing, k=3) u = np.linspace(0.0, 1.0, 200) x, y = splev(u, tck) return np.column_stack((x, y)) def path_curvature(path): x = path[:, 0] y = path[:, 1] dx = np.gradient(x) dy = np.gradient(y) ddx = np.gradient(dx) ddy = np.gradient(dy) numerator = np.abs(dx * ddy - dy * ddx) denominator = (dx * dx + dy * dy) ** 1.5 return numerator / np.maximum(denominator, 1e-12) def main(): raw = np.array([[0.0, 0.0], [1.0, 2.0], [2.0, 0.0], [3.0, 2.0], [4.0, 0.0]]) smooth = build_smooth_path(raw, smoothing=1.0) curv = path_curvature(smooth) print("平滑后点数:", len(smooth)) print("最大曲率:", round(float(np.max(curv)), 4)) print("起点:", smooth[0].round(3), "终点:", smooth[-1].round(3)) if __name__ == "__main__": main()
tck, _ = splprep(pts, s=smoothing, k=3)用三次 B 样条拟合路径点,smoothing控制平滑程度。x, y = splev(u, tck)在参数区间内均匀采样,生成平滑曲线的坐标点。numerator = np.abs(dx * ddy - dy * ddx)按曲率公式计算弯曲程度的分子部分。denominator = (dx * dx + dy * dy) ** 1.5用速度的立方做归一化,消除点密度影响。np.maximum(denominator, 1e-12)避免直线段处分母为零导致除零错误。
常见误区
误区既然是要消除尖角和冗余,那路径平滑的最佳结果就是一条从起点到终点的直线,路径越直越好。
正解平滑的目标是降低曲率、消除突变,而不是不惜代价拉直。真正修路时,直线可能穿过障碍物或超出车辆可达区域,所以平滑必须保留原路径的通行意图,同时控制与原路径的偏差。过度拉直会让路径严重偏离参考走廊,反而引发碰撞。
为何常见:因为“直线距离最短”的直觉太强,初学者容易把几何长度与平滑质量混为一谈。
误区样条插值能穿过所有路径点,误差为零,所以它一定优于不穿过点的 B 样条拟合。
正解路径点本身可能带噪声,插值把所有噪声都“认真对待”,甚至会在点与点之间甩出大波浪。拟合允许曲线从点群中穿过,牺牲少量贴合度,换来更稳定的平滑结果。路径平滑更关心全局可跟踪性,而不是让曲线精确经过每个原始点。
为何常见:人们习惯用“误差越小越好”评价算法,忽略了规划路径点并不是高精度测量值的现实。
误区B 样条曲线由控制点决定,那多加一些控制点,曲线应该会变得更平滑。
正解控制点越多,曲线越容易贴近每个控制点的细节,反而可能出现更多局部弯曲。真正决定平滑程度的是控制点的分布、曲线次数、平滑因子以及约束条件。就像路桩钉得越密,钢条反而更可能被顶出许多小鼓包。
为何常见:“点数多=信息多=质量好”的经验在其他场景成立,但在拟合问题中,过拟合同样会让形状变差。
误区只要路径看起来圆滑了,控制器就能完美跟踪,不需要考虑曲率连续性和物理极限。
正解如果路径只是视觉上圆滑,但曲率存在跳变,控制器仍会因转向指令突变而产生跟踪误差。对于汽车类机器人,还需要检查最大曲率是否小于最小转弯半径对应的曲率上限。平滑是为控制服务的,必须用控制端可接受的曲率指标来验收。
为何常见:可视化结果容易让人误以为“曲线很顺”,而几何平滑与运动学可执行之间存在本质差别。
面试题
Q1. 路径平滑最直接要解决的核心问题是?
- A.把路径变直
- B.消除尖角冗余← 正确答案
- C.减少路径点数
- D.增加控制精度
答案:B。路径平滑的核心是消除规划输出中的尖角与冗余抖动。把路径变直只是表象,减少点数也不是最终目的。增加控制精度更多是控制器和感知模块的任务,而不是路径平滑的直接目标。
Q2. 关于路径曲率,下列说法正确的是?
- A.直线段曲率为零← 正确答案
- B.直角处曲率为零
- C.曲率越大越平滑
- D.曲率仅与长度相关
答案:A。直线段方向不变,曲率为零。直角处方向骤然改变,曲率趋于无穷大。曲率越大说明转弯越急,路径越不光滑;曲率还依赖途经点的几何形态,不是只与长度相关。
Q3. 三次样条插值曲线的主要特点是?
- A.不经过任何原始点
- B.分段三次多项式拼接← 正确答案
- C.只能处理直线路径
- D.不需要端点条件
答案:B。三次样条在每个小区间用三次多项式表示,并保证连接点处位置、一阶导和二阶导连续,因此必须经过原始点。求解时需要端点条件才能唯一确定系数,并非只能处理直线路径。
Q4. B样条曲线相对插值方法的典型优势是?
- A.计算速度必定更快
- B.移动控制点只影响局部← 正确答案
- C.必须穿过全部数据点
- D.不依赖节点向量
答案:B。B 样条基函数具有局部支撑性,移动一个控制点只改变附近一段曲线,而插值方法往往全局联动。B 样条通常不要求穿过全部控制点,并且必须依赖节点向量定义,计算速度也不一定更快。
Q5. 数值优化平滑中的参考路径偏差项意义是?
- A.使路径远离原路径
- B.防止平滑后偏离太远← 正确答案
- C.增大路径曲率
- D.减少计算迭代次数
答案:B。偏差项把平滑后的路径“拉”向原始参考路径,防止为了平滑而把路修到安全走廊之外。它不会主动远离原路径,也不会增大曲率或缩短迭代时间。
Q6. 对车辆跟踪而言,最关注路径的哪级连续性?
- A.仅点位置连续
- B.切线方向连续
- C.曲率连续可导← 正确答案
- D.控制点数量连续
答案:C。位置连续是最低要求,切线连续可以保证方向不顺滑突变,但真实车辆还要求曲率连续,避免方向盘转角跳变。控制点数量与几何连续性无关,因此 C 最全面。
Q7. 汽车类机器人平滑路径必须满足的关键约束是?
- A.最大曲率不超转向极限← 正确答案
- B.路径颜色足够鲜艳
- C.路径点数量是偶数
- D.所有线段长度相等
答案:A。汽车有最小转弯半径,路径上任一点的曲率都不能超过对应的上限,否则实际车辆无法沿路径行驶。颜色、点数奇偶、线段等距都不是运动学层面的必要条件。
Q8. 典型路径平滑目标包含哪些?
- A.降低最大曲率← 正确答案
- B.消除冗余抖动← 正确答案
- C.扩大障碍物体积
- D.限定路径偏移量← 正确答案
答案:ABD。平滑目标包括降低最大曲率、消除冗余抖动,并让平滑路径保持在原路径附近的安全包络内。扩大障碍物体积不是平滑操作,而是膨胀地图的策略。
Q9. 选择路径平滑方法通常要考虑?
- A.场景几何复杂度← 正确答案
- B.实时计算开销← 正确答案
- C.机器人转向能力← 正确答案
- D.路径颜色美观度
答案:ABC。场景越复杂越需要带约束的优化方法;实时系统要求算法计算开销可控;机器人转向能力决定最大曲率约束。路径颜色与平滑质量无关,不应成为选型依据。
Q10. 关于路径平滑方法的评价,正确的有?
- A.插值法可能引发多余摆动← 正确答案
- B.B样条具有局部支撑性← 正确答案
- C.优化法必须考虑约束← 正确答案
- D.平滑程度越强越好
答案:ABC。插值法为了穿过所有点,在噪声点处容易产生摆动;B 样条基函数只在局部非零;优化法通过约束保证安全与运动学可行。平滑程度并非越强越好,过度平滑会造成大偏差甚至碰撞。