ARTICLE DETAIL

资讯详情

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

车辆纵向控制必知:油门刹车标定表的制作与工程应用

车辆纵向控制必知:油门刹车标定表的制作与工程应用 做纵向控制最绕不开的一张表就是油门刹车标定表。不管你是刚把Carsim跑通的新手还是已经调试过一段时间PID的老手只要你想让车辆在仿真里稳稳地跟住目标车速迟早要和这张表打交道。这篇内容就是来把它彻底讲清楚这张表到底是什么、要怎么做出来、怎么用到控制策略里以及我在实际踩坑中总结的注意事项。先把结论放前面油门刹车标定表本质上是车辆纵向动力学模型的“逆模型”。它回答了一个看似简单的问题——在某个车速下想要达到某个加速度我该踩多少油门、或者踩多少刹车。搞清楚这件事你的纵向控制就从“瞎调PID”变成了“有依据地调PID”这也是它能作为控制算法系列单独开一篇的原因。1. 车辆纵向控制的核心逻辑1.1 纵向控制到底在控什么车辆纵向控制说白了就是控制车速或者控制跟车距离。在自适应巡航、自动紧急制动、自动驾驶的横纵向解耦架构里纵向控制负责生成并执行期望的纵向加速度。整个链条大概是这样的上层决策模块给出目标车速或目标车距中间的速度规划模块把它转化为一条平滑的速度曲线也就是每个时刻的目标速度然后底层纵向控制器负责让实际车速去跟踪这条目标速度曲线。这里面的核心问题只有一个如何快速且平稳地让车辆达到目标车速。注意“快速且平稳”这几个字它们是互相矛盾的。调得太猛车内的乘客前后晃动舒适性很差调得太慢跟不上前车安全性和道路通行效率又打折扣。所以纵向控制从来不是一个单纯的PID参数整定问题而是一个“车辆动力学模型 逆模型前馈 反馈修正”的综合设计问题。这就要引入一个关键概念逆模型前馈。简单说就是根据当前状态和目标状态直接算出大概要踩多少油门或刹车而后面的PID只需要负责修正误差即可。如果不做前馈只靠PID硬调结果通常是要么响应慢要么超调大很难两全。1.2 为什么需要油门刹车标定表有人可能会问车辆动力学模型不是有公式吗直接用公式算不行吗理论公式当然存在比如根据发动机外特性曲线、变速器传动比、主减速比、轮胎半径、风阻滚动阻力等参数可以推导出油门开度和加速度的关系。但问题在于这个公式在工程实际中用起来非常痛苦。因为你需要精确知道发动机MAP、液力变矩器特性、变速器换挡逻辑、轮胎滑移特性、坡度、风阻系数等等一大堆参数而且这些参数会随着温度、胎压、载荷、路面附着条件的变化而发生偏移。就算你在Simulink里搭了一套复杂的参数化模型标定和验证的成本也极高。Carsim里面解决这个问题的方式非常“工程化”与其去逆向推导一套精确的机理模型不如直接在仿真环境里做“实验标定”。在不同的车速下给车辆一个固定的油门开度或者刹车压力等车辆达到稳态记录下此时的实际加速度这样就得到了一张油门/刹车开度和加速度的关系表。这样做有两个最大的好处第一它绕开了对内部模型参数的精确辨识。我不需要知道发动机的具体MAP也不需要知道变速器内部怎么换挡我只要看输入和输出之间的关系就够了。第二它天然覆盖了非线性。Carsim再去掉“模型复杂”车辆在高速区油门响应变差、低速区扭矩放大、换挡瞬间加速度突变等等这些现象都会自动体现在标定数据里不需要你手动建模。这张标定表一旦做好就可以作为前馈查表用。纵向控制器在收到目标加速度后先查表得到基础的油门或刹车踏板开度然后PID再根据当前车速和目标车速的误差进行小幅度修正。这样PID就只需要处理扰动和模型误差了负担小了很多控制品质也会有本质提升。2. 标定前的Carsim与Simulink联合仿真准备2.1 车辆模型的选择与参数设置制作标定表的第一步是先在Carsim里选好你要用的车辆模型。Carsim自带的模型库里有轿车、SUV、卡车、跑车等多种车型它们的动力性能差异很大标定出来的表自然也不同。所以第一原则是标定表必须对应具体的车辆模型换了车型就要重新标定。进入Carsim主界面后建议从“Vehicle: sedan”之类的基础轿车模型开始因为它的参数相对温和不会出现跑车那种油门踏板稍微一踩就车身乱窜的现象。如果是做自动驾驶相关的纵向控制研究一般也不需要修改车辆本身的动力参数保持默认即可。但有几个地方需要确认一下变速器类型是自动挡还是手动挡。如果是自动挡注意换挡逻辑是否启用因为换挡瞬间车辆加速度会有突变这个会影响标定数据的平滑性。路面摩擦系数默认一般是0.85做基础标定用默认值就行。如果你后续要在低附着路面做测试建议单独再做一张低附着系数对应的表。初始速度在标定之前要把车辆初始速度设成你想要覆盖工况的起始值否则数据采集的时候车辆可能跑到你不需要的速度区间去。此外还要注意Carsim里制动和油门信号的表达方式。Carsim的油门输入通常是0到1之间的无量纲值对应踏板开度百分比制动输入是制动主缸压力单位一般是MPa范围在0到某个最大值比如5MPa之间。这个无量纲开度和压力直接对应你后面查表的输入输出所以不要弄混。2.2 联合仿真接口配置标定数据要从Carsim里导出来就必须先完成Carsim和Simulink的联合仿真配置。这个环节卡住了很多人其实步骤并不复杂。首先在Carsim的主界面找到“Models”菜单点击“Send to Simulink”按钮或者直接在“Run”那一栏选择Simulink运行模式。这时候Carsim会生成一个Simulink模型里面自动包含了Carsim的S-Function模块这个模块就是两者通信的桥梁。接着要解决信号接口的问题。你需要导入哪些信号呢做纵向控制标定最少需要3类信号车速用于记录车速和油门/刹车的对应关系一般用Vx纵向车速单位是km/h或m/s都可以但建议统一用m/s这样后面算加速度时不用再做单位换算。加速度用于记录稳态加速度Carsim里对应的是Ax纵向加速度或者你自己通过车速求导来得到。油门/刹车指令这本身就是你输入给Carsim的信号在Simulink里做一个记录模块直接记录下来即可。需要注意的是Carsim输出的Ax是车身坐标系下的纵向加速度包含了坡度分量。如果你的标定工况是在平直路面上做的直接用它没有问题。但如果在坡道上做就要先把坡度信号也导出来后面处理数据时再做补偿否则标定结果会有很大的系统偏差。信号列表配置好之后在Simulink里加载Carsim生成的模型文件双击S-Function模块就能看到信号列表确认你导入的Vx、Ax、油门和制动信号都在里面了。2.3 数据采集稳态工况多档位标定联合仿真环境搭好之后就可以开始进行数据采集了。这里需要有一个清晰的概念我们做的是稳态标定所以核心思路是让车辆“稳定在某个状态下”然后记录状态参数。对于油门标定表来说就是让车辆以某个恒定油门开度稳定行驶等待车速不再变化即加速度为0记录此时的车速和油门开度。但这样只能得到“某车速下需要多少油门保持匀速”还不足以覆盖“某个车速下想要加速到目标加速度需要多少油门”的完整二维表。更完整的做法是在不同的初始车速下施加不同的油门开度记录车辆在该工况下的稳态加速度可能不是0。把数据整理成“当前车速、期望加速度 → 油门开度”的二维关系表。听起来有点抽象我给你一个具体的采集序列模板首先在Carsim里把车辆初始速度分别设为0、10、20、30、40、50、60、70、80、90、100、110、120 km/h。在每个初始速度下让车辆先稳定巡航一段时间然后给一个阶跃的油门开度分别是10%、20%、30%、40%、50%、60%、70%、80%、90%、100%。记录每个工况下车辆达到的稳态加速度。注意给油门后需要等待一段时间等车辆加速度稳定下来再记录而不是刚踢一脚油门就去记数据。对于制动同样操作在某个初始车速下给一个阶跃的制动主缸压力比如0.5、1、1.5、2、2.5、3、4MPa记录稳态减速度。这样做会得到大量的数据点。虽然看起来有点繁琐但它的好处是能够得到一张覆盖整个目标车速和加速度区间的完整数据表后面做查表插值时边界数据才不会出现空洞。3. 油门刹车标定表的制作过程3.1 标定工况设计与数据采集理论讲完了现在说说实操中的标定工况设计。我把这部分单独拿出来是因为数据采集的步骤直接影响后续表格质量但很多人在这一步容易出问题。先说我的推荐流程——速度扫描法。这个方法的核心思路是让车辆在一个递减或递增的速度区间内跑期间保持某个固定油门开度然后把车速和加速度连续记录下来。具体操作如下在Carsim里设置车辆初始速度为你要覆盖的最高车速比如120km/h在Simulink里给Carsim输入一个固定油门开度比如30%同时保持制动信号为0运行仿真车辆会在30%油门开度下逐渐加速但由于发动机功率不足以维持在120km/h匀速车辆会在某个速度点达到平衡之后加速度变为0持续运行到车辆完全稳定记录整个过程中的车速和加速度曲线切换油门开度到下一个值重复上面的步骤。为什么要用这个方法而不是直接给定油门看稳态速度因为在Carsim中如果我们用固定油门开度去跑车辆从静止加速到稳定车速的完整过程中每个速度点都对应了一个加速度值。这样一次运行就能采集到一组覆盖从低速到高速的“速度-加速度-油门开度”数据效率非常高。用同样的思路制动标定也是类似的。在某个初始速度下给一个固定的制动主缸压力然后记录车速从初始速度一直减速到0的完整过程。这个过程中每个速度点的减速度就是该制动压力下的制动能力数据。为了覆盖不同的油门开度和制动压力建议至少各做10个油门开度、8个制动压力的工况。例如油门开度从0.1到1.0每间隔0.1一个工况制动压力从0.5MPa到4.0MPa每间隔0.5MPa一个工况。这样下来一共要做18组左右的仿真每组的时长大约在10~30秒之间整个采集过程不会超过30分钟相比在实车上做标定效率已经高太多了。3.2 数据处理与二维查表构建一次仿真跑下来你得到的是三条时间序列时间、车速、加速度。这不是一张表而是一堆散点数据。所以接下来的工作是把这些散点数据整理成一张可以查的二维表。处理的第一步是数据对齐和筛选。由于车速是连续变化的不同的油门开度工况下同一车速点可能被覆盖多次。我们需要把所有工况的数据放在同一个坐标系下横轴是车速纵轴是油门开度对应值是加速度。这里有一个常见坑要提醒一下直接用原始数据插值很容易出错。因为Carsim输出的加速度信号噪声比较大尤其在换挡瞬间会有一个明显的尖峰抖动如果你直接用这个带有噪声的数据去构建查表后面控制的时候会出现油门跳变。我的做法是先对加速度信号做一次滤波处理比如用一阶低通滤波器时间常数选0.1秒左右。这个数据的平滑程度直接影响到最终标定表的质量不要省这一步。第二步是离散化插值。先定义你要做表用的速度网格比如从0到120km/h每5km/h一个间隔共25个点。然后再定义油门开度网格比如0到100%每5%一个间隔共21个点。这样就得到了一个25×21的网格接下来要用插值法把每个网格点的加速度值填进去。插值的方法有很多种建议用Cubic Hermite插值或者PCHIP插值。不要用普通的三次样条因为三次样条在数据边缘容易出现过冲导致标定表在某些区域出现不合理的加速度值。PCHIP不会过冲而且保证了单调性做车辆标定表非常合适。最终你会得到一张“车速-油门开度-加速度”的三列数据表。但光有油门方向的表还不够还需要一张制动方向的表它的结构完全一样车速-制动压力-减速度。到这里两张表就成型了。把它们保存下来可以是Excel表也可以是.mat文件后面在Simulink里通过Lookup Table模块加载即可。3.3 标定表的Simulink实现数据表做好之后要在Simulink的控制模型里把它用起来。这里推荐两种实现方式分别适用于不同使用场景。第一种是使用Simulink自带的2-D Lookup Table模块。这个模块专门用来做二维查表插值输入两个查询值一般是车速和目标加速度输出一个对应的油门开度或制动力。配置的时候把表格数据按照“断点1车速”、“断点2目标加速度”、“表格数据油门开度”的方式填入。使用这个模块时有一个重要参数需要设置外插值处理方式。默认情况下它只支持内插如果查询点落在数据范围之外会返回边界值也就是常说的Clamp这个在控制应用中其实更安全。你也可以选“线性外插”让数据向外延伸但我不建议这么做因为超出标定范围的数据往往是不可信的。第二种方式是直接用MATLAB Function模块在里面用interp2或者griddedInterpolant写查表逻辑。这种方式的优势在于灵活你在里面可以顺便做一些保护逻辑比如加速度上限、油门下限等。缺点是没有封装好的Lookup Table模块那么直观。我的建议是在控制策略原型开发阶段用Lookup Table模块后期如果要部署到实车再改成代码生成的实现方式。至于查表的具体接入方式我在下一节讲控制策略时会一并说清楚。4. 基于标定表的纵向控制策略4.1 前馈PID的复合控制标定表做好之后控制策略的设计就变得很有章法了。最经典的方案是前馈PID的复合控制。前馈部分负责“大头”也就是根据期望加速度反查油门或刹车开度PID部分负责“小头”也就是修正由模型误差、外部扰动和控制死区带来的速度偏差。先看前馈部分怎么实现。当上层规划模块给出一个期望加速度a_des时控制器需要判断这个加速度需要的是油门还是制动。判断逻辑很简单如果a_des大于某个很小的正阈值比如0就用油门如果a_des小于某个负阈值比如-0.5m/s^2就用制动中间区域考虑用滑行不踩油门不踩刹车或者再用一个较小的油门维持速度。油门前馈的查表逻辑为throttle_ff lookup(a_des, Vx, table_engine);其中table_engine就是我们做好的“期望加速度-车速-油门开度”表。制动前馈类似brake_ff lookup(a_des, Vx, table_brake);前馈输出直接给到车辆模型之前还需要经过一个平滑处理模块防止查表在切换瞬间产生跳变。最简单的做法是加一个一阶低通滤波器或者用速率限制器。再看PID反馈部分。PID的输入是目标车速与实际车速的误差输出是一个加速度修正量这个修正量再加到期望加速度上最后才去查前馈表。这样一来PID的输出不是直接控制油门或者制动而是修正期望加速度这样整个环路的物理意义非常清晰参数也容易整定。4.2 油门刹车切换逻辑与平滑处理油门和刹车的切换是纵向控制里我最想提醒你注意的地方它的处理好坏直接决定了整车平顺性。如果你直接把前馈表输出的油门和制动同时接到车辆上那么在两表交接的区域也就是a_des接近0的时候会出现油门和制动同时作用甚至反复交替的情况。比如上一秒因为一点小误差前馈输出了一个5%的油门下一秒误差变化了又输出一个0.1MPa的制动压力。这种高频切换在仿真里可能只是看着不舒服但如果是实车调试这就等于在磨制动盘加蹿动十分糟糕。解决办法是在油门和制动之间设置一个死区。我常用的做法是在a_des的阈值上做判断只有当a_des大于0.5m/s^2以上才允许直接输出正油门只有当a_des小于-0.5m/s^2以下才允许输出制动压力中间区域用滑行处理。这个0.5m/s^2的死区值可以根据具体车辆的滑行减速度水平做调整一般取0.3~0.6都合理。死区的实现方法是在前馈输出之后加一个逻辑判断if a_des deadzone_positive throttle throttle_ff; brake 0; elseif a_des deadzone_negative throttle 0; brake brake_ff; else throttle 0; brake 0; end此外在切换瞬间还要对输出做一次“快慢分离”的限幅处理。油门变化率可以快一些制动压力变化率则要更慢一些这符合实际车辆的物理特性。4.3 参数整定与仿真验证控制器的参数整定我的经验是分三步走每一步都有明确的判定标准。第一步先只加前馈不加PID反馈。运行一个简单的匀速巡航工况比如车辆从80km/h起步目标车速设为100km/h看车辆能不能大致跟上目标速度。如果前馈标定表做得够准这时候车速应该已经能接近目标值但会存在一个稳态误差可能偏差个2~3km/h。这个误差的大小就是前馈精度的表征。第二步加上P环节把稳态误差消除掉。从小到大调节比例系数Kp观察车速响应曲线。当Kp合适的时候车速应该能稳在目标值±0.3km/h以内且没有明显的持续振荡。如果出现等幅振荡说明Kp调得过大了回退一些。第三步加I和D环节。积分环节消除在连续坡道或风阻变化时的累计误差微分环节则有助于减小超调。但在车辆纵向控制中D环节对噪声非常敏感建议要么不用要么配合滤波使用。整定完成后用CC定速巡航和ACC自适应巡航两种典型工况做验证。CC工况看的是定速巡航的稳态精度和抗风扰动能力ACC工况看的是跟随前车加减速的响应时间和稳态间距误差。把这两类工况跑通了你的纵向控制器就算基本成型了。5. 常见问题与排查技巧5.1 标定数据发散或震荡做标定表最常遇到的问题就是仿真过程中车辆速度发散或者速度曲线出现持续振荡。这个问题十有八九是数据采样和插值环节造成的。先看数据本身你在采集加速度信号时有没有做滤波如果没做滤波直接用原始信号做插值那么标定表里每一个网格点的加速度值都会带着一个随机噪声查表输出就会频繁跳动进而导致控制命令震荡。再看插值方法如果你用的是一般的三次样条插值在数据稀疏的位置特别容易出现过冲。比如60km/h这个点附近数据点比较稀少三次样条插值出来一个比周围都高的加速度值控制器查表输出就偏大了车辆实际跑起来就会在这个速度区间反复加速减速。解决办法也很直接一是滤波二是换成PCHIP插值三是在插值之前对异常点做去野值处理。5.2 车速跳变与刹车顿挫车速跳变通常发生在油门和制动切换边界。当你从油门控制过渡到制动控制时如果两边的标定数据在切换点附近不连续就会导致前馈输出跳变。举一个我在调试中实际遇到的情况10%油门在40km/h时标定加速度是0.2m/s^2制动压力0.5MPa在40km/h时标定的减速度是1.2m/s^2这两个数值之间跨度很大。如果切换阈值设得比较小期望加速度一个微小变化就会让控制器从10%油门猛地跳到0.5MPa制动车速曲线瞬时凹下去一大块。处理这个问题需要做两件事把切换阈值调大留出足够的死区对前馈表的输出做限幅和速率限制油门变化率不要超过20%/s制动压力变化率不要超过3MPa/s让切换过程变成“渐变”而不是突变。5.3 工况扩展坡度、载荷与换挡修正很多人在平直路面做标定表结果一放到坡道上表就不好用了。原因很简单车辆的纵向动力学不只是由油门和制动决定还受到重力分量、滚动阻力和风阻的影响。坡度一变保持同样加速度所需的油门就变了。如果你希望标定表在坡道上也能用有两个思路一是做多工况标定表。在0度、3度、6度、9度等不同坡度下分别做一套标定表控制时根据当前坡度查对应的表。这种做法的优点是精度高缺点是标定工作量成倍增加。二是通过坡度前馈补偿来修正。具体思路是标定表仍然用平路面数据但当检测到坡度时额外加一个与坡度成正比的油门或制动偏置用来抵消重力沿坡道的分量。这个偏置量可以用下面这个简单的模型来算grade_offset m * g * sin(alpha) / (vehicle_drive_force_per_throttle);其中m是车辆质量alpha是坡度角。车辆制动方向对应的补偿也可以用类似方式算。载荷变化同理当车上乘客或货物变多时车辆质量增大了同样的油门开度下加速度会变小。如果标定表是按空载做的满载时就会出现前馈不足PID只好加大输出控制响应变慢。这时候可以通过不同载荷下的标定数据做修正或者干脆把标定表做成“按质量归一化”的形式。换挡问题则比较特殊。Carsim的自动变速器在换挡瞬间会切断动力加速度会先掉后升形成一个凹坑。如果你的标定表按稳态数据来做控制指令在换挡瞬间就不匹配实际车辆状态了。针对这个问题的处理方式通常是在控制策略中添加一个换挡检测信号检测到换挡时短暂暂停前馈计算或者把前馈切换到换挡前的数值避免出现大跳变。这些工况扩展内容不一定每个项目都会用到但如果你做的是面向工程落地的纵向控制这些细节迟早会找上门。提前在标定表设计阶段就想好这些问题后面调试可以省掉大量返工时间。最后再分享一个小技巧标定表做出来之后先别急着放进控制器里跑。你可以在Simulink里做一个简单的模型验证——给固定的目标加速度序列查标定表输出油门或制动再回放到Carsim里看实际响应。如果闭环仿真下来实际加速度和目标加速度的误差能控制在0.1m/s^2以内这张表就算合格了后面再接PID做闭环。这个验证步骤花不了10分钟但能帮你精准定位问题是出在标定表还是出在控制策略上调试效率会高非常多。
返回列表