自平衡小车

  • 自平衡小车是指只有两个轮子,通过前后移动、加减速来防止自身倾倒的小车。本项目尝试通过arduino单片机接受并处理陀螺仪/加速度计的信号,控制直流电机来达到这一目的。
  • 陀螺仪/加速度计可以输出三向平移加速度(ax、ay、az)和转动角速度(gx、gy、gz)。假设前进方向为Y轴,横向为X轴,有两种方式可以计算X轴旋转角度。
  • ①加速度计算角度
  • 重力会被加速度计检测到,当加速度计倾斜一定角度时,ay、az会有重力分量。因此通过公式angle=arctan(ay/az)得到加速度计所处的角度。(仅用一个方向的加速度即可算出,两个方向可以尽可能减小误差)
  • 此方法直接测量当前加速度计与重力所成角度,优点是重力加速度很大,而且公式通过两个值之比计算,受仪器本身的误差影响较小。缺点是会受到震动、小车运动的加速度等扰动的影响,使测量值产生很大的偏差。
  • ②角速度计算角度
  • 陀螺仪能以一个很高的频率输出当前的角速度,因此可将每个接收到的角速度值乘以周期,当频率足够高时,近似于积分,可以得到转过的角度。angle(n)=angle(n-1)+gx(n)*dt。
  • 此方法测量一定时间所转过的角度,优点是受扰动小,陀螺仪对角速度的测量基本不会受其他因素的扰动。缺点在于测量值的累加会凸显出仪器本身的微小误差,时间越长,偏差越大。
  • 由于两种方法各有优缺点,所以一般通过卡尔曼滤波算法将两者整合,得到一个统计上扰动较小的测量值。
  • 此方法通过一系列预测值、测量值等具有高斯噪声的数值在统计上计算出最优的估计值。角度计算刚好有加速度计作为测量值,陀螺仪作为预测值,非常适合使用卡尔曼滤波算法。
  • 真正的卡尔曼滤波算法比较复杂,网上有直接的代码。但事实上本实验只是为了解决特点问题,只有两组数据,没有必要使用矩阵,很多变量其实也只是常数,可以作大量简化,有助于减轻主控板的负担和代码的麻烦程度。
  • 具体步骤为:
            ①通过前一刻的最优值,计算此刻的预测值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,是加速度计相对于陀螺仪预测值可信度的评估。

  • 没有认真看那个百度链接的人估计看不懂我在说什么,直接看效果图吧。可以看到蓝色曲线同时拥有前两者的优点,而没有它们的缺点。

此图反应了卡尔曼滤波的效果

  • 通过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
  • L298电机驱动板需要输入6个信号,其中两个使能端控制两个电机是否通电运作,四个信号分别控制两个电机。以某一台为例,ENA=1,IN1=1,IN2=0,则电机正转;IN1=0,IN2=1,则电机反转;IN1IN2同为1或0,则电机固定在某一位置不动。
  • 需要注意的是,arduino提供的电压可能无法满足电机的需求,需要外接电源和升压电路保证电机动力足够。
  • arduino主控板
  • 两台减速直流电机,如果带码盘,还可以增加光耦传感器直接检测速度
  • 电机驱动板,需要带光耦隔离,否则连续的正负变化产生的反电动势会烧坏电路,本次使用L298
  • 陀螺仪、加速度计,本次使用mpu-6050,同时整合了三轴加速度和角速度测量
  • 小车车架、小轮、电源

自平衡小车试作型1号

  • ①驱动板的电源使用的是单片机输出的5V电压,电流无法达到要求大小,电机减速比过大。由此导致pwm占空比控制电机电压的范围不够大,需要电机慢速旋转时,电机会直接停止,需要电机快速旋转时,电机无法达到要求速度。因此,在图中会看到,电机来回摆动,无法慢慢趋向于稳定平衡。
  • ②小车的结构设计得并不是很好,过重,重心过高,且与支点不在同一垂线上。理论上,这几点都已通过控制程序弥补,只是硬件并不能完美地执行。在硬件不给力的情况下,只能减小结构对硬件带来的负担。
  • ③参数尚未设定完美。
  • 电源会尝试使用9V干电池,电机尝试拆开外部传动结构,减少减速比,甚至直接与小轮连接(像四驱车那样)。
  • 每次调节参数都要停下小车,重新导入程序,由于参数太多,很麻烦。小车运行时也不能连数据线到电脑上看内部数据。加一个蓝牙串口并不是很难的事,考虑是否通过手机实时调节原本固定的参数,观察小车最稳定的时候的参数值。
已经做得很不错了,可以增加一个蓝牙控制设备,通过遥控器可以使得遥控小车前进后退转向等 — 俞熹 2015/01/12 08:33
寒假正在干这件事。 — 陶鑫 2015/01/30 17:39
  • home/whyx/proj/balance_car.txt
  • 最后更改: 2015/01/30 17:30
  • (外部编辑)