第二章:校准理论基础

各位好,我是老张。今天咱们聊聊校准的理论基础。说实话,我刚入行那会儿,觉得校准就是调参数,拧螺丝。后来被现实狠狠教育了一顿——没有理论支撑的校准,就像闭着眼睛开飞机。

这一章,我打算从三个角度切入:系统辨识、参数估计、模型验证。说白了,就是搞清楚三个问题:你的模型长什么样?怎么调参数?调完怎么知道好不好?

2.1 系统辨识基础

系统辨识,听起来高大上,其实就一件事:从数据里反推系统的数学模型。你想想看,飞控系统是个黑盒子,你给它输入(比如舵面偏转),它给你输出(比如姿态角变化)。系统辨识就是通过观察输入输出,猜出盒子里面长啥样。

我个人习惯把系统辨识分成三步:

  • 数据采集——激励信号要够丰富。我见过有人用阶跃信号做辨识,结果模型只在低频准,高频一塌糊涂。建议用扫频信号或PRBS(伪随机二进制序列)。
  • 模型结构选择——选ARX、ARMAX还是状态空间?我的经验是:先试试ARX,简单、稳定、够用。如果残差有颜色,再升级。
  • 参数估计——这就是下一节的内容了。

避坑指南:我曾经在无人机旋翼辨识上栽过跟头。采集数据时没考虑旋翼的旋转对称性,结果模型在不同航向角下表现天差地别。后来加了多角度激励数据,才搞定。

这里我画了一张图,帮你理清系统辨识的整个流程:

系统辨识流程 数据采集 激励信号设计 模型结构选择 ARX / ARMAX / 状态空间 参数估计 最小二乘 / 卡尔曼滤波 验证不通过,返回调整 模型验证 拟合度 / 残差分析 模型应用 数字孪生 / 控制器设计 验证通过

2.2 参数估计方法

参数估计,说白了就是猜参数。但猜也要有章法。这里我重点讲两种:最小二乘法和卡尔曼滤波。这两种方法,我几乎在每个项目里都用过。

2.2.1 最小二乘法

最小二乘法是最朴素的思路:让模型输出和真实输出的误差平方和最小。数学上就是解一个线性方程组。

举个例子,假设你的模型是 y = a*x + b,你有一堆 (x, y) 数据点。最小二乘法就是找一条直线,让所有点到直线的垂直距离平方和最小。就这么简单。

我的经验:最小二乘法对噪声敏感。我在做某型固定翼的纵向通道辨识时,传感器噪声太大,直接用最小二乘法结果惨不忍睹。后来加了数据预处理——低通滤波+去趋势,效果立竿见影。

代码实现也很直接,用Python的numpy就能搞定:

import numpy as np

# 假设我们有输入X和输出Y
X = np.array([[1, 2, 3, 4, 5]]).T
Y = np.array([2.1, 3.9, 6.2, 7.8, 10.1])

# 构造设计矩阵,加入偏置项
Phi = np.hstack([X, np.ones((X.shape[0], 1))])

# 最小二乘解: theta = (Phi^T * Phi)^{-1} * Phi^T * Y
theta = np.linalg.inv(Phi.T @ Phi) @ Phi.T @ Y
a, b = theta[0], theta[1]
print(f"斜率 a = {a:.3f}, 截距 b = {b:.3f}")

嗯,这里要注意:矩阵求逆的条件数。如果 Phi^T * Phi 接近奇异,结果会很不稳定。我遇到过因为激励信号不够丰富导致矩阵病态的情况,输出参数大得离谱。

2.2.2 卡尔曼滤波

卡尔曼滤波,说白了就是带预测的递归估计。它不像最小二乘法那样一次性算完,而是每来一个新数据,就更新一次估计。特别适合在线校准场景。

卡尔曼滤波的核心思想:

  • 预测——根据上一时刻的状态,猜当前时刻的状态
  • 更新——用当前时刻的测量值,修正预测值
  • 权重——预测准还是测量准?卡尔曼增益说了算

避坑指南:我曾经在无人机GPS/IMU融合时,把过程噪声协方差Q设得太小。结果卡尔曼滤波过于相信预测,测量更新几乎不起作用。飞机飞了十分钟,位置误差漂了上百米。后来把Q调大,才把IMU的漂移抑制住。

卡尔曼滤波的五条核心公式,我建议你背下来:

# 预测步骤
x_pred = A @ x_est + B @ u          # 状态预测
P_pred = A @ P_est @ A.T + Q        # 协方差预测

# 更新步骤
K = P_pred @ H.T @ inv(H @ P_pred @ H.T + R)  # 卡尔曼增益
x_est = x_pred + K @ (z - H @ x_pred)         # 状态更新
P_est = (I - K @ H) @ P_pred                  # 协方差更新

这里Q和R是两个关键参数。Q是过程噪声,R是测量噪声。我个人习惯先通过离线数据粗调,再在线微调。别指望一次调好,卡尔曼滤波的调参是个迭代过程。

2.3 模型验证与评估指标

模型建好了,参数估完了,怎么知道好不好?我见过太多人只看拟合图,觉得曲线重合了就万事大吉。其实远远不够。

我常用的评估指标有这几个:

指标 公式 说明 我的经验阈值
拟合度 (Fit) 1 - ||y - ŷ|| / ||y - ȳ|| 越接近1越好 > 85% 算合格
均方根误差 (RMSE) sqrt(mean((y - ŷ)²)) 越小越好,有物理单位 取决于量纲,一般< 5% 量程
残差自相关 r(k) = E[e(t)e(t-k)] 残差应为白噪声 95%置信区间内
AIC/BIC 信息准则 用于模型阶次选择 越小越好

重要提醒:千万不要只用训练集评估模型。我见过有人用同一组数据既训练又验证,拟合度99%,换一组数据直接崩盘。一定要留出一部分数据做交叉验证。

残差分析是我特别看重的环节。说白了,就是看模型没解释掉的那部分误差有没有规律。如果残差还有明显的周期性或趋势,说明模型结构有问题,不是调参数能解决的。

举个例子,我在做某型四旋翼的偏航通道辨识时,残差总是有0.5Hz的振荡。查了半天,发现是旋翼的转速谐波耦合进来了。后来在模型里加了谐波项,残差才干净。

一个小技巧:画残差的自相关函数图。如果自相关函数在零延迟之外都落在置信区间内,说明残差是白噪声,模型够用了。如果超出,说明还有信息没被模型捕捉。

好了,这一章的内容就到这里。理论是基础,但真正上手时你会发现,每个项目都有自己的脾气。多试、多调、多总结,慢慢就有感觉了。


公众号:蓝海资料掘金营,微信deep3321