本仓库代码用于解决 RoboMaster2022 赛季至今的大能量机关运动方程解算问题。
.
├─ Filter.m # 测试程序,使用卡尔曼滤波
├─ Monte.m # 测试程序,使用蒙特卡洛法分析
├─ Sim.m # 测试程序,模拟真实运行环境分析
├─ log
└─ lib
├─ getData.m # 获取数据序列
├─ meanFilter.m # 均值滤波
├─ RMSE.m # 均方根误差
├─ OLS.m # 最小二乘法
├─ KF.m # 卡尔曼滤波
├─ GN.m # 高斯牛顿法
└─ FFT.m # 带窗傅里叶变换法
注:由于 Matlab 默认使用行向量,而数学上一般倾向于使用列向量,故请在理解代码和公式时注意转换关系
现有一半径为 700mm 的叶片绕定轴旋转,其旋转速度
已知过去
由于直接观测量为角度,首先将速度方程积分得角度方程,可得多种形式
对
可以认为该问题中共含有 4 个未知参数,若能求解所有参数,即可预测任意时刻下叶片的旋转角度。从式
第一种直观的方案,通过带窗的快速傅里叶变换求解速度方程的信号主频率
第二种方案,通过高斯牛顿法求解式
第三种方案可以认为是第二种的改版,设计如下交替迭代法求解式
- 以上一时刻计算的
$\omega$ 值为当前时刻的初值,若当前为初始时刻,则根据$\omega$ 的取值范围设定初值为中间数 1.942; - 固定
$\omega$ ,根据最小二乘法求取 4 个线性参数; - 固定 4 个线性参数,使用高斯牛顿法迭代优化
$\omega$ ; - 重复步骤 2~3,直到
$\Delta \omega < \eta$ 。
此外,为了解决噪声对拟合算法的影响,我们在进入优化之前需要对角度数据进行滤波处理,实验的测试中主要使用了均值滤波,更好的选择是卡尔曼滤波;为了降低优化的复杂度,提升运行速度,我们可以对滤波后的数据进行降采样。
最小二乘法用于求解如下最小二乘问题:现有线性方程
令 $X = [\boldsymbol{x}0, \cdots, \boldsymbol{x}{n-1}]^T, \ Y = [y_0, \cdots, y_{n-1}]^T$ ,由于
求梯度,化简得
对于大符问题,我们令
在固定
高斯牛顿法适用于求解如下优化问题:设误差函数为
设
其中
算法迭代步骤如下:
- 给定初值
$\boldsymbol{\omega}^{(0)}$ ; - 在第 k 次迭代中,根据雅各比矩阵
$J_e(\boldsymbol{\omega}^{(k)})$ 和$e(\boldsymbol{\omega}^{(k)})$ 求解增量$\Delta \boldsymbol{\omega}^{(k)}$ ; - 令
$\boldsymbol{\omega}^{(k+1)} = \boldsymbol{\omega}^{(k)} + \beta \Delta \boldsymbol{\omega}^{(k)}$ ,其中$\beta$ 为步长倍率; - 重复步骤 2~3,直到
$|\Delta \boldsymbol\omega|^2 < \eta$ 。
对于大符问题,我们令
在固定
卡尔曼滤波的原理不再赘述,此处仅记录其五步公式
$$ \begin{align} \bar{\boldsymbol{x}{k+1}} &= F \boldsymbol{x}k \ \bar{P{k+1}} &= F P_k F^T + Q \ K{k+1} &= \frac{\bar{P_{k+1}} H^T}{H \bar{P_{k+1}} H^T + R} \ \boldsymbol{x}{k+1} &= \bar{\boldsymbol{x}{k+1}} + K_{k+1} (\boldsymbol{z}{k+1} - H \bar{\boldsymbol{x}{k+1}}) \ P_{k+1} &= (I - K_{k+1} H) \bar{P_{k+1}} \end{align} $$
对于大符问题,为了拟合原方程中的正弦分量,联想到简谐振动
由于角度数据经过微分后误差放大,且数据中包含周期数极少,使用 600 帧数据通过该算法求解
若采用不带窗的形式,则求解误差极大,结果基本无效。
效果非常稳定;
直接对 4 个原始参数进行优化效果喜人,求解噪声较小时(高斯噪声,
使用交替迭代法直接求解噪声较小时(高斯噪声,
上述两种方案就实验结果而言相距甚小,且可以通过终止条件进一步权衡精度与计算速度,可根据实际测试效果灵活选用。高斯牛顿法的共性问题是在噪声较大的情况下预测精度将持续下降,甚至经常出现反向优化的情况;且
关于这两种方案还有两个现象。其一是直接优化法更容易在连续过程中计算出错误的
使用 200 帧数据通过最小二乘法求取初始值,并逐步更新参数,可有效对
理论上来说,线性分量亦可加入状态量中,但实际测试效果不佳,故不予采纳。若