整合3轴陀螺仪的读数?

时间:2015-07-07 20:36:54

标签: c beagleboneblack gyroscope i2c

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

3 个答案:

答案 0 :(得分:1)

角速度是:

ω=Δφ/Δ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_velocity定期以timestep间隔返回值。

答案 1 :(得分:1)

首先,您需要了解数字陀螺仪的物理方面:它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。这些对你的原始形式没什么用处;所以,你随着时间的推移整合它们以获得angle values,但在你做到这一点之前,你需要做一些事情:

  1. 陀螺仪增益;这在数据表中指定为与其灵敏度相关的值(即,对于2000dps的灵敏度,GAIN = 0.07) - 它应该都在数据表的表中,这取决于陀螺仪的配置方式。
  2. 您需要选择积分值的时间间隔,这又取决于陀螺仪配置(请参阅dps设置),但您应该没有10或20 ms。
  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);
        }
    }
    
  5. 这应该让你开始走正确的道路,我希望:)

答案 2 :(得分:0)

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

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

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

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