先说点实际的。做车辆轨迹跟踪控制这几年,最让人头疼的往往不是算法推导本身,而是你辛辛苦苦基于理想模型调好的控制器,一上车就被现实狠狠教育。轮胎侧偏刚度不是常数,整车质量随载重变,路面附着系数说变就变,再来一阵侧向风,横向误差直接肉眼可见地偏出去。传统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追踪位置y,z2追踪速度y',z3则专门负责追踪总扰动f。这就是"扩张状态观测器"名字的由来——你观测的不是系统原本的状态,而是把扰动也当作一个状态来观测。
这里值得强调的是,ESO并不要求你知道f的精确模型,它只要求f在观测器收敛的时间尺度内变化不要太剧烈。车辆轨迹跟踪场景下,侧风突变、附着系数切换这类扰动的频率,通常远低于ESO的响应带宽,所以这个假设是成立的。
2.3 线性ADRC与非线性ADRC取舍
韩京清老师最初提出的ADRC用的是非线性fal函数,好处是在误差大时增益高、误差小时增益低,理论上收敛更快。但非线性ADRC引入了一个额外问题:可调参数变多了,而且非线性函数的离散化实现需要对步长敏感,调参难度直线上升。
工程上我更推荐线性ADRC(LADRC),也就是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是参考横向误差(通常为0),z1是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越大,对离散化步长要求越高。如果你用一个较大的仿真步长跑一个wo=50 rad/s的ESO,大概率会看到z3在零附近剧烈震荡。经验法则是采样频率至少是观测器带宽的20倍以上,比如wo=10 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或换MPC
ADRC在模型不确定性大、外部扰动频率中低、系统近似二阶结构的场景下表现非常好。但它是基于当前状态反馈的,不具备"预见未来"的能力,所以遇到未来一段已知轨迹的曲率变化时,它不会提前转向,只能靠反馈一点点追。好在轨迹跟踪里你可以加一个前馈项,把参考曲率对应的稳态转角直接叠加到delta上,这个在工程中几乎是必须的。
如果你的项目有明确的约束条件要满足——比如转向角不能超过某个值、横向加速度必须在舒适性阈值以内——那MPC可能更合适,因为MPC天然支持约束规划。ADRC处理约束的能力很弱,它只能尽量跟踪,没法保证约束。反过来,如果干扰是主要矛盾,模型又不容易精确获得,ADRC的性价比就比MPC高得多,毕竟MPC的性能很大程度上依赖预测模型的精度。
还有一点,不要迷信"ADRC可以完全替代PID"。在标称工况稳定、扰动不大的系统里,PID加积分项和合理的前馈,效果和ADRC差距并不大。ADRC的优势恰恰体现在你不想花大量精力建模、模型参数又总在变、工况还一茬接一茬换的场合。说到底,控制方案选型是一种基于工程代价的取舍,不是"越高级越好"。
借鉴自抗扰的思想之后,我最大的感受是:对车辆这类强非线性、强不确定性的系统,与其花大量时间去精化模型,不如承认模型的局限性,用观测器去感知未知,再及时补偿。这套方法论的意义可能比ADRC本身更值得留意。希望这篇实战拆解能让你少走一些弯路,后续如果大家在参数整定或者观测器调优上遇到具体问题,欢迎一起探讨。