ARTICLE DETAIL

资讯详情

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

基于MPC的自适应巡航控制:建模、调参与实车落地

基于MPC的自适应巡航控制:建模、调参与实车落地 自适应巡航控制这事刚入行那会儿我以为是“把车速稳住、把车距守住”直到第一次在实车上把基于MPC模型预测控制的ACC控制器烧进去跟着测试车在高速上跑了一圈才发现这件事的难度根本不是“稳住”而是在安全、跟车性、舒适性和经济性之间不停做权衡——而这恰恰是MPC最擅长的领域。这几年新能源和智能驾驶把ACC重新带火了一遍可很多做控制的同行一聊到MPC就发怵觉得矩阵推导复杂、QP求解怕实时性不够、权重调起来全凭玄学。这篇东西我尽量不堆公式就按我自己从仿真到实车这条线把“基于MPC的自适应巡航控制”到底怎么落地、各个环节有哪些坑、参数怎么从零开始第都拆开讲一遍。适合刚接手纵向控制项目的工程师也适合正在写论文、想把MPC真正跑起来的同学参考。1. 为什么ACC比定速巡航难又为什么偏偏是MPC1.1 定速巡航是“单目标跟踪”ACC是“多目标博弈”先说到底盘逻辑。定速巡航只需要让车速稳定在设定值附近本质是一个单输入单输出的跟踪问题PID甚至一个查表PI就能干得很好。ACC不一样它面对的是动态变化的交通流前车可能加速、匀速、减速甚至旁边车道随时有车切入。这时候控制器要同时满足四个目标保持安全距离绝对不能撞上前车跟车误差尽量小前车快我也快前车慢我也慢不能慢半拍加加速度jerk不能太大不然乘员晕车平均加速度尽量平缓省油省电。这四个目标本身是互相打架的。你想要距离误差小就只能把车距压得紧一点可一旦前车急刹响应再快也需要物理减速距离舒适性必然受影响你想要舒适加速度变化就得慢但前车突然切入时你慢一拍可能就逼近安全边界了。传统PID在单一目标面前很能打面对这种多目标冲突就只能靠各种切换逻辑硬凑工程上能做但标定量巨大而且边界场景容易出问题。1.2 PID和LQR为什么在ACC场景受约束限制PID的另一个硬伤是没有显式的约束处理能力。ACC里存在大量约束主车加速度受发动机/制动系统能力限制、车速不能为负、相对距离不能低于某个安全阈值。PID不会管这些它只是按误差算控制量输出结果有可能超出执行器能力需要额外的限幅、积分抗饱和、条件切换这些“补丁逻辑”去兜底。补丁叠多了系统行为就变得很难分析不同场景之间的切换还容易抖。LQR比PID高一级它可以把多个目标都写进一个二次型代价函数里通过调Q和R矩阵来权衡。但LQR仍然处理不了约束。标准的LQR是不带不等式约束的你只能在设计完增益之后靠经验去判断“这个工况下会不会超限”然后通过降低增益来被动规避这实际上牺牲了太多性能。1.3 MPC的核心优势把“未来”放进决策里MPC做的事情简单说就是“每过一个控制周期基于当前状态预测未来一段时间的系统演化然后在满足约束的前提下求一组最优控制序列最后只执行第一个控制量下一个周期重新来”。这种“滚动优化有限时域显式约束”的框架等于把ACC的四个博弈目标统一成了一个在线优化问题。所有想权衡的东西都放进代价函数所有不能碰的边界都写进约束由求解器在每个周期内找最优解。有人觉得MPC是个控制器我更愿意把它理解成“决策器”。它不需要预先算好一个固定的反馈增益它每次都在根据当前场景重新决策。前车平稳时它偏向经济舒适前车急刹时它宁可牺牲舒适也要保安全这种自适应能力是PID和LQR那种“一劳永逸”的固定增益结构给不了的。2. 分层式ACCMPC在纵向控制链里的位置2.1 典型的ACC系统三层架构实车上的ACC从来不是一个MPC控制器单打独斗它一般嵌在一条很长的纵向控制链里。我习惯把它分成三层来理解对应到实车项目里也好跟同事对齐需求。最底层是执行层包括发动机/电机扭矩控制、制动液压控制、变速器控制这一层收到的是“期望加速度”或“期望扭矩/制动压力”的请求它负责把整车实际加速度拉过去。中间那层才是ACC控制器本体负责根据感知信息输出期望加速度。再往上或者横向来看还有感知层负责目标检测和筛选——也就是搞清楚“我到底在跟谁”。MPC通常就住在中间那一层。它接受毫米波雷达和摄像头融合之后输出的本车速度、前车速度、相对距离、相对速度以及驾驶员设定的巡航速度和车距挡位然后输出一个带约束的期望加速度值给执行层。2.2 下面就是各层的分工与接口关系感知层做得好不好直接影响上层这是很多做控制的同学容易忽略的。传感器原始数据不能直接用雷达会给一堆目标点里面有静止护栏、金属井盖、旁边车道的大货车谁才是我该跟的车这一层需要目标筛选与运动状态估计通常还会跑一个卡尔曼滤波或交互多模型输出一条平滑的目标轨迹。目标一旦切换比如原来跟前车A现在A转出去了我又追上B相对距离和相对速度会产生一个跳变控制器如果没做好平滑处理车速会突然大起大落。执行层同样不能想当然。你给一个期望加速度发动机、电机和液压制动系统的响应速度完全不同电机响应在几十毫秒量级发动机要经过进气、喷油、燃烧做功可能有200到300毫秒的延迟制动系统还有建压时间。如果MPC内部预测模型假设加速度是瞬间实现的实际执行器却拖了半拍控制器会不断输出更大的请求来补偿最后就很难收敛。2.3 MPC在这一层里到底输出什么明确一下接口边界MPC输出的不是油门开度也不是制动压力而是期望纵向加速度。这一点很关键因为它把“我要减多少速”和“用刹车还是用电机反拖来实现”这两件事解耦了。扭矩分配逻辑和制动协调是执行层的事ACC控制器不关心。正因为输出量是加速度状态方程建模才可以用一套很简化的纵向动力学模型来描述不用去纠结发动机MAP图、变速器速比那些细节。3. 预测模型搭建距离、车速与前车加速度如何进入状态方程3.1 选状态变量能直接测量的和必须估计的MPC的预测模型不需要描述整车所有物理过程它只需要抓住纵向跟车场景里最重要的那几个量。我常用的状态向量是主车位置 x_h单位m主车速度 v_h单位m/s前车位置 x_p单位m前车速度 v_p单位m/s相对距离 d x_p - x_h单位m。控制输入是主车加速度 a_h。前车加速度 a_p 在模型里怎么处理后面马上说它不参与主车状态推进但会影响相对运动。位置和速度都是能直接测量的相对位置其实就是相对距离雷达直接给状态观测这一层没有太大负担。有些方案还会额外引入加速度传感器的偏置、坡度阻力当干扰项实车时候再说仿真空载一般不需要。3.2 离散化状态方程一个采样周期里的运动关系以采样周期 T_s 做一阶离散化车辆在Δt内的速度和位置更新关系其实非常朴素v_h(k1) v_h(k) T_s × a_h(k)x_h(k1) x_h(k) T_s × v_h(k) 0.5 × T_s² × a_h(k)v_p(k1) v_p(k) T_s × a_p(k)x_p(k1) x_p(k) T_s × v_p(k) 0.5 × T_s² × a_p(k)前车加速度 a_p 在控制周期内通常无法预知最省事的做法是把它当成可测扰动即假设在预测时域内前车保持当前加速度不变。这样处理虽然粗糙但大多数ACC场景下够用因为前车的剧烈加减速本身是驾驶意图突变任何控制器在突变发生的那个周期都很难做到完美预判重点是在突变后快速响应。如果想做得更细可以给前车加一个加速度变化率模型或者用多模型估计下一周期的加速度趋势但运算开销和调参复杂度都会上去入门阶段不建议一上来就铺这么开。离散化的物理含义就是在一个采样周期内假设加速度恒定然后按匀加速直线运动推算位置和速度变化。这个假设只有在采样周期足够短的时候才成立T_s 一般取40到100毫秒即10到25Hz的控制频率。3.3 安全距离模型恒定车头时距是怎么进状态方程的ACC里判断“安不安全”需要一个期望安全距离 d_des。固定距离模型最简单就是不管车速多少都保持一个固定值比如50米。但这是有问题的高速上跟前车50米一旦前车急刹反应时间可能不够低速排队时还要留50米旁边车辆疯狂加塞体验很差。工程上主流用的是恒定车头时距Constant Time Gap, CTG模型d_des t_gap × v_h d_0t_gap 是车头时距一般取0.8到2.2秒d_0 是停车时的最小间距取2到5米。这个模型的含义是跟车距离随本车速度线性增加车速越快留的距离越大。它把“时距”作为标定量很直观而且状态方程里它是线性的方便后面推导误差模型。接着定义两个误差量距离误差 e_d d - d_des (x_p - x_h) - (t_gap × v_h d_0)速度误差 e_v v_p - v_h目标就是让 e_d 和 e_v 都收敛到0。有了这两个误差量后面代价函数写起来就非常清爽。3.4 把误差模型写成状态空间形式状态变量选 [e_d, e_v, a_h]输入是 Δu a_h(k1) - a_h(k)。我习惯把差分加速度当输入也就是把 jerk 作为被控量的变化率来约束这样舒适性指标可以直接写进代价函数里。状态方程在这个选择下是e_d(k1) e_d(k) T_s × e_v(k) - 0.5 × T_s² × Δu(k) 0.5 × T_s² × a_p(k) - T_s × t_gap × Δu(k)e_v(k1) e_v(k) T_s × a_p(k) - T_s × a_h(k) - T_s × Δu(k)a_h(k1) a_h(k) Δu(k)注意 t_gap 项是从 d_des 对 v_h 求导带出来的。前面那一坨看晕了没关系核心就一条状态量里面埋了物理约束代价函数直接用这些误差量去惩罚不需要每次在运行时重新推导。4. 代价函数设计权重不是拍脑袋拍的是按物理量纲算的4.1 四类惩罚项分别管什么MPC的优化目标由代价函数定义。我在纵向ACC里常用下面这组惩罚项距离误差平方 e_d²惩罚跟车距离偏离期望值管安全性速度误差平方 e_v²惩罚相对速度不为零管跟车性能加速度平方 a_h²惩罚过大的加速度请求管油耗/电耗和乘坐舒适性控制增量平方 Δu²惩罚加速度变化过快直接对应 jerk管平顺性。总代价就是带权重的求和再加上预测时域内所有步数的累加。设计权重这一步是最容易劝退新手的。很多教材直接扔一组Q、R矩阵完事压根不解释为什么这样取。实际工程项目里权重的物理含义就是“你允许这个量到多大”好的初始值完全可以根据允许偏差来反推。4.2 按允许偏差反推权重初值假设我为某个车型做标定时的初始设置距离误差允许±2m → 距离惩罚的期望量级大约是 1/2² 0.25速度误差允许±2m/s → 速度惩罚量级约 1/2² 0.25加速度允许±3m/s² → 加速度惩罚量级约 1/3² ≈ 0.11jerk允许±2m/s³ → 控制增量惩罚量级约 1/2² 0.25。按这个逻辑初值可以取 Q diag(0.25, 0.25, 0.11)R 0.25。这个初值不是玄学它表达的是“我打算让距离偏差2米、速度偏差2m/s、加速度3m/s²、jerk 2m/s³各自产生相同程度的代价”。后面再根据仿真结果微调工作量比从零乱试小很多。4.3 用控制增量而不是控制量来惩罚jerk有个很容易踩的误区想把加速度变化率控制住于是直接惩罚 a_h 的变化量其实等价于惩罚 jerk但实现方式有差别。如果输入定义为加速度本身 u a_h那么代价函数里只能惩罚 a_h 的绝对大小对于 jerk 的控制只能靠间接的“权重分配”去平衡不够直接。如果把输入定义为控制增量 Δu那么 Δu 乘以控制周期 T_s 就是 jerk惩罚 Δu² 就是惩罚 jerk²物理含义一目了然。我个人的习惯是输入用 Δu 来定义代价函数里同时保留 a_h² 和 Δu² 两项。前者限制瞬时减速度太大后者限制变化过程太猛。前车急刹车时MPC会输出一个很大的负加速度但因为有 Δu 约束它会提前若干步开始建压而不是等到很近了才一脚刹死——这就是“预测”带来的优势。4.4 权重调参顺序先紧后松安全优先权重调节的经验我总结成一句“先紧后松”。第一步先把距离误差的权重加大让系统在仿真里绝对不会碰撞哪怕加速度大、jerk大都没关系先把安全底线守住。第二步逐步加大车速误差权重让跟车性能跟上去这时候系统开始有点抖是正常的不要急着调。第三步再加加速度和控制增量权重慢慢把舒适性找回来。最后回头微调看各个工况下的最大距离误差、最大jerk是否满足指标要求。切忌从一开始就追求舒适性把加速度权重拉满那样系统会“软绵绵”的遇到前车急刹距离误差会飙得很大。安全永远第一舒适是在安全基础上争取来的。5. 约束、滚动求解与时域选择QP问题如何在一个控制周期内跑完5.1 约束建模哪些该设为硬约束哪些必须做成软的我说的约束分为硬约束和软约束两类。硬约束一般包括加速度上下限a_min ≤ a_h(k) ≤ a_max受限于发动机/制动系统能力和路面附着条件车速非负v_h(k) ≥ 0车不能倒着走控制增量边界Δu_min ≤ Δu(k) ≤ Δu_max对应执行器变化率的物理限制。有一个约束我强烈建议做成软约束相对距离 d ≥ d_min。如果是硬约束一旦因为感知噪声、前车异常急刹导致状态超出边界QP问题直接不可行优化器会报错或者输出乱跳。软约束的做法是构造一个松弛变量在代价函数里加一项大的惩罚让系统“尽量不违反但万一违反了也能继续算下去”。这个思路在工程上极其重要很多时候能不能在极限工况下优雅降级就看这一处。5.2 一个控制周期内发生了什么给大家梳理一下MPC每个周期的标准流程这也是嵌入式代码里main loop的骨架从总线上读取本车速度、加速度、前车相对距离/相对速度用前车加速度估计模块得到 a_p 的估计值更新当前状态向量 x(k)把预测模型矩阵 A、B、约束矩阵和当前状态代入构造出一个二次规划QP问题调用求解器解出整个预测时域内的最优控制序列 Δu*(k), Δu*(k1), …, Δu*(kN_p-1)只取第一个值 Δu*(k)与当前加速度叠加得到期望加速度发给执行层等到下一个周期开始回到步骤1。这里“只取第一个值、下一周期重新算”就是滚动优化的含义。为什么不全执行完序列因为模型有误差、前车行为会变第一时刻的控制量是基于当前最新状态算出来的后面几步的假设已经过时了不如每个周期都重新决策。5.3 QP问题怎么构造、怎么写进求解器下面我用一个示意性Python代码片段展示一下离线部分的构造逻辑这种写法也和MATLAB里的YALMIP脚本相似。实际C工程里通常会在初始化阶段就把矩阵稀疏结构弄好运行时不重复分配内存。import osqp import numpy as np from scipy import sparse # 状态量 [e_d, e_v, a_h]控制增量 du采样周期 Ts Ts 0.1 Np 20 # 预测时域 Nu 5 # 控制时域 Q np.diag([0.25, 0.25, 0.11]) R np.array([[0.25]]) # 状态矩阵与输入矩阵 Ad np.array([[1.0, Ts, -Ts], [0.0, 1.0, -Ts], [0.0, 0.0, 1.0]]) Bd np.array([[-ts_gap * Ts - 0.5 * Ts*Ts], [-Ts], [1.0]]) # 组装预测矩阵A_big、B_big这里省略批量构建的细节 # 最终QP目标函数0.5 * x P x q x约束 lb Ax ub P sparse.csc_matrix(...) A sparse.csc_matrix(...) prob osqp.OSQP() prob.setup(PP, qq, AA, llb, uub, verboseFalse)这只是用来展示数据流的示意代码真正实现时组装预测矩阵那一步要细心。初学者可能觉得这部分很绕但一旦用矩阵批量方式把未来Np步的状态铺开后面处理代价累加和约束就统一了。5.4 预测时域和控制时域怎么选预测时域 N_p 决定“看得多远”。看得太短前方风险发现不了比如300毫秒后才能刹车的情况N_p10步每步100毫秒也就是1秒可能不够用看得太长计算量暴涨而且远期预测本来就不可靠。我的经验是N_p 乘以采样时间至少要覆盖一个中等强度的减速场景从当前车速刹到目标车速或停止大概需要2到3秒所以 N_p×T_s 建议在2秒以上。常用组合是 T_s0.1s、N_p20或者 T_s0.05s、N_p30~40。控制时域 N_u 可以比 N_p 小因为大多数情况下你不需要在未来20步里都安排不同的控制量前面几部决定主要趋势后面保持恒定即可。典型取值 N_u5~10能显著减少变量数降低求解时间。求解器选型也是个实际决策。Osqp是开源里应用很广的适合原型验证和嵌入式部署qpOASES适合中小规模QP且支持热启动很多ECU项目能用姿态激进一点的做法是用CVXGEN或FORCES Pro根据问题结构自动生成C代码速度和内存可控性最好但要花钱。入门期用OSQP完全够了性能也足够好。6. 三个典型仿真场景与参数整定记录6.1 场景设计CACC判断的试金石仿真阶段只做匀速跟车没什么意义真正能暴露问题的是边界场景。我常用的三个场景如下场景初始状态前车行为考核指标急减速主车60 km/h前车60 km/h间距40m前车以最大减速度5 m/s²刹停最小距离 安全阈值无碰撞停车舒适旁车切入主车80 km/h前车80 km/h间距60m侧向车辆以5 m/s切入本车道间距骤减到25m快速建立安全距离速度调整不过冲周期性波动主车跟随前车以80 km/h巡航前车速度按正弦波动±10 km/h周期5s跟车误差小jerk和加速度均值低这三个场景分别考验MPC的极限安全、快速响应、稳态跟车性能一套权重能同时过这三个场景才有资格往实车走。6.2 急减速场景的仿真结果分析在急减速场景里重点看两个东西最小距离和jerk曲线。如果权重设置合理MPC应该在前车开始减速的瞬间就输出负加速度距离曲线不会出现“冲到很近了才开始刹”的现象最小距离通常会控制在安全阈值的1.5到2倍左右给感知误差和执行延迟留了余量。jerk曲线在急减速过程里会出现一个负向尖峰这是无法避免的——前车突然5m/s²减速主车必须尽快打出减速度。但如果尖峰超过乘员舒适阈值一般8到10 m/s³说明 Δu 权重设得太低或者预测时域太短MPC太晚开始响应。把 Nup 从15加到25或者把R矩阵权重提高一倍问题往往能明显缓解。6.3 切入场景与目标切换的影响切入场景最容易出的问题不在MPC本身而在目标切换的一瞬间。前车还没切入时控制器跟的是车道前方远处的车距离远、相对速度接近0控制量很小。切入发生后系统识别到新目标相对距离从60m一下变成25m距离误差瞬间变成很大的正数控制器会猛踩一脚刹车。MPC层面的处理方法是把距离误差项做一个“渐变限幅”——目标切换后的前0.5到1秒内距离误差按斜坡过渡到真实值而不是直接跳变。这相当于人为制造了一个缓冲让控制器来得及软着陆。有些同学在仿真里不模拟目标切换只在单一目标下测MPC实车一跑就露馅就是没意识到感知层的瞬态对控制器冲击有多大。6.4 周期性波动场景与稳态跟车性能稳态跟车性能的好坏主要看速度误差和jerk的累积值。速度跟随做得好的MPC加速度曲线非常平滑几乎看不出有明显的周期性振荡。如果出现“每过一拍就抖一下”的持续振荡多数原因是采样周期太长或者预测时域太短系统对未来的判断不够充分还有可能是代价函数里车速误差权重大大把不必要的过激操作也当作最优输出了。这种场景适合做权重敏感性分析固定其它参数把某个权重从0.1倍扫到10倍记录最大距离误差、最大jerk、平均能耗三张曲线就能非常直观地看到每个权重的影响边界。我在项目里经常用这种扫描图来做标定报告比口头说“我调了一下权重”靠谱得多。7. 从仿真到实车模型失配、感知延迟与仲裁逻辑里的真实坑7.1 执行器延迟必须建模不然整车会“点头哈腰”仿真环境里我给MPC的加速度是理想执行整车立即响应实车上发动机、电机、ESP各自有响应延迟。第一次做实车接入时如果预测模型里没有执行器延迟最典型的现象就是“刹车过冲”前车减速MPC估计刹车已经生效预测距离迅速回升于是停止增加制动力实际制动力却还在爬升等真正生效时已经刹多了乘车人前后晃一下。解决办法是在预测模型里串联一个一阶惯性环节把期望加速度 a_des 到实际加速度 a_act 的延迟特性近似为a_act(k1) (1 - Ts/τ) × a_act(k) (Ts/τ) × a_des(k)τ 取执行器综合响应时间发动机工况大概0.2到0.35秒电机工况0.05到0.1秒混合动力要按当前动力源自动切换。把这个环节加进去之后MPC相当于“知道自己发出的指令会晚半拍到”提前量自然就补回来了。7.2 感知延迟和状态估计噪声比模型误差更致命雷达目标输出看起来是一串很干净的距离和速度实际上它本身带着延迟和噪声特别是大曲率弯道或雨雪天气。做控制器不能直接拿原始量测值喂给MPC前端必须做状态估计。我用得比较多的是扩展卡尔曼滤波状态里把相对距离、相对速度、前车加速度一起估出来输出的前车加速度估计值比直接差分平滑得多。但滤波也有代价相位延迟。前车真正开始减速的时刻滤波输出会晚几十毫秒。为了补偿有些方案在MPC的时间基准里加一个预测提前量或者在目标切换后的前几个周期临时调高距离误差权重。我第一次用卡尔曼输出喂MPC时因为相位延迟和MPC自身的预测叠加系统出现了极限工况下的响应慢半拍问题后来发现把前车加速度估计的动力学模型改成一阶加速度模型才明显好转。7.3 计算超时与安全降级不给求解器留失控的余地实车ECU的算力有限OSQP求解时间可能跑满几个毫秒到几十毫秒而控制周期只有40到100毫秒。最怕的是某个工况下因为约束冲突或数值问题求解时间暴涨超过控制周期。任何MPC量产项目都必须设计“超时保护”在一个控制周期内解不出来就输出上一周期的控制量或者直接切换到预设的安全跟车策略比如按最大舒适减速度刹车。仿真里要专门做一个压力测试把所有约束塞满、预测时域拉满、甚至故意注入噪声扰动看求解器最差情况下的耗时是多少。只测平均耗时没有意义分布式控制系统要求的是最差情况满足实时上限。我在一个项目里遇到过稀疏矩阵某几行填充造成求解时间波动十倍的情况最后靠预处理矩阵结构和启用热启动才压下来。7.4 驾驶员仲裁ACC只是建议者不是决策者边界还要想清楚什么时候ACC该让权。驾驶员踩油门ACC要立即退出或暂停让驾驶员接管驾驶员踩刹车所有加速度请求清零转向灯亮起且有变道意图ACC可以保持但目标切换逻辑要谨慎。这些仲裁逻辑看似和MPC无关却是实车系统里最容易出事故的环节。仲裁层建议放在MPC外面它会根据驾驶员操作和整车状态决定ACC的目标状态。一个安全的设计是优先级从高到低为“驾驶员直接操作 安全兜底逻辑 ACC加速度请求”。MPC的输出必须经过仲裁和安全监控模块过滤之后才能送到执行层。7.5 实车标定两个小技巧第一多记录数据和仿真对不上。实车第一次跑不要急着调权重先把各个工况下的传感器数据、状态估计结果、MPC代价函数各项的实时数值都录下来回放时逐项看是哪一项在主导控制量。很多时候你会发现真正的问题是感知层目标切换异常而不是MPC控制调得不好。第二就地验证“紧急干预”逻辑。实车测试急刹之前一定先在仿真里跑极端工况再用底盘测功机或封闭场地测试。任何一次实车急刹测试都要有独立的紧急制动功能作为兜底绝不能把ACC输出的期望加速度当成唯一保底手段。最后总结一下我自己的感受MPC做ACC公式很容易推导仿真也容易跑通真正的难点在于你什么时候相信模型、什么时候相信量测、什么时候敢于放弃约束。我自己的体会是MPC不是把一堆矩阵丢给求解器就完事它更像一个“决策框架”你的标定功夫决定了它在舒适和安全之间的天平偏向哪边。见过不少同行在仿真里把预测时域拉到三四十步、权重调到看似完美一上实车就露馅原因往往就是没有尊重执行器延迟和感知噪声这两个“物理现实”。如果你刚开始做这个方向建议先把仿真环境下的参数扫描做扎实把每个权重的影响边界摸清楚再考虑实车的事情这条路虽然慢但稳妥。
返回列表