ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FemPosDeviation-SQP:自动驾驶参考线平滑的核心算法解析

FemPosDeviation-SQP:自动驾驶参考线平滑的核心算法解析 做规划控制的同学应该都遇到过这种情况路由模块输出的reference line看起来没什么大问题但车一跟上去控制就开始抖。方向盘频繁修正乘坐体验稀碎明明都是按规则生成的路径怎么一落地就露馅这种问题十有八九出在参考线平滑上。尤其是FemPosDeviation这类基于离散点优化的平滑方法原理不算复杂但真正把它调成能稳定跑在车上的算法中间隔着的全是对细节的理解。这篇文章就把FemPosDeviation-SQP这套东西从头到尾拆一遍从数学模型到求解器选型从代码流程到调参避坑讲清楚每一刀为什么要这样切。1. 参考线平滑自动驾驶规划里最容易被低估的环节1.1 参考线从哪来为什么天生就是歪的先捋清楚参考线在整车软件栈里的位置。感知和预测输出动态障碍物信息高精地图给出车道线、路沿等静态结构信息路由模块负责从起点到终点的宏观路线规划——走哪条车道、什么时候转弯、什么位置掉头。路由模块输出的是一串粗糙的路径点这些点的间隔不均匀精度依赖地图质量碰到路口、车道合并、障碍物绕行等情形时还会出现阶梯状折线、尖角、跳变。有人可能会问路由输出之后不是还有全局规划、局部规划、控制好几层在把关吗参考线不平滑怕什么后面的规划不是会再优化一遍轨迹吗这个想法在数学上成立在工程上不成立。局部规划器通常是在参考线的领域内搜索轨迹参考线决定了搜索空间的核心骨架。控制层里的横向控制、纵向控制以及预瞄模型全部咬合在参考线坐标系上。如果参考线本身有毛刺规划器求解出来的轨迹会被带歪即便规划算法强行把轨迹做平滑了轨迹与参考线之间的偏差也会被控制层的跟踪误差放大。实践中我们见过太多案例查来查去控制参数没问题最终发现是参考线上一段不起眼的锯齿在作祟。1.2 不平滑的参考线会产生什么连锁反应我拿一个真实场景拆给你看。假设某段路地图采样点有两个相邻点之间的角度突变达到15度这在城市快速路的匝道口并不罕见。如果直接把这段参考线丢给局部规划器横向规划为了保证贴线会产出一条带明显拐点特征的候选轨迹控制层的纯跟踪或LQR在跟踪这种轨迹时预瞄点扫过拐点区域会产生一次剧烈的方向盘修正。这种抖动的危害分三层。浅层是乘坐体验下降乘客能明显感到横向加速度突变。中层是轮胎和转向机构磨损加剧同时电耗油耗都有影响。深层是如果车速较高剧烈转向可能导致车辆偏离车道触发安全策略甚至人工接管。所以参考线平滑并非锦上添花而是保证整个规划控制链路正常工作的基础设施。1.3 平滑算法的核心诉求保形、平滑、高效参考线平滑要满足三个互相矛盾的需求。保形平滑后的参考线不能跟原始路径差太远不能在正常车道上“拉直线”切弯。这是安全底线也是对场景语义的尊重。平滑曲率变化率要尽量小至少不能有突变。平滑的量化指标一般看曲率的一阶导数方向盘转速的近似代理以及曲率的极值。高效整个参考线平滑模块要跟着上游一起实时跑一般只有几毫秒到十几毫秒的计算预算。这个约束直接排除了大批复杂算法。这三个需求相互拉扯。保形要求贴着原始线走平滑要求尽量直或尽量大半径高效要求算法结构简单。FemPosDeviation在数学上是一个典型的权衡问题通过调整目标函数里各项权重来完成这种拉扯。1.4 平滑算法家族与FemPosDeviation的定位业内常见的参考线平滑方案大致分三类。第一类是直接对离散点做几何滤波比如移动平均、滑动最小二乘拟合、道格拉斯-普克抽稀加贝塞尔插值。优点是快缺点是质量不可控弯曲路段和直线路段的滤波带宽很难统一容易出现过度平滑导致偏离车道的问题。第二类是样条曲线法。用三次样条或B样条对控制点做拟合通过控制样条阶数和节点分布来保证平滑。质量好但样条本身在连续性问题上有门槛而且拟合过程中如何权衡贴近原始点与平滑度也需要调参。第三类就是FemPosDeviation这类基于优化的方法。把参考线平滑表述成一个带约束的优化问题目标函数里包含平滑代价和保真代价约束项容纳边界约束、曲率约束等。优化变量的自由度被约束条件限制在可行域内求解器通过迭代找到最优解。严格来说Apollo等开源自动驾驶框架中使用的就是这类方法而FemPosDeviation-SQP是其中一个经典实现。Fem这个名字容易让人误以为是有限元分析但实际上这里的FEM借用了有限元方法的核心思想——把连续问题离散化为有限个节点上的变量问题再在每个局部构建某种度量最后叠加成全局目标。在FemPosDeviation里离散点就是“有限元节点”相邻几个点构成“单元”单元上的平滑度度量替代了连续曲线的导数项。2. FemPosDeviation模型拆解目标函数与约束到底在干什么2.1 从有限元思想到目标函数FemPosDeviation最核心的出发点可以概括成一句话用一个离散序列的局部差分结构来近似曲线的几何光滑程度。假设参考线离散为n个二维点p0, p1, ..., p{n-1}每个点是(x_i, y_i)。自动驾驶里的参考线平滑与机械结构里的梁变形有很强的类比关系。梁在外力作用下产生挠度我们希望梁在满足边界条件时变形尽量小、弯曲尽量平滑。FemPosDeviation把原始地图参考点看作梁的初始位置优化目标是让梁在受力变形后既有一定的刚度不至于任意弯曲又不过分偏离原始位置。体现在数学上目标函数通常由两部分组成第一项是平滑代价。二阶差分形式是这样J1 Σ ||p_{i1} - 2p_i p_{i-1}||^2这个式子的含义是三个连续点如果共线且等距二阶差分为零局部几何形态最平直。如果三个点构成折线二阶差分不为零数值越大代表折得越厉害。更严格的做法会用三阶差分J1 Σ ||p_{i2} - 3p_{i1} 3p_i - p_{i-1}||^2三阶差分可以理解为对曲率变化率的约束效果是不仅要让曲线本身光滑还要让曲率的变化也光滑。实际工程里用二阶差分还是三阶差分取决于下游规划器对曲率连续性的要求。如果下游规划器自带曲率平滑模块二阶差分通常就够用如果下游依赖参考线直接给曲率建议用三阶差分减少曲率跳变。第二项是保真代价J2 Σ ||p_i - p_i^ref||^2其中p_i^ref是原始参考点。这一项把优化后的点拉向原始点防止平滑过程把参考线“拉飞”。总目标函数写作J w_smooth * J1 w_ref * J2w_smooth和w_ref分别是平滑权重和保真权重。两者之间是权衡关系w_smooth大结果更平滑但可能严重偏离原线w_ref大结果贴近原始线但不一定平滑。2.2 边界约束把每个点关进合理区间优化不能只写目标函数防护栏必须拉起来。最简单也最必要的约束是位置边界约束即每个点必须在原始参考点附近的某个Box范围内lb_i p_i ub_ilb和ub是第i个点的上下界。一般做法是以原始参考点为中心向外扩展一个lateral_bound阈值。城市道路场景这个值通常取0.5到2米高速场景可以适当放宽。边界约束的物理意义是无论平滑到什么程度优化结果不能离开车道语义太远。这里有个细节容易被忽略边界约束的紧与松直接影响求解耗时和可行性。边界太松优化变量自由度大求解时间变长结果可能偏离参考线太多边界太紧模型容易无解尤其是在地图原始点本身有较大锯齿的情况下。工程上常见的做法是先给出一个适中的边界范围如果求解失败再渐进式地逐轮放宽边界。2.3 曲率约束非线性从哪冒出来的边界约束是线性的即使加上目标函数也是标准的二次规划QP用OSQP这类求解器就能搞定。但真实场景中边界约束并不能保证曲率满足要求。两条路径可以让每个点都落在边界框内但其中的几何形态可能是剧烈折线。所以工程上会引入曲率约束。离散曲率的近似方式有多种最直观的是通过相邻向量的夹角来近似。对于连续三点p_{i-1}, p_i, p_{i1}定义两个向量v1 p_i - p_{i-1} v2 p_{i1} - p_i夹角theta_i满足cos(theta_i) (v1 · v2) / (|v1| * |v2|)如果采样间隔近似均匀曲率近似为kappa_i ≈ theta_i / ds其中ds是相邻点之间的平均距离。要约束曲率不超过kappa_max等价于约束夹角不超过theta_max kappa_max * ds。而cos(theta_max)是一个常数因此约束可以写成(v1 · v2) / (|v1| * |v2|) cos(theta_max)不等式两边同时乘上向量模长积(v1 · v2) cos(theta_max) * |v1| * |v2|等号右边的模长积是关于优化变量p_i的非线性函数这就导致整个约束变成非线性的。一个原本可以用标准QP秒解的问题加入了曲率约束后升级为非线性规划NLP。为什么需要SQP就是因为这个非线性项。非线性规划求解器的家族里序列二次规划SQP是一大类方法它的核心思路是用一系列二次规划子问题去逼近原始非线性问题每一个子问题都是标准化格式可以用成熟的QP求解器处理。对于FemPosDeviation这种本质上“以QP为主、只带少量非线性约束”的问题SQP比内点法这类通用NLP求解器更高效也更容易利用问题的稀疏结构。2.4 为什么不用样条去替代优化方法聊到这里很多读过路径规划论文的朋友会问三次样条天生二阶连续直接用样条拟合参考点不就行了吗为什么还要走FemPosDeviation这种离散优化路线我的观点是样条适合在场景语义清晰、控制点数量少的环境中使用。但在城市道路这种复杂场景下参考线上往往叠加了绕行、变道、路口衔接等多种语义信息控制点数量动辄几百上千样条拟合的全局参数调整很容易出现某一段过拟合、另一段过度平滑的情况。而且样条拟合通常无法直接融入曲率上下界约束一旦需要约束曲率样条的无约束优化结果未必满足要求需要额外迭代修正。FemPosDeviation这类离散优化方法则在数学上天然支持边界、曲率等多种约束的叠加灵活性远高于纯样条方法。这也是它在开源自动驾驶框架中被广泛采用的原因。3. 求解器选型与SQP关键细节3.1 当QP不够用时SQP如何层层逼近前面说了加入曲率约束后问题变成NLP。但一个聪明的工程人员不会急着上重型NLP求解器而是思考能不能把问题拆成一串QPSQP的思路正是如此。在某个当前迭代点x_k附近把非线性目标函数做二阶泰勒展开把非线性约束做一阶泰勒展开然后求解一个QP子问题得到搜索方向delta_x。接着通过线搜索确定步长alpha更新x_{k1} x_k alpha * delta_x。重复这个过程直到满足收敛条件。用一句人话说SQP就是“在每个局部把复杂问题简化成二次规划求解一小步再在新的位置上重新做局部二次规划再求一步”。在FemPosDeviation-SQP场景中目标函数本身是二次的SQP迭代过程中只需要对曲率约束做线性化然后QP子问题里的约束矩阵就是曲率约束在当前点的雅可比矩阵。雅可比矩阵具有稀疏带状结构每个约束只关联三个连续点所以可用稀疏线性代数高效求解。这种“目标函数已是二次、约束只有少量非线性”的结构对SQP来说是非常理想的问题类型。迭代次数通常很少一般5到10次就能收敛到较高精度远快于通用NLP求解器。3.2 SQP求解FemPosDeviation的完整数学流程逐个展开SQP求解这个问题的流程。记优化变量为x [x_0, y_0, x_1, y_1, ..., x_{n-1}, y_{n-1}]维度为2n。目标函数写法如下J(x) w_smooth * (x^T * A_smooth^T * A_smooth * x) w_ref * (x - x_ref)^T * (x - x_ref)其中A_smooth是二阶差分算子矩阵每一行对应当前点和前后两个点的线性组合比如对第i点来说非零项在对应i-1、i、i1的位置系数为1、-2、1。A_smooth是一个稀疏矩阵存储上可以用三对角结构来优化。边界约束写成线性不等式lb x ub这个约束在整个SQP迭代过程中保持不变。曲率约束在第k次迭代时对当前点x_k做一阶泰勒展开。对于第i个曲率约束g_i(x) 0在x_k处展开g_i(x) ≈ g_i(x_k) J_{g_i}(x_k) * (x - x_k)其中J_{g_i}是g_i对x的梯度可以用解析方式推导出来。FemPosDeviation的曲率约束只涉及p_{i-1}、p_i、p_{i1}三个点六个变量梯度矩阵局部填充、整体稀疏。QP子问题写作minimize 0.5 * delta_x^T * H_k * delta_x c_k^T * delta_x subject to lb - x_k delta_x ub - x_k g_i(x_k) J_{g_i}(x_k) * delta_x 0其中H_k是拉格朗日函数Hessian矩阵或BFGS近似c_k是目标函数在x_k处的梯度。这个QP子问题的规模与参考线点数成正比但结构稀疏用OSQP、qpOASES这类稀疏QP求解器处理效率非常高。每个点对应两个优化变量而A_smooth的带状结构让Hessian也保持带状。线搜索阶段的步长选择常用两种方式。简单方式是回退法从alpha 1开始不断缩小alpha直到新的迭代点满足约束违反度和目标函数下降条件的弱化版本。更规范的方式是采用Armijo条件或者Wolfe条件保证全局收敛性。收敛判据推荐同时检查三件事目标函数相对下降量低于阈值、约束违反度低于阈值、梯度投影范数低于阈值。只检查目标函数下降是不够的可能出现目标函数已经卡住但约束还没满足的情况这一点在曲率约束比较紧的场景尤其要当心。3.3 手写SQP还是调用现成库工程上的选型逻辑这个问题在开发群里反复被问到。我的建议是在自动驾驶量产项目里优先评估现成的非线性优化库比如NLopt、IPOPT、ceres-solver的NLP接口能少踩很多轮子。但SQP求解FemPosDeviation有一个特殊之处目标函数是固定二次型需要反复构造QP子问题如果使用通用NLP库每次都会把整个问题重新处理一遍浪费在重构上的计算量不小。在百度Apollo的参考线平滑模块设计中FemPosDeviation可以采用基于OSQP的QP求解路径也可以走SQP路径处理带曲率约束的版本。自定义SQP的最大优势在于可以完全控制稀疏结构的构建把雅可比矩阵和Hessian矩阵的填充算好每个QP子问题都是解决一个高度稀疏的带状QP计算效率最大化。如果只是想快速验证算法效果直接用现成的NLP求解器也没问题收敛性更好代码量少一半。我自己在工程落地时会遵循一个原则先跑通再抠效率。一上来就手写SQP调试成本太高容易消磨信心。3.4 SQP求解器的关键参数与调法SQP里需要关心的核心参数就三个迭代上限、收敛容差、步长策略。迭代上限建议设置为20到50不要设得太小。复杂场景下曲率约束刚从不可行域往可行域逼近时可能需要多个迭代步才能进入正常收敛通道。收敛容差通常拆成两部分目标函数容差建议1e-6到1e-8约束容差建议1e-4到1e-6。约束容差不宜设得比地图精度还小高精地图本身误差有厘米级参考线平滑把约束满足到厘米级就足够了过分追求约束精度只会增加迭代次数。步长策略里最常用的是backtracking line search。实现简单效果稳定。我在实际调试中发现对于参考线平滑这一类“初始点离最优解不太远”的问题alpha1通常就能满足下降条件回退过程很少真正触发多次。注意SQP不是万能的。如果初始点离可行域特别远或者曲率约束目标值设置得过小导致原本就无解SQP也会出现迭代震荡甚至发散。碰到这种情况第一反应不是调求解器参数而是回去检查问题本身的合理性例如曲率约束是否过紧、边界约束是否过窄、输入轨迹是否出现连续尖点。3.5 与其他求解思路的横向对比做个表格能看得更清楚。方案目标函数约束类型求解效率适用场景纯几何滤波无明确目标无极高简单预处理、低要求场景标准QP无曲率约束二次线性边界高曲率风险低的场景FemPosDeviation-SQP二次边界非线性曲率中高城市复杂道路、弯道多通用NLPIPOPT等二次复杂中原型验证、非实时需求这个表格想表达的核心观点是稳定性和效率未必总在同一边需要根据实际场景的约束复杂度来选型。车道保持这类场景无曲率约束的标准QP已经足够但城市道路中的丁字路口、连续S弯等场景曲率约束是不可回避的这时候SQP几乎是性价比最高的选项。4. 从数学到代码完整求解流程实战4.1 预处理采样密度与数据清洗进入求解器之前输入原始参考点的质量直接决定输出质量。预处理第一个动作是插值重采样。路由模块输出的点间隔不均匀有的地方几米一个点有的地方十几米一个点间距不稳定会让有限元网络中的“单元”尺寸不一致曲率近似误差加大。推荐做法是用航向角或者弧长参数做等距插值通常是0.5米到1米一个点。采样间隔直接与后续曲率约束中的ds绑定千万别搞混。如果采样间隔设成1米曲率约束公式里的ds就是120米半径的弯道对应的离散角度约束大概是0.05弧度。如果把采样改成0.5米同样半径的弯道对应的角度约束变为约0.025弧度约束条件变严了一倍。预处理第二个动作是检测并修正野值点。地图上的跳变点如果不做处理保真代价会把平滑结果强行拉向野值点最终整段参考线出现一个奇怪的骨节。处理方式可以不直接删点而是降低野值点对应保真项的权重或者把野值点附近的边界约束放松。严格来说地图点既然存在就有其语义轻易删点可能丢掉关键信息所以降权是更安全的选择。4.2 初始化为什么不从零猜起SQP迭代需要一个初始解。最优的初始解就是原始参考点本身。理由很朴素原始参考点即使在平滑度上不合格但它大概率在几何上是合理的——落在车道内、跟随道路走向。从原始参考点出发SQP迭代可以快速找到一个贴近原路又满足平滑和曲率约束的解。如果原始参考点存在严重质量问题比如某些点直接穿到路沿外侧甚至建筑物边界直接以它为初值可能导致迭代路径偏离。这时候一个实用的初始化策略是做一轮轻量级几何滤波比如三点滑动平均作为初值目的是把明显离谱的点拉回车道内又不引入过强的平滑偏置。warm start对SQP的实际意义我多说一句FemPosDeviation-SQP不是一次性求解完就完了而是要每一帧都跑。上一帧的优化结果包含大量历史信息直接作为这一帧的初值能让迭代在几步内就收敛这就是warm start。实测下来使用上一帧结果做初值比使用原始参考点做初值平均减少30%到50%的迭代次数这是参考线平滑实时性的关键来源之一。4.3 代价矩阵与约束矩阵的构建细节构建稀疏矩阵时最容易出错的是索引对齐。假设有n个点优化变量维度是2n第i个点对应变量索引2i和2i1。二阶差分矩阵A_smooth的行数为(n-2)列数为2n每一行对应一个内部点。对于第i行对应原始点索引i除了第i-1、i、i1个点之外全部为0。x方向的系数放在偶数列y方向的系数放在奇数列x方向位置2(i-1)处为1位置2i处为-2位置2(i1)处为1 y方向位置2(i-1)1处为1位置2i1处为-2位置2(i1)1处为1这个三对角结构在填充时用标准稀疏矩阵库Eigen、EigenSparse或自定义CSC格式都很快。曲率约束的雅可比矩阵构建比二阶差分矩阵麻烦一点。每个曲率约束涉及三个点、六个变量。以角度形式约束为例约束表达为g_i (v1 · v2) - cos(theta_max) * |v1| * |v2| 0其中v1 [x_i - x_{i-1}, y_i - y_{i-1}]v2 [x_{i1} - x_i, y_{i1} - y_i]。对六个变量分别求偏导可以解析地写出来。这一步建议写成独立的函数模块并用数值梯度验证一次解析梯度的正确性。解析梯度一旦写错可能会导致SQP迭代直接发散而且这类bug不太容易通过日志发现所以先验证再上线这步省不了。4.4 求解器调用流程与迭代日志怎么看整个求解流程的伪代码风格如下输入原始参考点集插值重采样检查野值点生成边界上下界初始化x 原始参考点或上一帧平滑结果设置SQP参数迭代上限、收敛容差、权重循环{构建QP子问题线性化曲率约束 → 求解QP → 线搜索确定步长 → 更新x → 检查收敛条件}输出平滑后的参考点集附带每个点的曲率估计值迭代日志要打印哪些字段我的习惯是迭代次数目标函数值最大曲率约束违反量边界约束最大违反量步长当前最大曲率打印最大曲率约束违反量很重要。迭代曲线如果出现“目标函数下降但约束违反量不下降”的横盘状态说明问题几乎不可行需要立刻终止迭代并上报而不是死磕到迭代上限。4.5 长参考线滑动窗口分段平滑几百个点的参考线可以一次性求解但实际道路上一条完整参考线动辄几千个点求解维度太大稀疏矩阵也可以处理但延迟不可控。常用策略是滑动窗口。比如窗口长度设为60个点重叠20个点每次只优化窗口内的点然后窗口向后滑动。窗口与窗口之间的重合区域怎么保证平滑连接是个关键点。我见过三种做法第一种是硬切直接取窗口后段的一部分作为输出窗口前段丢弃。实现简单但衔接处可能出现轻微不连续可能导致下游规划出现横摆角突变。第二种是软约束拼接窗口重叠区域的优化目标里增加一项向上一帧重叠区域解的吸引项保证相邻窗口解出的重叠区域坐标和航向尽量接近。这种方案的衔接质量更高但需要额外维护上一帧窗口的缓存。第三种是加权融合对重叠区域的每个点用两个窗口算出来的结果做距离反比加权平均。这个方案实现同样简单且比硬切自然得多适合精度要求不是极致高的场景。我实际项目里用的是第二种方案。虽然多写一点缓存代码但换来的是下游规划器几乎感觉不到窗口衔接的存在。4.6 求解失败时的降级策略即使SQP调得很稳定也要考虑极端情况下的求解失败。推荐的降级链条是先检查初始解是否满足边界约束如果不满足说明输入数据问题更大返回原始参考点并上报警告接着尝试放宽曲率约束上限比如从0.2放宽到0.3再进行一次求解如果仍然失败放弃曲率约束退化为标准QP求解最后兜底策略是输出几何滤波后的参考点。降级策略要写在代码注释里并配合监控指标而不是等出了线上问题再临时想。你永远不会希望参考线平滑模块因为一个极端场景直接崩溃毕竟它下游还有一大串模块在等着吃数据。5. 工程落地中的高频问题与调参经验5.1 曲率约束一紧就无解怎么办这是SQP版参考线平滑最常遇到的问题。现象是把kappa_max从0.3改成0.2SQP就开始不收敛或收敛到不满足约束的解。排查思路从建模合理性入手。首先确认采样间隔ds是否与曲率约束公式中的一致。现实中最容易出的问题就是地图点在预处理时被重采样成了0.5米间距但曲率约束代码里ds还按1.0米计算导致实际约束比名义值严格一倍。这种情况下把ds改对问题就解决了。其次检查原始参考线的几何形态。如果某段路是连续蛇形弯相邻三点之间的夹角本身就无法满足目标曲率约束那这个约束从一开始就不可行任何求解器都无能为力。实际处理方式是区分约束的“软硬”对不可行区域内的曲率约束使用松弛变量允许在一定惩罚下稍微突破约束。代价函数里给松弛变量一个很大的惩罚系数这样求解器会优先满足其他约束只在不影响全局可行的前提下用“几乎不可行”的方式处理少数顽固点。5.2 平滑结果震荡漂移如何稳住边界有朋友遇到过这样的问题同一段路前几帧平滑结果很稳某天突然开始整段参考线横移了几十厘米虽然边界约束没违反但视觉上明显偏离车道中心线。这种“整体漂移”往往不是平滑模块单独造成的而是由于地图原始点在那个时间段有更新或者路由模块的路径点选择发生了变化。平滑结果对原始点保真项言听计从原始点集体偏了一个方向优化结果自然跟着偏。排查方法把前后两帧的原始参考点叠在一起画出来看是否有系统性平移再看平滑结果是否只是对原始点平移到来的忠实跟随。如果是那么问题根源不在平滑模块而在于上游地图或路由模块的帧间一致性。如果确认平滑模块本身需要加强稳定性可以引入时间维度上的软约束当前帧的参考点除了贴近当前帧原始点还要贴近上一帧平滑结果加一个权重较低的时间平滑项。这能明显抑制帧间抖动代价是对急转弯这类快速变化的场景会有延迟需要在权重上做折衷。5.3 弯道处被拉直权重与曲率约束的配合高速路的弯道曲率通常不大但匝道、城市道路转弯处曲率变化剧烈。平滑权重如果偏大优化器会倾向于把弯道“掰直”减少平滑代价。被拉直的参考线虽然几何平滑了却可能侵入相邻车道甚至压到路沿。处理手法有两个层面。第一层面是把曲率约束卡紧特别是弯道段的曲率约束。这要求曲率约束不能是全局统一值最好根据当前道路的设计时速设定不同的最大曲率。高速路段kappa_max可以设小一点城市低速路段可以设大一点。第二层面是调整平滑代价的形式比如使用分段加权平滑代价在曲率大的区域降低平滑权重在直线区域提高平滑权重。这种“按曲率自适应调节权重”的做法有工程上的显著收益。5.4 一两帧突然打偏初值和warm start的坑SQP收敛质量严重依赖初值。上一帧的平滑结果作为初值时如果当前帧的路由输出发生了突变比如突然多了一个绕行点上一帧的优化结果可能不再在当前帧的可行域内导致求解器朝着一个奇怪方向迭代输出一两帧明显打偏的参考线。应对策略是给warm start加一道守卫先用上一帧平滑结果与当前帧原始参考点做一个粗略对齐如果两者在某个区域的偏差超过设定阈值就在该区域放弃warm start改用原始参考点作为初值。这个阈值一般取边界约束宽度的1.5倍左右。5.5 一套推荐的调参起点与调参顺序给一套实际可行的初始参数方便快速跑通采样间距ds1.0米平滑权重w_smooth50保真权重w_ref10边界约束half-width0.5米最大曲率kappa_max0.2约等于5米转弯半径SQP迭代上限30目标函数容差1e-8约束容差1e-5调参顺序有讲究。先固定权重调约束参数确保求解器在给定条件下能稳定收敛。再调权重比例观察平滑结果是否出现拉直或抖动。最后根据实车测试中的横向加速度指标微调。不要一上来同时动五个参数出了问题根本定位不到根因。调参时建议把每一轮优化后的最大曲率、最大曲率变化率、与原始点的最大偏差导出成曲线跟实车体验对照着看。你会发现很多看似玄学的参数调整最终都能从这些曲线里找到解释。5.6 常见问题速查表现象可能原因排查与解决思路SQP迭代不收敛初始点过远、约束过紧、梯度计算错误检查初始点是否在可行域附近核对解析梯度逐轮放宽边界约束弯道处被拉直平滑权重过大或曲率约束过松降低w_smooth卡紧kappa_max使用分段自适应权重结果抖动、横摆突变权重不合适或初值不一致提高平滑权重对初值做时间平滑检查warm start守卫逻辑长参考线求解超时单个QP规模太大、迭代次数过多使用滑动窗口加大重叠区域改用稀疏求解器帧间偏移明显上游路由输出变化、地图更新检查上游数据一致性引入时间平滑软约束曲率约束无解原始路径本身超曲率、ds设置错误核实采样间距与曲率公式一致性使用松弛变量处理少数顽固点输出点在边界外边界约束未生效、求解器精度不够检查约束矩阵索引调小约束容差检查QP子问题中约束是否正确传递写在最后的一点心得FemPosDeviation-SQP这套方案我已经在多个项目中验证过它最大的优势不是某一个数学性质多漂亮而是把“平滑度”和“安全性”这两个相互打架的目标硬生生压进了同一个可求解的框架里用清晰的权重分配和约束体系让工程师有了明确的调节抓手。但我必须诚实地说这个方案的性能天花板不取决于SQP迭代多么精准而取决于你对输入数据有多了解。地图点的几何可靠性、路由模块的输出规律、下游控制器的跟踪特性这些上下文信息一旦在调参时被忽略再好的求解器也救不回来。我踩过最深的坑就是把所有精力花在SQP参数上最后发现源头是地图拼接处有一片点云错位。给实际做这个模块的朋友一个建议调试阶段先在离线数据集上录一段最复杂的城区道路包括大量弯道、匝道、路口然后用脚本反复回放对比平滑前后的曲率曲线和横向偏差曲线。这类数据驱动的验证方式比单纯调几个权重参数要靠谱得多也能帮你更快建立对这个算法的直觉。
返回列表