十六届智能车基础四轮组路标:模糊PID控制电磁车方向(内有模糊PID的调试方法)

456
5
2021年2月1日 15时50分

写在前面

 


我将我的参赛代码已经在GitHub上进行了开源,欢迎大家下载

 

2020年全国大学生智能汽车竞赛浙江赛区二等奖开源代码

 

Snipaste_2021-01-26_19-46-12

 

接下来我将就十六届智能车竞赛为各位同学分享我的模糊PID调试思路,并且手把手教大家如何将我的开源代码加以利用,关于我的代码有什么不明白的都可以在评论区评论,博主看到了会第一时间回复的。

 

不过大家一定要注意,2021年的主控芯片跟2020年的不一样的,我用的主控芯片MK66FN2VLQ18然后今年要求的芯片是 Infineon系列的单片机了。我的代码工程是用IAR8.25及以上版本才能正常打开,所以我推荐大家拿我的代码做为一个参考即可。

 

我采用的 电感摆放方式是这样的,5个电感均采用 横电感的摆放方式

 

Snipaste_2021-01-26_20-46-11

 


效果图

 

早期楼上进环岛

 


代码讲解

 

这个模糊PID函数实现代码我是在GitHub上找的开源代码,理解之后进行了修改就运用到了我自己的程序当中。如有侵权,请联系我,立刻删除

 

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

 

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

 

1

 

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

 

2

 

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

 

3

 

得出来是这4个数字(5,5,6,6)

 

4

 

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

 

5

 

函数的调用是这个样子滴

 

6

 

至此模糊PID的代码实现介绍结束

 


模糊PID调试方法

 

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

 

7

 

8

 

在这里我给出一种PEF、DEF、UEF数组等幅增长时的规则表调试方法
经过分析,我们可以知道对应的P和D参数传进来之后,实际上调用的就是规则表里的相邻的4个数字,因此我的方法就是:

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

 

9

 

索引数组发送函数

 

10

 

最终我经过多次调整之后,可以将小车的速度稳定在2.5m左右,期待大家能在我的基础上更进一步~

 


(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧

 

QQ图片20210126200222

 

发表评论

后才能评论

评论列表(5条)

  • h1cxz_4550 2021年2月27日 下午3:09

    请教一下,这个隶属度可以这样求吗,加入E中线偏差在120和180内,那么E在180的隶属度=(180-E)/(180-120),E在120的隶属度=(E-120)/(180-120),可以这样求吗

  • W. 2021年2月9日 下午6:06

    兄弟,现在你GitHub上那个程序下载了打不开 了

    • better_coder 回复 W. 2021年2月10日 下午4:46

      现在再试试,不行的话用git下载