## **4. 误差累加方案**
误差累加方法是我自己通过实验总结的方案。
主要公式如下:
>[danger] `$ f = \sum_1 ^t {d} * p $`
其中f是输出推力,d是误差,t是累加周期,p是比例系数
简而言之就是规定若干帧为一个周期,把周期中每一帧的误差累加起来,乘以一个规定的比例系数后直接作为输出。
代码实现如下(设编程块运行频率是60次/秒):
```
const int T = 30; //周期
const double P = 1; //比例系数
List<double> d_data = new List<double>(); //储存误差的数组
void Main(){
double d = ...; //获取误差
d_data.Add(d);
if(d_data.Count > T){
d_data.Remove(d_arr[0]);
}
double sum_d = 0;
foreach(double i in d_data){
sum_d += i;
}
double F = sum_d * P; //输出结果
}
```
<br>
如下图:
方便描述,下文中我们将 输出 = 误差 称为普通算法。

图中红色是普通算法,蓝色是误差累加算法。
可以看到由于输出是误差在一定时间内的累加,误差累加算法在第一次抵达目标前会走得更平缓,在接近目标的过程中,它对误差的响应更加灵敏。
在第一次越过目标后,刚开始一段时间内,由于之前的正误差结果还在储存集中,累加的结果依然是正值,所以会出现越过目标后仍然在正加速的情况。
在震荡问题中,误差累加算法能一定程度上延长震荡周期,从而减少震荡。
在实际应用时,误差累加算法的计算周期一般很短(30帧,半秒内),因此并不会出现像图中这么明显的越过后依然加速的情况,总体上它让震荡效果变得更平缓。
**在实际应用中,如果没必要使用PID算法,又不想产生震荡,最好是采用误差累加算法,它对消除震荡真的非常有效**
- 序言
- 写在前面的话
- 太空工程师
- MEA小组
- 一、入门
- 1.1 基础概念
- 1.2 编程工具
- 1.3 变量
- 1.4 函数 Function
- 1.5 基本语法
- 1.5.1 运算符
- 1.5.2 if
- 1.5.3 for
- 1.5.4 其他语法
- 1.3 类 Class
- 二、编程块
- 2.1 方块的概念
- 2.2 List<T>结构
- 2.3 获取方块
- 2.4 方块的使用
- 三、Ship 类
- 3.1 简介
- Ship v0.5
- 代码
- 手册(待更新)
- 例子(待更新)
- Ship v1.0
- 代码
- 例子
- 文档
- 实例化
- 内置变量
- 内置方法
- Target类
- 四、运动控制算法在SE中的应用
- 4.1 运动控制介绍
- 4.2 过程控制
- 4.3 震荡和动态误差
- 4.4 误差累加方案
- 4.5 PID算法
- 4.6 对PID算法的一点点简化
- 4.7 一阶惯性系统的PID算法优化的研究
- 五、MEA方块类
- 5.0 核心代码目录
- v1.0核心代码
- v1.1 核心代码
- v2.0 核心代码
- 5.1 类的概念
- 5.2 MEA的方块类(Block)
- 5.3 方块类文档
- 5.4 方块类2.0 全教程
- 5.4.1 安装和使用
- 5.4.2 方块类(Block)
- 5.4.3 显示屏类(DisplayScreen)
- 5.4.4 LCD类(LCD)
- 5.4.5 主控座椅类(Cockpit)
- 六、疯猴的编程笔记
- 第一个程序
- 获取和控制其他块
- 物流与生产
- 界面与通信
- 运动与姿态
- 侦测与导航
- 七、SteamZhou的笔记
- 有趣而花里胡哨的IDEA
- 八、质子对撞炮的笔记
- 属性 Property
- 接口 interface
