第二章:校准理论基础
各位好,我是老张。今天咱们聊聊校准的理论基础。说实话,我刚入行那会儿,觉得校准就是调参数,拧螺丝。后来被现实狠狠教育了一顿——没有理论支撑的校准,就像闭着眼睛开飞机。
这一章,我打算从三个角度切入:系统辨识、参数估计、模型验证。说白了,就是搞清楚三个问题:你的模型长什么样?怎么调参数?调完怎么知道好不好?
2.1 系统辨识基础
系统辨识,听起来高大上,其实就一件事:从数据里反推系统的数学模型。你想想看,飞控系统是个黑盒子,你给它输入(比如舵面偏转),它给你输出(比如姿态角变化)。系统辨识就是通过观察输入输出,猜出盒子里面长啥样。
我个人习惯把系统辨识分成三步:
- 数据采集——激励信号要够丰富。我见过有人用阶跃信号做辨识,结果模型只在低频准,高频一塌糊涂。建议用扫频信号或PRBS(伪随机二进制序列)。
- 模型结构选择——选ARX、ARMAX还是状态空间?我的经验是:先试试ARX,简单、稳定、够用。如果残差有颜色,再升级。
- 参数估计——这就是下一节的内容了。
避坑指南:我曾经在无人机旋翼辨识上栽过跟头。采集数据时没考虑旋翼的旋转对称性,结果模型在不同航向角下表现天差地别。后来加了多角度激励数据,才搞定。
这里我画了一张图,帮你理清系统辨识的整个流程:
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