二阶自抗扰控制在车辆轨迹跟踪中的设计与参数整定实战

发布时间:2026/10/19 9:46:59
二阶自抗扰控制在车辆轨迹跟踪中的设计与参数整定实战 先说点实际的。做车辆轨迹跟踪控制这几年最让人头疼的往往不是算法推导本身而是你辛辛苦苦基于理想模型调好的控制器一上车就被现实狠狠教育。轮胎侧偏刚度不是常数整车质量随载重变路面附着系数说变就变再来一阵侧向风横向误差直接肉眼可见地偏出去。传统PID在这种场景下需要反复重新整定鲁棒控制的建模工作量又不小这时候就需要一种既能保持结构简单又能把内部不确定性和外部扰动一并处理掉的方法——二阶自抗扰控制ADRC就是冲着这个痛点来的。这篇文章我会从扰动来源分析、扩张状态观测器ESO原理、二阶ADRC的完整设计过程到参数整定和实测/仿真效果验证一步步拆开讲清楚。准备接手轨迹跟踪项目、正在被参数鲁棒性折磨或者单纯想了解ADRC到底怎么落地的人都可以参考这份经验。1. 车辆轨迹跟踪中的扰动从哪来——先搞清楚对手是谁很多人以为ADRC就是观测扰动然后补偿掉听起来很简单但实际做的时候第一步就卡住了你连要对抗的扰动长什么样都没梳理清楚ESO参数自然也就无从调起。所以先别急着写代码我们把车辆轨迹跟踪里的不确定性和外界干扰这两类对手彻底盘一盘。1.1 模型不确定性你以为的模型和真实车辆差多少车辆动力学模型在教科书里通常长得很规整线性二自由度模型就是前后轮侧偏刚度固定、质量固定、转动惯量固定。但实际工程中这套参数从车辆下线那一刻起就开始偏离。最典型的是轮胎侧偏刚度。线性区只在侧偏角比较小的时候成立一旦车辆进入极限工况侧偏力就进入饱和区同一把方向盘打下去实际横摆响应和模型预测的差距会越来越大。另一个常见来源是整车质量。我做过的项目里空载和满载状态下整车质量能差出百分之二三十对应的惯性参数和前后轴载荷分配全部变了。如果你的控制器是基于标称质量调出来的满载跑高速时方向盘手感、横摆响应、侧倾趋势都会明显不一样。还有一类是结构性的未建模动态比如转向执行机构的延迟和阻尼、悬架几何带来的侧倾转向效应、轮胎回正力矩的非线性。这些东西你要是全建模模型阶数会膨胀到完全没法工程化但不建模它们又会实实在在作用在系统上成为控制器要面对的内部扰动。1.2 外界干扰路面、风、坡度如何侵入系统外部扰动比模型不确定性更讨厌的地方在于你根本测不准它而且它随时会突变。侧向风是最典型的例子。高速公路上超一辆大货车、通过隧道出口的一瞬间侧向风力矩会突然加在车身上别指望前馈能提前知道这个力矩有多大。路面附着系数突变则是另一种噩梦——同样一个转向角输入高附路面和低附路面上产生的横摆力矩可能差出好几倍。如果你在干燥柏油路上把控制器调得很机灵一到雨天或者洒水路段就容易出现控制动作过猛的情况。坡度则是纵向控制里绕不开的干扰。车辆在坡道上受重力分量影响如果不加以补偿定速巡航的跟踪误差会一直存在。严格来说坡道可以被建模出来但坡度信息很多时候并不准确而且动态坡度变化比如连续起伏路况会使精确建模变得没有性价比。把这些干扰集中起来看它们有一个共同特点作用形式各异但最终都会叠加到系统动态方程里成为推动状态偏离的那只看不见的手。这也引出了ADRC的应对逻辑——我不管你是参数偏差、路况突变还是阵风干扰只要你能体现在系统输入输出关系上我就用扩张状态观测器把你当作一个总扰动实时估计出来。下面这张表是我整理项目时惯用的分类方式每次调试新平台都会先对着它过一遍确认哪些扰动是量级不可忽略的扰动类别具体来源作用通道典型影响模型不确定性轮胎非线性、质量/惯量变化、执行器延迟系统内部参数偏差动态响应偏离设计值外部干扰侧风、路面附着突变、坡度直接力/力矩输入稳态误差、轨迹偏移未建模动态悬架几何效应、回正力矩非线性内部动态耦合高频抖动、相位滞后测量噪声定位信号、传感器噪声反馈回路控制量抖动、观测器发散有了这张表后续设计ESO和整定参数时你就能针对性地设置测试工况而不是漫无目的地乱试。2. ADRC为什么适合干这件事扩张状态观测器的核心思想在接触ADRC之前我一度倾向于用鲁棒H∞控制或者滑模控制来处理这些扰动。前者虽然理论上能把不确定性bound住但加权函数的选取需要大量经验而且控制器阶数高、实现起来不轻便后者对抗动有很强的鲁棒性但抖振问题在车辆这类执行器带宽有限的系统上非常棘手。后来完整读了几篇关于ADRC的文献又自己推导实现了一遍才意识到它的思路本质上比对抗扰动更高一层——它选择不再直接对抗而是把扰动看清楚再消掉。2.1 从建模对抗干扰到观测并消除干扰的思路转变传统控制处理不确定性大致是两条路要么拼命精化模型把能建模的都建模进去剩下的当成有界扰动来做鲁棒镇定要么设计一个对扰动不敏感的控制器结构比如滑模。这两条的代价都很高前者工程量大后者实现困难。ADRC的核心认知是你不需要知道扰动具体是由什么物理原因产生的你只需要知道它当前对系统施加的影响是多少。既然影响可以体现在状态变化中那我就能用观测器把它从状态信息里反推出来。打个比方你开车时感觉方向盘突然变轻你可能不知道是轮胎气压变了还是路面变滑了但你清楚车子的响应跟之前不一样了。观测器干的事情就是把这种感觉不一样了量化成一个实时数值然后控制器在输出控制量时反向扣掉这个数值。一个新工况来了不需要重新建模ESO会自动适应这就是ADRC应对不确定性的本质。2.2 扩张状态观测器到底观测了什么对于一个二阶系统我们通常只知道位置和速度两个状态。ADRC的做法是人为地把系统总扰动定义为第三个状态也就是扩张状态然后设计一个三阶观测器来同时估计这三个状态。具体来说设系统模型为y f(状态, 扰动, 时间) b0 * u其中f代表总扰动包括内部未建模动态和外部干扰的总和b0是已知的控制增益估计值。把这个总扰动记为x3系统就可以扩张成三阶线性状态空间形式x1 x2 x2 x3 b0 * u x3 h (h为总扰动的变化率)观测器就按这个扩张后的模型来设计用z1追踪位置yz2追踪速度yz3则专门负责追踪总扰动f。这就是扩张状态观测器名字的由来——你观测的不是系统原本的状态而是把扰动也当作一个状态来观测。这里值得强调的是ESO并不要求你知道f的精确模型它只要求f在观测器收敛的时间尺度内变化不要太剧烈。车辆轨迹跟踪场景下侧风突变、附着系数切换这类扰动的频率通常远低于ESO的响应带宽所以这个假设是成立的。2.3 线性ADRC与非线性ADRC取舍韩京清老师最初提出的ADRC用的是非线性fal函数好处是在误差大时增益高、误差小时增益低理论上收敛更快。但非线性ADRC引入了一个额外问题可调参数变多了而且非线性函数的离散化实现需要对步长敏感调参难度直线上升。工程上我更推荐线性ADRCLADRC也就是ESO采用线性增益配置。原因很简单参数少、实现简单、带宽意义明确。用带宽法把观测器增益统一表示为观测器带宽wo的函数之后线性ESO只需要设计wo一个参数整个控制器加上控制器带宽wc也才两三个关键参数。虽然理论上非线性ESO在极端工况下可能收敛更快但在车辆这类采样频率有限、模型噪声不可忽略的系统中线性ESO的稳定性裕度和工程可调性明显更实用。3. 二阶ADRC控制器设计从理论到可落地的状态方程理论讲清楚了接下来就是动手设计。这一节我会从车辆轨迹跟踪常用的横向误差模型出发完整推导二阶ADRC的落地方案。3.1 车辆轨迹跟踪误差模型车辆横纵向控制里路径跟踪一般关注两个核心误差量横向位置偏差ey车辆质心到参考路径的法向距离和航向偏差epsi车辆航向角与参考路径切线方向的角度差。如果忽略高阶侧倾动态横向误差的动态可以用一个二阶系统近似ey a11 * ey a12 * epsi a21 * ey a22 * epsi b * delta fd其中delta是前轮转角fd是包含侧风、路面扰动、未建模横摆动态在内的总扰动。写成这种形式的目的是为了明确告诉ADRC控制器我要控制的量是ey我能操纵的输入是delta而剩下的那些耦合项和干扰项统一丢给扩张状态观测器去处理。这里有一个特别重要的工程判断a11、a12、a21、a22这些参数本身也是不精确的它们随车速、路面附着、车辆载重变化。ADRC设计里我们不需要精确知道它们只需要知道控制通道的增益b也就是delta到ey的增益的大致量级。这个粗粒度建模、细粒度补偿的思路整个设计里面非常重要。3.2 ESO设计把横向误差方程改写成扩张状态形式。令状态x [ey, ey]扩张状态x3 fd得到x1 x2 x2 x3 b0 * delta x3 h对应的线性扩张状态观测器为z1 z2 - 3 * wo * (z1 - ey) z2 z3 - 3 * wo^2 * (z1 - ey) b0 * delta z3 -wo^3 * (z1 - ey)这里wo是观测器带宽3 * wo、3 * wo^2、wo^3三个系数对应观测器特征方程(s wo)^3的展开。使用带宽法后整个ESO只需要调节wo一个参数实现起来极其清爽。需要注意观测器增益不是越大越好。wo调得太高观测器对噪声的敏感度也会同步上升——z1和ey的差值里只要有丁点测量噪声经过wo^3的放大就会变成z3的大幅波动控制量跟着抖执行器迟早出问题。一般我会把wo设成控制器带宽wc的3到5倍留出足够的观测收敛速度又不至于把噪声放大得太厉害。3.3 控制律与扰动补偿有了z2横向误差变化率的估计和z3总扰动的估计控制律就可以分成两部分反馈控制率加扰动补偿。反馈部分直接采用PD形式的线性组合u0 wc^2 * (ey_ref - z1) - 2 * wc * z2这里wc是控制器带宽括号里的ey_ref是参考横向误差通常为0z1是ey的估计z2是ey的估计。这个形式相当于把闭环传递函数配置成双极点系统自然频率等于wc、阻尼比等于1临界阻尼跟踪阶跃响应没有超调也不会拖泥带水。最终控制量为delta (u0 - z3) / b0为什么是减去z3因为z3估计的是当前总扰动。如果扰动为正把ey往正方向推控制量里就减去这个正数主动施加一个反向修正如果模型参数偏差导致实际b和b0不一样ESO会把b和b0的差异也折算进z3里一并补偿掉。这就是ADRC把模型偏差和外部扰动统一处理的精髓。3.4 考虑转向执行器的动态工程上还有一个容易忽略的环节前轮转角delta不是直接能加在轮胎上的理想输入它经过转向电机、减速机构、轮胎自身的惯性是个有一定带宽的执行系统。如果你直接拿理想delta作为控制量真车上的实际转角会滞后导致ESO的z3始终在追赶一个相位滞后的扰动控制器效果大打折扣。我的做法是把执行器动态近似成一个一阶惯性环节时间常数根据阶跃响应辨识出来然后有两种处理方式一种是把执行器动态纳入被控对象建模让ESO去观测包含执行器动态后的总扰动另一种是给控制律加一个相位超前补偿直接对delta期望值做速率规划。前者实现更干净推荐优先尝试。如果你做的是纯仿真也建议在仿真模型里加入一阶惯性环节和响应延迟否则实验与仿真差距会很大。4. 参数整定实操四个关键参数怎么调才能不崩ADRC参数少是相对而言的真要上手还是会面临b0、wc、wo、ESO初值这一堆选择。这一节我把自己调参过程中的经验梳理成一套可复现的流程尽量减少你瞎试的时间。4.1 带宽法顺序先定wc再定wo我的习惯是先确定控制器带宽wc再确定观测器带宽wo最后回头修正b0。wc决定了闭环系统的响应速度。对轨迹跟踪来说wc太小会让车辆响应迟缓过弯时横向误差越积越大wc太大会让控制动作激进容易激发转向执行器的动态特性出现振荡。起步建议从1.0到1.5 Hz开始试然后根据仿真/实车响应的settling time逐步调整。wo一般取wc的3到5倍。这个比例是经验值背后逻辑是观测器至少要比闭环响应快好几倍才能及时估计出扰动并完成补偿。wo如果不到wc的两倍你会看到ESO的z3永远跟不上真实扰动补偿效果很差wo超过wc的8倍噪声和离散化误差又会主导观测器输出。总之先按3倍起步稳定后再往5倍方向小心增加。4.2 b0的取值陷阱b0是控制增益的估计值这个参数在ADRC里的地位比很多人意识到的更关键。b0如果偏差太大即使wo和wc整定得不错控制效果也会一言难尽。b0偏大的情况下ESO会把控制效果比预期弱归因为正向扰动z3正向增加控制量补偿时除以一个偏大的b0实际补偿力度不足表现为跟踪误差收敛变慢、抗扰不如预期。b0偏小的情况相反控制器会认为同样的控制量能产生更大的效果造成过度补偿常见现象是控制量剧烈波动甚至极限环。一个比较靠谱的估算方法是做开环阶跃响应辨识在车辆稳定行驶时给一个小的前轮转角阶跃记录横向加速度或者横向速度的稳态响应和响应时间反算b0的量级。没条件做辨识时也可以先用机理模型估算再通过仿真对比期望响应和实际响应的关系做修正。记住b0只需要量级正确不需要精确它的残差全部会被z3吸收。4.3 仿真中常见的ESO发散问题仿真阶段大家经常遇到ESO数值发散多数情况不是算法错了而是离散化或初值问题。第一个坑是采样步长和观测器带宽不匹配。ESO是高增益观测器wo越大对离散化步长要求越高。如果你用一个较大的仿真步长跑一个wo50 rad/s的ESO大概率会看到z3在零附近剧烈震荡。经验法则是采样频率至少是观测器带宽的20倍以上比如wo10 Hz约62.8 rad/s仿真步长最好不超过1到2毫秒。第二个坑是ESO初值设置。z1初始化为实际的位置测量值z2、z3初始化为0这通常问题不大。但如果你把z3初始化为一个很大的值比如根据经验猜了一个扰动观测器收敛初期会给控制量一个巨大补偿导致车辆猛打方向。稳妥的做法是让z3从0开始让观测器在自然收敛过程中认出真实扰动或者对z3的变化速率加一点限幅。第三个坑是测量噪声。在实际系统中定位信号和偏航角速度信号都有噪声ESO带宽越高噪声放大越严重。常规处理是在ESO的输入侧加低通滤波但要小心滤波相位滞后对观测器收敛性的影响。如果噪声实在压不住适当降低wo并接受一部分扰动估计的低通特性比强行让ESO频带覆盖到整个噪声高频要靠谱。下面这张表是我整理调试过程中的典型现象方便你对着症状快速判断问题方向现象可能原因调整方向跟踪响应慢、抗扰弱wc太低 / wo接近wc提高wc或wo控制量高频抖动wo太高 / b0偏小降低wo / 增大b0稳态出现固定偏差b0严重偏大减小b0过弯时横向误差持续增大wc和wo不足 / 执行器延迟未补偿提高wc / 增加执行器动态补偿阵风后收敛过冲大wc阻尼不足在反馈律里加一点微分增益增大2wcz2权重5. 仿真验证在有干扰和模型失配下的表现对比说再多理论最终都得靠仿真数据说话。我建议你在验证ADRC时不要只跑理想工况——那体现不出ADRC的优势。要专门设计扰动注入和模型失配场景和传统PID做对比才是最有说服力的环节。5.1 测试场景设计仿真的车辆模型建议采用完整的二自由度或更高阶模型而不是设计控制器时用的简化模型。推荐用双移线工况作为参考轨迹因为它包含直线、稳态转弯和紧急变道三种典型特征能比较全面地检验轨迹跟踪能力。测试场景我一般设置四个第一个是标称工况无额外扰动模型参数和控制器参数一致用来验证基础跟踪精度。第二个是外部扰动工况在路径中段注入一个持续2秒的侧向风力矩模拟高速公路上遭遇阵风考察系统在受到外部冲击后的瞬态偏差和恢复时间。第三个是模型失配工况把整车质量增加20%同时把轮胎侧偏刚度降低15%模拟满载和轮胎磨损情况考察内部不确定性对控制的影响。第四个是复合工况把侧向风和模型失配一起上同时把路面附着系数在某个时间点突然降低模拟最恶劣的行驶环境。5.2 结果对比分析对比对象可以选一组调校良好的PID控制器。PID参数建议在标称工况下调到比较理想的状态这样才能公平体现ADRC在非标称工况下的优势。从我这边跑的数据看标称工况下两者差别不大PID的最大横向偏差大约0.08米ADRC大约0.06米都在可接受范围内。但在侧风突变的场景里差别就明显了PID的最大横向偏差会到0.35米左右且恢复时间需要约3秒ADRC则能把最大横向偏差压在0.15米以内恢复时间约1.2秒。模型失配场景更典型。质量增加20%之后PID出现了明显的稳态横向偏差大约0.2米需要驾驶员或者上层控制器修正而ADRC因为ESO持续估计着模型偏差横向偏差依然维持在0.1米以内。复合工况下PID基本已经出现了明显的振荡和发散倾向而ADRC虽然偏差变大到0.25米左右但系统依然稳定能够维持对参考轨迹的跟随。那为什么ADRC能扛住核心就是ESO把每个采样时刻的总扰动都估计出来了并在控制量里做了反向补偿。PID没有这个机制它只能依靠误差积分一点点去磨磨的速度还受限于相位裕度。5.3 简易代码实现下面给一个基于Python风格的简化仿真代码框架用于跑通最基础的二阶ADRC轨迹跟踪。实际项目里我会在此基础上替换为完整的车辆动力学模型。import numpy as np import matplotlib.pyplot as plt # 参数配置 dt 0.001 # 仿真步长 1ms T 20.0 # 仿真时长 steps int(T / dt) wc 8.0 # 控制器带宽 rad/s wo 3 * wc # 观测器带宽 rad/s b0 1.5 # 控制增益估计 # ESO状态 z1, z2, z3 0.0, 0.0, 0.0 # 系统状态模拟真实车辆 ey 0.0 ey_dot 0.0 # 控制参数 ey_ref 0.0 # 期望横向偏差 for i in range(steps): t i * dt # 模拟外部扰动和模型失配 if 3.0 t 5.0: f_dist 2.0 # 侧风等效扰动 else: f_dist 0.0 # 模型失配真实b和b0不一样 b_real 1.2 # 真实系统更新 ey_ddot f_dist b_real * delta if i 0 else 0.0 ey_dot ey_ddot * dt ey ey_dot * dt # 测量可加噪声 y_meas ey # ESO更新线性扩张状态观测器 e z1 - y_meas z1_dot z2 - 3 * wo * e z2_dot z3 - 3 * wo**2 * e b0 * (delta if i 0 else 0.0) z3_dot -wo**3 * e z1 z1_dot * dt z2 z2_dot * dt z3 z3_dot * dt # 控制律 u0 wc**2 * (ey_ref - z1) - 2 * wc * z2 delta (u0 - z3) / b0这段代码把最核心的三个环节真实被控对象更新、ESO状态更新、控制律计算按顺序展示了一遍。在实际使用中你要注意delta要处理初始时刻的未定义问题真实系统里也要加入执行器饱和和延迟否则仿真结果会过于理想。5.4 代码层面的工程细节你可能已经注意到上面代码里b_real和b0是不相等的1.2 vs 1.5这是故意模拟模型失配。在这种失配条件下ESO的z3会收敛到某个非零值这个值既包含了外部扰动f_dist也包含了由b_real和b0差异导致的等效扰动。真正体现ADRC能力的就是这个z3在改变工况时能不能快速跟踪真实总扰动。另外仿真中还要注意几个细节一是控制器输出delta必须限幅前轮转角不可能无限大建议限制在正负30度以内二是限幅之后要防止ESO状态积分饱和常见做法是加入抗饱和机制比如在限幅生效时冻结ESO的部分更新三是如果使用真实传感器数据建议给y_meas加白噪声能提前暴露观测器噪声放大问题。6. 我在落地ADRC时的几个经验和教训最后这部分写一点没法写进技术文档、但对实际项目更有帮助的经验。6.1 观测器噪声问题比想象的严重纯仿真时很容易被完美的状态反馈骗过去因为测量信号是理想化的。真车上定位信号、惯导信号都有噪声尤其用视觉定位时跳变还很明显。我遇到过一次比较棘手的情况wo按仿真值整定后控制量在实车上出现明显的高频抖振方向盘能听到嗡嗡声。后来分析发现是ESO把测量噪声当作高频扰动给补偿了。解决思路有三个第一降低wo到噪声容忍范围第二在ESO输入端加低通滤波但要注意滤波引入的相位滞后需要把延迟折合进ESO模型第三改用被测量信号的高频分量为渐近收敛的观测器结构。我的建议是优先降wo实在满足不了抗扰需求再考虑更复杂的滤波。6.2 执行器饱和和延迟必须提前考虑ADRC的扰动补偿有一个隐含假设你让控制器输出多大的控制量系统就能立刻施加多大的力。但真实执行器有物理极限输出限幅一旦生效再好的补偿算法也无法改变物理规律。我踩过的坑是在紧急变道工况下ADRC算出的期望转角超过转向电机能力实际转角跟不上期望值ESO观测到的扰动包含执行器没跟上所带来的偏差于是拼命增加补偿量结果进一步推高饱和状态陷入恶性循环。这个问题必须在设计阶段就考虑进去做法是给控制律输出一个速率限制让控制量的变化率也不至于瞬间突破执行器的跟踪能力。6.3 ADRC不是万能什么时候该退回PID或换MPCADRC在模型不确定性大、外部扰动频率中低、系统近似二阶结构的场景下表现非常好。但它是基于当前状态反馈的不具备预见未来的能力所以遇到未来一段已知轨迹的曲率变化时它不会提前转向只能靠反馈一点点追。好在轨迹跟踪里你可以加一个前馈项把参考曲率对应的稳态转角直接叠加到delta上这个在工程中几乎是必须的。如果你的项目有明确的约束条件要满足——比如转向角不能超过某个值、横向加速度必须在舒适性阈值以内——那MPC可能更合适因为MPC天然支持约束规划。ADRC处理约束的能力很弱它只能尽量跟踪没法保证约束。反过来如果干扰是主要矛盾模型又不容易精确获得ADRC的性价比就比MPC高得多毕竟MPC的性能很大程度上依赖预测模型的精度。还有一点不要迷信ADRC可以完全替代PID。在标称工况稳定、扰动不大的系统里PID加积分项和合理的前馈效果和ADRC差距并不大。ADRC的优势恰恰体现在你不想花大量精力建模、模型参数又总在变、工况还一茬接一茬换的场合。说到底控制方案选型是一种基于工程代价的取舍不是越高级越好。借鉴自抗扰的思想之后我最大的感受是对车辆这类强非线性、强不确定性的系统与其花大量时间去精化模型不如承认模型的局限性用观测器去感知未知再及时补偿。这套方法论的意义可能比ADRC本身更值得留意。希望这篇实战拆解能让你少走一些弯路后续如果大家在参数整定或者观测器调优上遇到具体问题欢迎一起探讨。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询