自平衡小车
- 负责人:陶鑫
介绍
- 自平衡小车是指只有两个轮子,通过前后移动、加减速来防止自身倾倒的小车。本项目尝试通过arduino单片机接受并处理陀螺仪/加速度计的信号,控制直流电机来达到这一目的。
原理
1.角度测算
- 陀螺仪/加速度计可以输出三向平移加速度(ax、ay、az)和转动角速度(gx、gy、gz)。假设前进方向为Y轴,横向为X轴,有两种方式可以计算X轴旋转角度。
- ①加速度计算角度
- 重力会被加速度计检测到,当加速度计倾斜一定角度时,ay、az会有重力分量。因此通过公式angle=arctan(ay/az)得到加速度计所处的角度。(仅用一个方向的加速度即可算出,两个方向可以尽可能减小误差)
- 此方法直接测量当前加速度计与重力所成角度,优点是重力加速度很大,而且公式通过两个值之比计算,受仪器本身的误差影响较小。缺点是会受到震动、小车运动的加速度等扰动的影响,使测量值产生很大的偏差。
- ②角速度计算角度
- 陀螺仪能以一个很高的频率输出当前的角速度,因此可将每个接收到的角速度值乘以周期,当频率足够高时,近似于积分,可以得到转过的角度。angle(n)=angle(n-1)+gx(n)*dt。
- 此方法测量一定时间所转过的角度,优点是受扰动小,陀螺仪对角速度的测量基本不会受其他因素的扰动。缺点在于测量值的累加会凸显出仪器本身的微小误差,时间越长,偏差越大。
- 由于两种方法各有优缺点,所以一般通过卡尔曼滤波算法将两者整合,得到一个统计上扰动较小的测量值。
2.卡尔曼滤波算法
- 此方法通过一系列预测值、测量值等具有高斯噪声的数值在统计上计算出最优的估计值。角度计算刚好有加速度计作为测量值,陀螺仪作为预测值,非常适合使用卡尔曼滤波算法。
- 真正的卡尔曼滤波算法比较复杂,网上有直接的代码。但事实上本实验只是为了解决特点问题,只有两组数据,没有必要使用矩阵,很多变量其实也只是常数,可以作大量简化,有助于减轻主控板的负担和代码的麻烦程度。
- 具体步骤为:
①通过前一刻的最优值,计算此刻的预测值angle(n')=angle(n-1)+gx(n)*dt ②计算预测值方差P(n')(可信度)(等于前一组角度的可信度P(n-1)+Q) ③计算此刻的最优值angle(n)=angle(n')+Kg(n-1)(angle(n'')-angle(n')) ④更新Kg(n),Kg(n)=)= P(n')/(P(n')+R) ⑤计算此刻angle的方差P(n)=(1-Kg(n))P(n’)(自回归的体现)
式中:Q为陀螺仪的测量误差,R为加速度计的测量误差。angle(n'')为加速度算出的角度。Kg综合了Q、R和上一组数据的P,是加速度计相对于陀螺仪预测值可信度的评估。
- 没有认真看那个百度链接的人估计看不懂我在说什么,直接看效果图吧。可以看到蓝色曲线同时拥有前两者的优点,而没有它们的缺点。
3.PID控制
- 通过PID控制电机,可使电机更快、更准确地转过需要的角度。PID算法由比例单元、积分单元、微分单元组成。u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt]比例单元用于增大(或减小)输出信号,以消除反馈信号与目标信号的误差;但由于延迟、惯性等原因,比例单元的调节可能出现过调,再反向调节的情况,如此反复形成振荡,类似的稳态误差可通过积分单元消除;微分单元用于预测之后的误差,提前做出改变,以抵消仪器本身的延迟。三个单元分别由三个参数kp、TI、TD控制。
- 由于本项目目前的目标在于使小车在原地保持平衡,主要在于消除它的稳态误差,不会来回摆动,因此需要比例单元、积分单元和微分单元。如果要让小车在运动中保持平衡,则可去除积分单元,据说效果更佳,因为积分单元带来了一定的延迟不利于小车平衡,而它消除稳态误差的功能在运动过程中作用不大。
- 此处为非常形象恰当的PID通俗解释:http://www.arduino.cn/thread-4625-1-1.html
- 此处提供arduino官网对PID的解释和PID库函数下载:http://playground.arduino.cc/Code/PIDLibrary
4.驱动控制
- L298电机驱动板需要输入6个信号,其中两个使能端控制两个电机是否通电运作,四个信号分别控制两个电机。以某一台为例,ENA=1,IN1=1,IN2=0,则电机正转;IN1=0,IN2=1,则电机反转;IN1IN2同为1或0,则电机固定在某一位置不动。
- 需要注意的是,arduino提供的电压可能无法满足电机的需求,需要外接电源和升压电路保证电机动力足够。
设备
- arduino主控板
- 两台减速直流电机,如果带码盘,还可以增加光耦传感器直接检测速度
- 电机驱动板,需要带光耦隔离,否则连续的正负变化产生的反电动势会烧坏电路,本次使用L298
- 陀螺仪、加速度计,本次使用mpu-6050,同时整合了三轴加速度和角速度测量
- 小车车架、小轮、电源
第一次尝试
存在的问题
- ①驱动板的电源使用的是单片机输出的5V电压,电流无法达到要求大小,电机减速比过大。由此导致pwm占空比控制电机电压的范围不够大,需要电机慢速旋转时,电机会直接停止,需要电机快速旋转时,电机无法达到要求速度。因此,在图中会看到,电机来回摆动,无法慢慢趋向于稳定平衡。
- ②小车的结构设计得并不是很好,过重,重心过高,且与支点不在同一垂线上。理论上,这几点都已通过控制程序弥补,只是硬件并不能完美地执行。在硬件不给力的情况下,只能减小结构对硬件带来的负担。
- ③参数尚未设定完美。
解决方案
- 电源会尝试使用9V干电池,电机尝试拆开外部传动结构,减少减速比,甚至直接与小轮连接(像四驱车那样)。
- 每次调节参数都要停下小车,重新导入程序,由于参数太多,很麻烦。小车运行时也不能连数据线到电脑上看内部数据。加一个蓝牙串口并不是很难的事,考虑是否通过手机实时调节原本固定的参数,观察小车最稳定的时候的参数值。
- 源代码会在整理、添加注释后放在网页上。
- 本实验基础原理与避震云台相通,有兴趣的老师同学可以顺便去看看(网页尚未做完)http://phylab.fudan.edu.cn/doku.php?id=home:whyx:proj:4zhou
已经做得很不错了,可以增加一个蓝牙控制设备,通过遥控器可以使得遥控小车前进后退转向等 — 俞熹 2015/01/12 08:33
寒假正在干这件事。 — 陶鑫 2015/01/30 17:39