第四节 目标函数设计:跟踪误差权重、控制量惩罚、加速度平滑性权重
好,咱们接着聊。上一节我们把MPC的预测模型搭起来了,那模型有了,接下来最关键的一步就是——怎么告诉控制器“什么才是好的行为”?
说白了,就是设计目标函数。你想想看,MPC本质上是个优化问题,它得有个目标去最小化。这个目标长什么样,直接决定了车辆是“贴线狂魔”还是“佛系巡航”。
我个人习惯把目标函数拆成三块来看:跟踪误差、控制量惩罚、加速度平滑性。这三块权重调好了,车就听话;调不好,要么抖得像筛糠,要么拐弯拐到沟里去。
4.1 跟踪误差权重:你到底有多想“贴线”?
先看第一项——跟踪误差。这玩意儿衡量的是车辆实际状态和参考轨迹之间的偏差。
通常我们关心两个东西:横向位置偏差和航向角偏差。数学上写成:
J_error = Σ ( w_e * e_y² + w_ψ * e_ψ² )
其中:
e_y是横向偏差(车离车道中心线多远)e_ψ是航向角偏差(车头指向和道路方向差多少)w_e和w_ψ就是对应的权重
这里有个坑,我踩过。有一次在高速场景调试,我把 w_e 设得特别大,结果车在直道上确实贴线很准,但一进弯道,方向盘就开始疯狂抖动。为什么?因为权重太大,控制器为了消除那一点点横向误差,不惜猛打方向。
我建议的调参思路是:
- 直道场景:可以适当提高
w_e,让车保持居中 - 弯道场景:适当降低
w_e,给控制量惩罚留点空间 - 航向角权重
w_ψ:一般比横向权重小一个数量级,因为航向偏差可以通过横向偏差间接修正
4.2 控制量惩罚:别让方向盘“抽风”
第二项是控制量惩罚。说白了,就是告诉控制器:“你别为了追求完美跟踪,把方向盘打得飞起。”
控制量通常指前轮转角 δ,有时候也包括加速度 a。目标函数里写成:
J_input = Σ ( w_δ * δ² + w_a * a² )
这里 w_δ 和 w_a 就是控制量的惩罚权重。
嗯,这里要注意:控制量惩罚的本质是“能耗”和“舒适性”的权衡。你想想看,如果 w_δ 设成0,那控制器会怎么干?它会用最大的转角去消除误差,结果就是——乘客晕车,转向机过热。
我在项目中遇到过一种情况:某款车的转向系统响应特别快,但机械间隙小。一开始我把 w_δ 设得很小,结果方向盘高频抖动,转向电机电流直接爆表。后来把 w_δ 提高了3倍,抖动消失了,跟踪精度只损失了不到5%。
4.3 加速度平滑性权重:让乘客不晕车
第三项,也是很多新手容易忽略的——加速度平滑性。它惩罚的是控制量的变化率,也就是 jerk(加加速度)。
数学形式:
J_smooth = Σ ( w_dδ * (δₖ - δₖ₋₁)² + w_da * (aₖ - aₖ₋₁)² )
说白了,就是不让方向盘和油门/刹车变化得太突然。你想想看,如果上一时刻方向盘打了10度,这一时刻突然要打30度,那车会怎么反应?——猛地一拽,乘客脑袋撞玻璃。
我个人习惯把 w_dδ 设得比 w_δ 大一些。为什么?因为平滑性直接决定了乘坐体验。我曾经调试过一个L2级别的车道保持功能,跟踪精度已经达标了,但测试工程师反馈说“坐这车想吐”。后来我把加速度平滑性权重提高了两倍,问题就解决了。
1. 安全性(跟踪误差)—— 必须保证不偏离车道
2. 舒适性(加速度平滑性)—— 影响用户体验
3. 经济性(控制量惩罚)—— 影响能耗和机械寿命
4.4 三个权重的调参实战策略
好,理论说完了,咱们聊聊实战中怎么调。我一般按以下步骤来:
- 先固定跟踪误差权重:把
w_e和w_ψ设为一个基准值,比如w_e=1.0,w_ψ=0.1 - 再调控制量惩罚:从
w_δ=0.1开始,逐步增加,直到方向盘动作不再抖动 - 最后调平滑性权重:从
w_dδ=0.5开始,观察加速度曲线是否平滑 - 微调迭代:三个权重互相影响,需要来回调2-3轮
下面是一个典型的权重配置示例,来自我做过的一个项目:
| 权重参数 | 初始值 | 最终值 | 调整原因 |
|---|---|---|---|
| w_e(横向偏差) | 1.0 | 0.8 | 弯道抖动,降低后改善 |
| w_ψ(航向偏差) | 0.1 | 0.15 | 直道偏航,稍微提高 |
| w_δ(转角惩罚) | 0.1 | 0.3 | 转向抖动,提高后平滑 |
| w_dδ(转角变化率) | 0.5 | 1.0 | 乘客晕车,提高后改善 |
| w_a(加速度惩罚) | 0.05 | 0.1 | 加减速太猛,适当提高 |
| w_da(加速度变化率) | 0.2 | 0.5 | 起步顿挫,提高后平顺 |
看到没?最终值和初始值差别不小。这就是调参的常态——纸上谈兵容易,实际跑起来才知道问题在哪。
4.5 避坑指南
最后,分享几个我踩过的坑:
- 权重比例失调:我曾经把跟踪误差权重设得比控制量惩罚大100倍,结果车在弯道里直接冲出车道——因为控制器为了减小误差,打了太大的方向,导致车辆失稳。
- 忽略加速度平滑性:有一次只调了前两项,觉得跟踪精度很好,结果试乘时测试员说“这车像在跳摇摆舞”。加上平滑性权重后,问题立刻解决。
- 权重不随车速变化:高速和低速时,同样的权重效果完全不同。我建议把权重做成车速的函数,比如高速时增大跟踪误差权重,低速时增大控制量惩罚。
嗯,目标函数设计这块,说白了就是三个权重的博弈。没有万能公式,只有不断试错。但只要你理解了每个权重的物理意义,调起来就有方向了。
下一节,咱们聊聊约束处理——怎么让MPC知道“方向盘不能打到底”、“加速度不能超过0.3g”。这些约束设不好,MPC算出来的解可能根本不能用。