目录
前言
随着省赛的落幕,近一年的智能车的生涯也就此画上了句号,虽然结果没有那么耀眼,但也算对得起三个大一萌新这么久以来不分昼夜所付出的心血。
在此我想对电磁车中的算法和赛场上一些的状况作进一步总结,也算是给自己一个交代。
电感排布方案
我们知道,电感的基本排布分为水平,竖直和八字几种方案,而电感摆放位置的不同,可能会影响车体循迹的姿态。
通过实测我们发现:水平电感有助于直道循迹,八字电感,则有赛车助于过弯,竖直电感在普通赛道上值几乎很小,只有在某些特殊元素(如环岛)才会突增。
我们采用的是水平和八字电感共同循迹的方式,即在左右两端分别放上八字和水平电感,在电磁杆的中间和靠近赛车的中心位置各放置一个水平电感,用于特殊元素判断。具体排布可参考下图。
另外,为了更精确的采集赛道电磁值以至于不失真,需将电磁前瞻的高度稍微降低。
舵机算法修正
基本的舵机控制算法在上篇文章中已经提过,这里对其部分优化方案进行说明。
分段式PD算法
而在PD参数中,P参数控制响应速度,D参数消除稳差,那么可以想到,如果全局使用同一个PD参数,则会出现无法控制既在直道上平稳运行,又能很好的过各种弯道的局面。这时候就需要我们对PD参数进行分段控制。
而由于电磁车只能依靠电感传回的电磁信号判断赛道路况,所以可以将左右两边的电感值差作为分段控制的依据。
具体代码如下:
/* * * 分段PD * * */
if(backup<=15) angle_P=60;
else angle_P=95;
其中backup即为左右电感求得的偏差值,backup的值可以根据具体赛道及电感情况进行缩放处理。
使用函数曲线整定PD参数
上述的分段PD的办法是对其参数进行直接赋值,这种方法虽然可行,却不能达到很好的连续性效果,对此可以想到一种函数曲线的方法,将P的值关联backup,利用函数曲线对P值进行输出,从而更好的控制赛车在各个赛道元素上行驶的状态。
以下提供两种方案:
/* * * 舵机算法1 * * */
if(backup<=15) angle_P=63+backup*2;
if(15<backup<22) angle_P=33+backup*4;
if(22<backup<=30) angle_P=backup*5.5;
int k;
angle_P=22+(int)(n*n*k);
电机控制
目标速度的确定
上篇文章的末尾提到了目标速度的确定,由于不同路况赛车的最高速度不同,需要对不同路况分别设置目标速度,具体代码如下:
set_speed_L=90+(int)((30-backup)*1.2); //弯道最低+直道加速
差速控制算法
利用舵机控制赛车转向的同时,我们也可以利用差速对其进行辅助。同样根据backup的值对赛道路况进行判断,分别控制对赛车的两个轮子进行控制,达到差速的效果。程序设计上可以将上述set_speed_L计算公式中的90改为动态的bend_L/bend_R,再在具体bend_L/bend_R的计算中控制差速。
具体代码如下:
bend_L=(int)(90*cs_L);
bend_R=(int)(90*cs_R);
set_speed_L=bend_L+(int)((30-backup)*1.2);
set_speed_R