【智能车】直立车之角度融合

每个平衡车都需要经历一个过程,那就是角度的获取。只有获取到当前角度值,才能对已知位置进行处理,进而使车子保持在它的机械零点位(何为机械零点,即是将你的车摆动在刚好又不会前倾又不会后仰的位置)。这时我们就需要一个传感器进行检测,我们采用的是MPU6050陀螺仪,该陀螺仪具有六轴,也就是里面集成了三轴加速度和三轴角速度,采集的问题不是今天的重点,今天的重点是如何将采集到的原始数值变成我们想要的角度呢。

  • 加速度反正切即为角度

在这里插入图片描述

注意,具体是X-Z反正切还是Y-Z反正切与你的陀螺仪摆放角度有关,在安装陀螺仪后,可以通过按某个轴进行旋转,哪个轴变化大即为该轴,我的是x轴变化大,即X-Z进行反正切。

安装如下:

在这里插入图片描述

ACC_x_z = atan2f((float)ACC_Z,(float)ACC_X) * (180.0/3.1415);//反正切求加速度角度

调用库函数math.h中的反正切函数,由于反正切后的值为弧度制,化为角度则要×180/π 得到角度。

  • 角速度积分即为角度

何为积分?累加即为积分!

GyroY = (float)((GYRO_Y*1.0-mpu_gyro_y_zero)*0.00018);
GYRO_y += GyroY;
为什么用Y轴的角速度,和前面一样,转动某个轴时变化最大即为该轴。
看代码时,应该会有点懵逼,下面进行解释一波。
  • 首先我们的陀螺仪在制作的时候,都会有点误差,又或者是我们在摆放的时候也会有点偏移,因此在静止的状态下,会出现不是为0,这时我们将其值成为零偏值,我们应该将它去掉,最终达到为零的效果,这也就会出现代码中为什么加mpu_gyro_zero 的原因了。如何测这个值,很简单,只需将陀螺仪静止放置,采集到的那个值即为零偏值,减去它即可。
  • 我们又会发现后面有一个系数0.00018这时啥呢?这个是积分系数,换句话说就是给陀螺仪的权重。我们都知道,我们为什么不单单只用陀螺仪作为姿态角度呢,原因在于它会温飘,就是随着温度波动。这时,我们会有疑问,这个系数是固定值吗?答案是否定,该系数需要我们根据波形的变化情况进行改动。PS:后面会有对波形整定进行讲解。莫着急。
  • 减去完零偏值,乘上积分系数,这时我们就需要进行积分啦,你可以看到,每次都是加上上一次值,即积分为累加。(C语言基础不太好的可能看有点懵,GYRO_y += GyroY;等价于GYRO_y =GYRO_y + GyroY;)每次该值都加上上次的值。

细心的人可能会发现,为什么不直接用一种方式就直接计算姿态角呢。

原因是加速计得到的角度噪声太大,毛刺多,但其准确度高,实时性强,而陀螺仪得到的积分角度毛刺较少,噪声较少,比较平滑,但是积分存在累计误差,长时间下来会出现较大偏差。因此,我们需要将两者的优点结合起来,实时性强,噪声小,毛刺少,较平滑,这就需要采用互补滤波了!
     temp = ( ACC_x_z - GYRO_y )*0.028;
     GYRO_y = GYRO_y + temp;
  • 将加速度反正切的角度和积分得到角度进行作差,乘以互补系数,再进行累加即为角度。这就是互补滤波!

  • 接下来介绍下如何调那个两个参数。

  • 首先我们调第一个积分系数,如果积分系数过大的话,会导致滤波后的角度出现超前偏移,如图:

在这里插入图片描述

  • 而积分系数过小的话就会出现滞后现象,如图:

  • 在这里插入图片描述

这个张图滞后还没那么明显,其实很接近最佳值了。

当我们调到融合波形大致与加速度反正切波形接近时,可以开始调互补系数了。互补系数其实换句话说也就是加速度与角速度两个得到的角度之间的权重了,互补系数大的话,加速度的权重大,得到的角度更接近实际值,但是噪声大,毛刺多,权重小的话,即表示角速度的权重大,加速度权重小,虽然噪声小,较平滑,但是却有点滞后了。当我们调到又毛刺小,又平滑,跟随又紧密的话,这时的波形就是我们想要的了!如图:

在这里插入图片描述

需要的工具有:虚拟示波器,USB转TTL串口一个,杜邦线两根,UART端口一组。

滤波是一个随缘的过程,如果改的参数效果不明显,将其系数改大一点或者改小点即可。

void YiJieComplementaryFilter(void)//一阶互补滤波
{
     Get_AccData();
     Get_Gyro();
     ACC_x_z = atan2f((float)ACC_Z,(float)ACC_X) * (180.0/3.1415);//反正切求加速度角度
     GyroY = (float)((GYRO_Y*1.0-mpu_gyro_y_zero)*0.00018);//积分系数
     GYRO_y += GyroY;//角速度积分得到角度
     temp = ( ACC_x_z - GYRO_y )*0.028;//互补系数
     GYRO_y = GYRO_y + temp;
}

看完感觉不错点个赞支持一下呗老铁~

发布了49 篇原创文章 · 获赞 14 · 访问量 2644

猜你喜欢

转载自blog.csdn.net/qq_42108414/article/details/86568298
今日推荐