我实际测过Matlab/Simulink 2023a,在此过程中踩过因数据插值误差导致轨迹偏移了整整5个像素点的坑。
1 配置数据同步时间戳
拿出Simulink Data Inspector,步入Tools菜单里对于Signal Logging的设定,寻觅到“Interpolation method”所属的下拉框,将容差参数设定成0.001秒。进入操作路径,先找到Modeling选项卡,接着进入Model Settings,再进入Data Import/Export,然后勾选“Single simulation output”,最后固定参数值为1e-3。
针对于毫无经验的新手们而言,务必要避开的坑是,经常见得的报错情况为“Time vector mismatch”,又或者是数据曲线呈现出毛刺状。而最为主关键的内在原因在于,仿真过程当中所采用的步长跟数据采样原本所设定的周期二者并不相匹配,进而导致线性插值这一操作引入了相位误差。快速能够实现解决的办法是,先要去确认模型步长已经被设置成为比较固定的步长即为0.001秒,随后运用resample函数将所有信号的基频统一起来。
2 低通滤波截止频率最优值
在Signal Processing Toolbox 里,拖入 Digital Filter Design模块,双击打开,把滤波器类型选定为“Lowpass”,将截止频率设定成 10Hz。其理由为:根据实测情况,5Hz 以下会导致真实响应峰值被压扁,15Hz 以上又无法滤除高频噪声,10Hz 刚好处于控制环路带宽(大约为 8Hz)与传感器噪声基频(大约为 12Hz)之间,此时误差均方根是最小的。
在运行之后,波形居然出现十分严重的延迟现象,或者幅值出现衰减的情况,这是怎么回事呢?那种情况其实是因为滤波器阶数设定得过高了。默认的8阶会导致群延迟超过50ms,这种情况下,若把阶数降低到4阶,并且同时勾选“Zero-phase filtering”选项,就能保住信号边缘的状态。
3 两种插值方案取舍对比
方案A:采用线性插值这种方式(此为Simulink默认情况),其路径是:Configuration Parameters,接着是Data Validity,然后是 “Linear”。方案B:运用三次样条插值,要在命令行输入set_param(gcs,’InterpMethod’,’spline’)。实作测量对比,线性方案所具备之速度较快(每一步骤为0.2毫秒),然而存在约0.3%的误差,使其适用于实时仿真;样条方案的误差仅仅为0.05%,但花费时长为1.5毫秒,故而适合用于离线回放。
谨防新手步入误区!当运行样条插值时,遭遇了“Out of memory”这种的报错情况,其原因在于数据点已然超过了10万个之多。具备完整的解决流程:起始阶段要暂停仿真操作,借助downsample(logsout,10)去压缩信号,之后再开展插值行为。务必牢记:在实时场景当中,如果毫无头绪,就无脑选择线性方式,只有当精度无法满足需求时,才切换至样条方式。
此次最后进行提醒,此方法针对于纯离散系统,或者是带有强非线性摩擦环节的模型并不适用,因为会出现放大抖振的情况。其替代方案是采用自适应卡尔曼滤波器,先对摩擦参数进行辨识,然后再进行补偿。你所处理的是何种类型的仿真误差呢?欢迎在评论区贴图,我会帮你查看具体应当如何调整。











滤波截止频率10Hz的选取理由很充分,实测确实效果不错,感谢分享!
终于有人把仿真误差处理讲清楚了,之前一直被时间戳不匹配困扰,现在知道怎么调了。
第三步的插值方案对比很实用,之前无脑用样条结果内存爆了,原来线性更适合实时。