由于之前做过平衡车发过帖子,有好多朋友都对这个比较感兴趣,也提出过许多问题,可能并不能一一解答,对于部分常见问题在这里做一些说明,希望对感兴趣的朋友有帮助,同时希望大家都能做出高稳定性的自平衡车。
首先说明硬件相关知识,通常情况下需要的传感器有加速度计,陀螺仪,编码器或者码盘,其中只要有加速度计和陀螺仪就可以实现较稳定的平衡~ 加速度计和陀螺仪有许多型号,包括数字式的和模拟的,模拟的需要AD转换,数字的需要编写通信程序。
电机的选择,首先是扭力,扭力稍大的电机会比较好,因为快速的可以提供较大的加速度f=m*a,可以选用扭力稍大的直流电机或直接选用减速电机
然后就是电机驱动,选择驱动能力大一点的驱动器,否则容易烧坏,当然自己用MOS搭H桥也行(相关知识自行百度)
后就是控制器,首先要求控制器速度尽量快一点,因为平衡车要求实时性强,太慢可能不好稳,所以不建议用51单片机做,表示目前也没听说过用51做成的,同时51的好多片上资源局限也会让你非常难受,AVR是可以做的,MSP430也可以,本人用的是STM32做的,当然飞思卡尔也可以做,具体设计可以自己做PCB控制板,也可以用开发板做,自己设计的可能更精小,更专用些~
还有电池选用,电源处理方面一些只是不在细说,强调一点是用模拟式传感器要做好电源隔离防止干扰。
关于组装重要的两点,一个是重心尽量低一点容易稳,同时注意配重让车体前后重心平衡,二是传感器安装要稳,传感器处振动要小一些,否则会有很大干扰。
接下来说明控制模型,平衡车可以看做倒立摆模型,普通单摆在运动过程中受到回复力使它在平衡位置附近来回摆动,如果没有空气阻尼,摆动不会停止,并且空气的阻尼力和速度成正比。而我们的模型相当于倒立的单摆,原来由重力的分力提供恢复力,现在我们通过给电机的电压控制电机加速度来提供恢复力,同时还要通过来控制阻尼,所以我们把这两个力融合到一个公式里,在一定条件下我们认为给电机的力和电压有线性关系,有f=k1*angle+k2*w,angle是角度,w是角速度,正好与我们的模型匹配,这个公式就是我们的控制方程,这里选择angle而不是sin是因为小角度下做了近似,当然这个公式的作用是控制让角度为0,如果控制目的是让它为某一角度时可以在angle上加或者减你的设定值。
由上面的控制方程知道我们需要根据车体当前的角度和角速度来做控制,所以我们需要传感器采集角度和角速度,首先加速度计可以采集到它本身轴上的加速度,根据重力加速度在加速度计轴方向上的分量呈三角函数关系可以得出角度,但是加速度计存在干扰问题,包括微弱振动会使它出现许多高频震荡的干扰,同时小车在移动过程中本身的加速度对它加速度测量的影响,所以仅靠加速度计测量角度精度较差,难以运用到我们的控制中;而陀螺仪是用来测量角速度的传感器,我们知道,角速度的积分就是角度,通过积分我们可以得到较为平滑的角度曲线,并且不存在太多干扰因素,但仅仅用角速度积分来测量角度存在一个问题就是积分漂移问题,随着积分时间加长,积分速度很快,积分的时候会把微小的误差进行积累,久而久之误差会不断的增大,以至于难以用于控制,克服积分漂移首先要把陀螺仪零点矫正的特别精确,但由于陀螺仪本身就存在零点漂移问题,所以误差不可避免,我们只能把它矫正在零点附近。
由上述只加速度计测角度存在干扰,曲线不平滑,但测量存在基准(重力方向),陀螺仪积分曲线平滑,但不存在基准,存在积分漂移,所以我们可以在陀螺仪测量角速度积分的基础上利用加速度计测量的角度对其进行实时校准,我们知道在运算速率很高时即使很小的误差也会被终校准回去,这样通过加速度计和陀螺仪来实现角度的测量可以满足我们的控制要求。
具体加速度计角度和陀螺仪角度的融合测量软件滤波方法常用的有卡尔曼滤波和互补滤波,卡尔曼滤波相对复杂,但效果很不错,互补滤波参数调整好了也有相当不错的效果在此给出互补滤波公式angle=k1*(angle+(w-zw)*dt)+k2*(acc-zacc)式中k1,k2为参数,通常开始调试时选k1=0.98,k2=0.02,调试中保持k1+k2=1,其中w为角速度,dt为积分时间,acc为加速度计算的角度,zw为角速度零偏,zacc为加速度角度零偏,如果角度波形震荡严重可适当增大k1,如果有角度漂移可适当减小k1,角度滤波的精确性直接影响控制效果。
再说一下控制方程的参数调节,我们可以看到模型给出的控制方程其实是PD调节,f=p*angle+d*w,熟悉PID控制的童鞋应该都有相关的PID参数调节经验的,首先我们是不加D的,也就是说D=0,然后调节P使得车体能够较稳定的在平衡位置附近震荡或者说摇摆,但不会倒下,当我们把P调到是个的值是车已经可以立起来了,这时候我们通常略微增大P后开始加入D进行调节,让小车更加稳定,快速性更好,这样反复调节终可以让车体看起来站着纹丝不动,受到轻微干扰后能快速回稳,到这里我们的直立控制就完成了。
至于让车前进后退转弯什么的就比较简单了,直接在直立控制上叠加就行。
之前我们说的是直立控制,我们用到的是角度(倾角)环,如果我们想控制小车运动速度我们可以用编码器或者码盘检测来实现速度环,速度环同样是速度PID控制,之后与角度环叠加即可。
再说一点高级点的,前一阵子看到有个同学调车时车的零点总是飘,然后看到他的车在零点飘了之后车只有在在不断向前走的时候才能直立,不能停了,分析存在稳态误差,无法稳定到预定角度,根据控制理论知识知道增大K可以减小稳态误差,但由于电机速度极限限制(太大后就出了线性区)难以实现,所以可以增加系统积分环节来让系统型次大于一消除稳态误差,或者可以利用滑动参数PID消除稳态误差,同时可采用自适应算法来消除陀螺仪零点漂移。