1. 项目背景与核心价值
双惯量伺服系统在工业自动化领域极为常见,从机械臂关节驱动到数控机床进给系统都有广泛应用。这类系统通常由电机(第一惯量)通过弹性联轴器或传动轴(刚度元件)连接负载(第二惯量)构成。系统运行时,机械参数的准确辨识直接决定了控制器的调节效果——就像医生开药前必须了解患者的体重和体质一样。
但在实际工程中,机械参数辨识面临三大难题:
- 负载惯量会随工件更换而变化(如机械臂抓取不同物体)
- 传动刚度会随机械磨损逐渐改变
- 传统离线辨识方法需要停机测试,影响生产效率
我们团队开发的这套解决方案,通过融合粒子群优化(PSO)和卡尔曼滤波(KF)算法,实现了双惯量系统参数的在线实时辨识。实测表明,在数控机床进给系统中,参数辨识误差可控制在3%以内,且完全不影响设备正常运行。
2. 技术方案设计思路
2.1 整体架构设计
系统采用分层处理架构:
[电机编码器信号] → [卡尔曼滤波器] → [参数优化层] → [控制器] ↑ ↑ [PSO算法] [协方差矩阵自适应]这种架构的巧妙之处在于:
- 卡尔曼滤波器负责状态估计(转速/扭矩)
- PSO算法专注于参数空间搜索
- 两者通过协方差矩阵实现双向耦合
2.2 卡尔曼滤波器改造
标准KF在机械参数辨识中存在两个致命缺陷:
- 要求系统噪声统计特性已知(实际中很难获取)
- 参数变化时滤波性能急剧下降
我们的改进方案:
# 自适应协方差矩阵更新 def update_Q(R): Q = np.diag([PSO.best_position[0], # 过程噪声方差 PSO.best_position[1]]) # 观测噪声方差 return Q @ R @ Q.T # 旋转缩放变换这种动态调整机制使得滤波器能自动适应参数变化,实测显示在负载突变时仍能保持稳定跟踪。
2.3 粒子群优化设计
标准PSO容易陷入局部最优,我们做了三项关键改进:
惯性权重自适应:
w = w_max - (w_max-w_min)*(k/k_max)^2 % 非线性递减早期保持强全局搜索能力,后期精细局部优化
精英保留策略:
if(fitness(new) < fitness(gbest)) archive.push(gbest); // 保存历史最优 gbest = new;避免优秀解在迭代中丢失
参数边界处理:
position = np.clip(position, [J_min, K_min, B_min], [J_max, K_max, B_max])确保物理参数在合理范围内
3. 核心实现细节
3.1 状态空间建模
双惯量系统动力学方程:
J₁·ω̇₁ = Tₑ - B₁·ω₁ - K·(θ₁-θ₂) J₂·ω̇₂ = K·(θ₁-θ₂) - B₂·ω₂ - Tₗ其中需要辨识的参数:
- J₁, J₂:电机/负载惯量
- K:轴系刚度
- B₁, B₂:阻尼系数
将其转化为状态空间形式:
A = [ -B₁/J₁ -K/J₁ K/J₁ 0; 1 0 0 0; K/J₂ 0 -K/J₂ -B₂/J₂; 0 0 1 0 ];3.2 观测方程设计
实际工程中通常只能测量电机端信号(电流、转速),为此我们设计间接观测方案:
y = [ ω₁ ] # 仅电机转速可测 [ Tₑ ] # 通过电流环计算电磁转矩通过可观测性矩阵验证:
Ob = control.obsv(A, C) if np.linalg.matrix_rank(Ob) == A.shape[0]: print("系统完全可观测")3.3 算法实现流程
完整参数辨识流程:
- 初始化PSO粒子群(每个粒子代表一组参数猜测)
- 运行KF进行状态估计
- 计算预测输出与实际测量的误差
- 更新粒子速度和位置
- 动态调整KF的Q/R矩阵
- 判断收敛条件(最大迭代次数或误差阈值)
关键代码段(C++实现):
while(!converged){ // 卡尔曼预测步 x_hat = A * x_hat; P = A * P * A.transpose() + Q; // 粒子评估 for(auto& p : particles){ p.fitness = compute_MSE(p.position); update_pbest(p); } // 更新全局最优 gbest = find_best(particles); // 协方差矩阵自适应 Q = update_Q(gbest.position); // 粒子位置更新 for(auto& p : particles){ p.velocity = w*p.velocity + c1*rand()*(p.pbest - p.position) + c2*rand()*(gbest - p.position); p.position += p.velocity; } }4. 工程实践要点
4.1 采样频率选择
根据香农定理和实际工程经验:
- 控制周期:通常取0.5-2ms(500-2000Hz)
- 辨识周期:建议为控制周期的5-10倍
重要提示:采样频率过高会导致数值计算不稳定,过低则无法捕捉机械谐振特性
4.2 激励信号设计
有效的参数辨识需要充分激励系统动态,推荐采用:
def excitation_signal(t): return 0.5*np.sin(2*np.pi*5*t) + 0.3*np.random.normal()包含:
- 低频成分(激发刚体运动)
- 高频噪声(激发谐振模态)
- 幅值限制在额定值的30%以内(保障安全)
4.3 参数敏感性分析
通过蒙特卡洛仿真发现:
- 惯量辨识对转速信号噪声最敏感
- 刚度辨识依赖扭矩测量精度
- 阻尼系数最难准确获取
建议传感器选型:
- 编码器分辨率 ≥17bit
- 电流传感器精度 ≤0.5%FS
5. 典型问题排查
5.1 发散问题处理
现象:参数估计值剧烈波动或趋向无穷 可能原因:
- 过程噪声协方差Q设置过大
- 粒子群过早收敛到局部最优
- 机械谐振频率接近Nyquist频率
解决方案:
% 增加种群多样性 options = optimoptions('particleswarm',... 'SwarmSize', 50,... % 原为30 'InertiaRange',[0.1 1.2]);5.2 收敛速度优化
当迭代次数超过100次仍未收敛时:
- 检查参数搜索范围是否合理
- 惯量:额定值±50%
- 刚度:理论值的0.1-10倍
- 引入模拟退火机制:
if random() < exp(-delta_E/T): accept_worse_solution() T *= 0.95 # 温度下降
5.3 实时性保障
在DSP(TMS320F28379D)上实测:
- 100个粒子时单次迭代耗时1.2ms
- 通过以下优化可提升至0.8ms:
- 使用查表法代替实时矩阵求逆
- 采用定点数运算(Q15格式)
- 并行计算粒子适应度
6. 应用案例
在某型号SCARA机械臂上的实施效果:
| 参数 | 真实值 | 辨识值 | 误差 |
|---|---|---|---|
| J₁ (kg·m²) | 0.0125 | 0.0129 | +3.2% |
| J₂ (kg·m²) | 0.087 | 0.085 | -2.3% |
| K (N·m/rad) | 2100 | 2180 | +3.8% |
控制性能提升:
- 阶跃响应超调量从12%降至5%
- 正弦跟踪误差减小40%
- 不同负载下的控制一致性提高60%
这套方法后续还成功应用于:
- 风电变桨系统
- 电动汽车转向助力系统
- 半导体晶圆搬运机器人
在实际部署中发现,定期(如每8小时)重新运行参数辨识,能有效补偿机械系统随时间的老化变化。对于突变的负载情况(如机械臂抓取未知物体),通过监测估计误差的突变,可以触发自动重辨识流程。