概述

平衡车的首要目的是要实现车体平衡,在实现车体平衡基础上调节车体速度、改变车体运动方向。而维持车体平衡、变速、转向的动力都来自于车体的两个车轮。车轮转动由两个直流减速电机驱动。因此从控制角度来看,车体作为一个控制对象,它的控制输入量是两个电机的转动速度。 因此,要完成平衡车的制作需要完成3个方面的工作 下面将分别对以上三点展开介绍。

原理介绍

车体平衡控制

控制车体平衡的直观经验来自于人们日常生活经验。一般的人通过简单练习就可以 让一个直木棒在手指尖上保持直立。这需要两个条件:一个是托着木棒的手掌可以移动;另一个是眼睛可以观察到木棒的倾斜角度和倾斜趋势(角速度)。通过手掌移动抵消木棒的倾斜角度和趋势,从而保持木棒的直立。这两个条件缺一不可,实际上就是控制中的负反馈机制 。如图所示。   车体平衡控制也是通过负反馈来实现的,与上面保持木棒直立比较则相对简单。因为车体有两个轮子着地,车体只会在轮子滚动的方向上发生倾斜。控制轮子转动,抵消在一个维度上倾斜的趋势便可以保持车体平衡了。 如图。   那么车轮如何运行,才能够最终保持车体平衡稳定? 为了使车体平衡,需要在平衡上安装陀螺仪,我们的平衡车安装的是MPU6050三轴陀螺仪模块。通过采集陀螺仪数据,在电机上施加一个控制信号,使车体保持平衡。为了保持平衡我们采用了角度PD(比例-微分 )控制算法,换句话说PD控制器负责车体平衡。PD控制器由程序中angleout()函数实现。用户只需要改变kp(比例项)和kd(积分项)参数就能使车体平衡。其中kalmanfilter.angle 和kalmanfilter.Gyro_x是把MPU6050模块采集的数据经过卡尔曼(kalman)滤波器滤波后得到的结果;angle0是期望车体平衡时候的角度,这里为0.
void angleout() {   balancecar.angleoutput = kp * (kalmanfilter.angle + angle0) + kd * kalmanfilter.Gyro_x;//PD }

车体速度控制

经过上面的步骤小车已经可以直立了,但是还存在两个问题: 为了解决上面两个问题,需要添加速度控制。速度控制一方面使小车静止时更稳定,不会偏向一边倒下;另一方面则是使小车能够直立行驶。速度环使用PI(比例积分)控制器。速度PI控制器通过BalanceCar库中的speedpiout函数实现。
Outputs = balancecar.speedpiout(kp_speed, ki_speed, kd_speed, front, back, setp0);//speed PI
用户只需要改变kp_speed(比例项)和ki_speed(积分项)参数就可以为小车添加速度控制。其中,kd_speed(微分项)置零即可;front和back是前进后退标志。

车体方向控制

经过上面两步调整,小车已经能够保持稳定直立了。由于左右电机实际存在一定偏差,需要引入方向环控制小车直走的方向从而防止小车行驶偏航。除此之外方向环还用于小车转弯的速度调节。方向控制采用PD(比例微分)控制。方向PD控制器通过BalanceCar库中的turnspin函数实现。
balancecar.turnspin(turnl, turnr, spinl, spinr, kp_turn, kd_turn, kalmanfilter.Gyro_z);//direction PD
用户只需要修改kp_turn(比例项)和kd_turn(微分项)就能调节方向环参数了。

调节电机速度

上面的平衡控制、速度控制和方向控制都会有一个输出,将3个输出通过BalanceCar库中的pwma函数叠加作用到电机上,至此平衡车制作就算完成了。