分析

这个模糊PID函数实现代码我是在GitHub上找的开源代码,理解之后进行了修改就运用到了我自己的程序当中,参考的是这位大佬的github程序:

https://github.com/Hyf338/13th-NXP-Smart-car/blob/master/Software/Projecct/USER/src/fuzzy.c

Fuzzy()这个函数就是我们模糊PID的实现了,参数是电感数值和电感数值的变化量,输出就是舵机所需要打的偏移量。

先放一个大致的介绍图,这个模糊PID的规则表其实大家用起来都差不多,如果需要小车跑到2.5m左右的话只需要微调这个规则表即可,但是如果3m往上走就需要理解模糊PID的本质并且写好隶属函数才可哦,我这个只是帮助大家入个门。

首先是这PEF[4]、DEF[4]、PEF[7]这三个数组的介绍了,大家看了函数的实现就会知道Fuzzy()这个函数会先将电感数值和电感数值变化量进行归属,例如某次电感数值为17,电感数值变化量为5,那么它就是PEF[2]和PEF[3]之间,DEF[2]和DEF[3]之间。

此时Pn = 3,Dn=3函数内通过特定的算法将这2个数值映射到规则表里的4个位置。

得出来是这4个数字(5,5,6,6),最后将这个4个数字做为舵机打角数组的索引取出舵机打角数组中的4个数值,并且这个数值进行一定的运算之后得出最终的舵机打角。

调试方法

经过上面的介绍之后我们就很清楚了,我们只需要调整这些参数就可以了:

在这里我给出一种PEF、DEF、UEF数组等幅增长时的规则表调试方法。

经过分析,我们可以知道对应的P和D参数传进来之后,实际上调用的就是规则表里的相邻的4个数字,因此我的方法就是:

首先按照大致的规则表跑一圈,然后我在电磁车电感差比和数值小于特定数值的(车子快要冲出赛道)、或者我手动发射一个串口信号(车子运行姿态不好) 的时候,车子就会通过串口传出来当时调用的是哪4个数组下标,然后再微调这4个数组数值的大小,打角不够就调整数值使其运算之后的输出数值变大,反之则调整数值使其运算之后的输出数值变小。