企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## **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> 如下图: 方便描述,下文中我们将 输出 = 误差 称为普通算法。 ![](https://box.kancloud.cn/5ba05e78856bd75084e458a98ce57ea2_1147x596.png) 图中红色是普通算法,蓝色是误差累加算法。 可以看到由于输出是误差在一定时间内的累加,误差累加算法在第一次抵达目标前会走得更平缓,在接近目标的过程中,它对误差的响应更加灵敏。 在第一次越过目标后,刚开始一段时间内,由于之前的正误差结果还在储存集中,累加的结果依然是正值,所以会出现越过目标后仍然在正加速的情况。 在震荡问题中,误差累加算法能一定程度上延长震荡周期,从而减少震荡。 在实际应用时,误差累加算法的计算周期一般很短(30帧,半秒内),因此并不会出现像图中这么明显的越过后依然加速的情况,总体上它让震荡效果变得更平缓。 **在实际应用中,如果没必要使用PID算法,又不想产生震荡,最好是采用误差累加算法,它对消除震荡真的非常有效**