1992年由Aya和Awa提出的基于扰动观测器的转动惯量辨识方法,是运动控制领域具有里程碑意义的经典算法。这套方案从根本上解决了传统伺服系统中转动惯量在线辨识的难题——在无需额外传感器的情况下,仅通过电机电流和转速信号就能实时估算负载惯量变化。
我在工业机器人伺服调试中多次应用该方法,最直观的感受是:它让惯量辨识从实验室走向了车间现场。传统方法需要让电机做特定加减速运动,通过测量转矩和角加速度计算惯量,不仅操作繁琐,而且无法应对负载实时变化。而Aya-Awa观测器就像给系统装了个"智能触角",能持续感知负载特性变化。
观测器的核心是一个并联在系统上的虚拟模型。以永磁同步电机为例,其运动方程为:
code复制J·dω/dt = Te - Tl - B·ω
其中J为转动惯量,Te为电磁转矩,Tl为负载转矩,B为摩擦系数。观测器构建如下结构:
c复制// 伪代码示例
estimated_Tl = Kp*(ω_measured - ω_estimated) + Ki*∫(ω_measured - ω_estimated)dt
ω_estimated = (Te - estimated_Tl - B·ω_measured)/J_nominal * dt
关键点:这里的J_nominal是系统标称惯量,观测器通过不断调整estimated_Tl使ω_estimated跟踪实际转速,此时(Tl_actual - estimated_Tl)即反映真实惯量与标称值的偏差。
当负载惯量发生变化时,观测器误差动力学表现为:
code复制ε̇ + (Ki/J)ε = ΔJ·α/J^2
其中ε为转速误差,α为角加速度,ΔJ=J_actual-J_nominal。通过设计合适的Kp、Ki参数,可使误差ε与ΔJ建立确定的映射关系。
我在实践中发现,当选择Ki/J ≈ 20~50rad/s时,系统既能快速响应惯量变化,又不会因噪声导致辨识抖动。这个参数范围适用于大多数工业伺服场景。
需要准确获取以下信号:
python复制# 信号处理示例
def get_omega(encoder_pos):
pos_diff = np.diff(encoder_pos)
dt = 1e-4 # 100us采样周期
return pos_diff / dt
采用双线性变换将连续系统离散化:
code复制// 离散化观测器方程
Tl_est[k] = Tl_est[k-1] + Kp*(ω_err[k]-ω_err[k-1]) + Ki*Ts/2*(ω_err[k]+ω_err[k-1])
注意:采样周期Ts建议取控制周期的1/5~1/10,例如10kHz电流环时取Ts=0.1ms
最终惯量估算公式:
code复制J_actual = J_nominal * (1 + ∫(Kj·ε·α)dt)
其中Kj为辨识增益,需要添加滑动平均滤波:
matlab复制% 移动平均滤波实现
window_size = 50; % 对应5ms@10kHz
J_filtered = movmean(J_raw, window_size);
通过大量实验总结出黄金法则:
例如某伺服系统:
常见干扰源及对策:
在某SCARA机器人项目中,我们实现了:
具体测试数据:
| 测试场景 | 理论惯量(kg·m²) | 辨识结果(kg·m²) | 误差率 |
|---|---|---|---|
| 空载 | 0.012 | 0.0118 | -1.7% |
| 负载A | 0.156 | 0.159 | +1.9% |
| 负载B | 0.387 | 0.401 | +3.6% |
可能原因:
解决方案:
根本原因:摩擦转矩占比增大
改进措施:
c复制if(abs(omega)<0.1)
Tl_est += sign(omega)*Tf_static;
else
Tl_est += Tf_coulomb;
结合近年发展,建议尝试:
但经典Aya-Awa方法仍是基础——就像我常对团队说的:先把这壶"老酒"品明白,再考虑调制新口味。它的简洁美和实用价值,历经30年依然闪耀。