整合3轴陀螺仪的读数?

所以我用C编写了一个程序,以非常高的数据速率打印3轴陀螺仪的值。 这些值是角速度的瞬时值,如果设备静止,它会随着运动而上升并下降。 我需要它来保持高值并在返回到位置时回到零。 如果我在固定的采样时间内整合这些值,我会实现这个目标吗? 我该如何进行整合? 我是C编程的初学者。 谢谢

角速度是:

ω=Δφ/Δt=(φn-φn -1 )/(t n -t n-1

因此, 当前角度可以从之前的角度计算为:

φn=φn -1 +ω·Δt

相应的C代码是……

double angle = 0; /* or any initial value */ for ( ;; ) { double omega = get_angular_velocity(); angle += omega * timestep; } 

…假设函数get_angular_velocitytimestep间隔定期返回一个值。

首先,您需要了解数字陀螺仪的物理方面:它suffers from drift (它不会返回0,但通常会在很长一段时间内发生)同样重要的是它通常是biased ; 这是一个校准问题。

陀螺仪偏差可以通过在静止时读取轴的值来观察。 如果它读取0以外的任何内容,那就是你的偏见。 你需要弥补这一点。 你怎么做呢? – 校准

陀螺仪校准:读取给定时间段的轴值(1000个样本应该这样做)。 平均样本以获得偏差值。 You have to subtract this bias value from all readings when running you code to get a valid reading. 如果你在陀螺仪不动的时候读零,你会知道你做得对。

接下来,解释陀螺仪数据:陀螺仪为您提供angular velocity values 。 这些对你的原始forms没什么用处; 所以,你随着时间的推移整合它们来获得angle values ,但在你做到这一点之前,你需要做一些事情:

  1. 陀螺仪的增益; 这在数据表中指定为与其灵敏度相关的值(即,对于2000dps的灵敏度,GAIN = 0.07) – 它应该都在数据表的表格中,这取决于陀螺仪的配置方式。
  2. 你需要选择一个整合值的时间间隔,这又取决于陀螺仪的配置(参见dps设置),但你应该没有10或20毫秒。
  3. 确保您以良好的周期(即每10毫秒一个)读取陀螺仪值
  4. 写一些代码把它们放在一起 – 就像这样:

     while(1) { startInt = mymillis();// this function returns the current time in ms gyroRaw = readGyro(); //Convert Gyro raw to degrees per second rate_gyro = (float) gyrRaw * GYRO_GAIN; //Calculate the angles from the gyro gyroAangle += rate_gyro * DT; //print the gyro angle ...or anything you find useful //Each loop should be at least 20ms. while(mymillis() - startInt < 20) { usleep(100); } } 

这应该让你开始正确的道路,我希望:)

这实际上并不是关于C,而是一般的信号处理,所以阅读这个是个好主意。

一些集成可能没有错误去除噪音。 您可以使用不同的算法。

要“保持高值”,你应该想一想实际意味着什么:检测并存储曲线的最大值。 通过一些离散区分,您可以检测尖峰,例如由于在表中丢失。 这是一个广泛的领域,只是做一些实验。

看模式的好启动器是将它们显示为曲线,类似于示波器。 如果你不想在C中进行图形处理,你可以将值传递给套接字并使用像Python这样的高级语言来绘制和进行一些处理。 只是一个想法!