所以我用C编写了一个程序,以非常高的数据速率打印3轴陀螺仪的值。这些值是角速度的瞬时值,如果设备静止,则在运动时上升并下降。我需要它来保持高值并在返回到位置时回到零。 如果我在固定的采样时间内整合这些值,我会实现这个目标吗?我如何进行整合?我是C编程的初学者。 谢谢
答案 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
,但在你做到这一点之前,你需要做一些事情:
写一些代码将它们放在一起 - 就像这样:
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);
}
}
这应该让你开始走正确的道路,我希望:)
答案 2 :(得分:0)
这实际上并不是关于C,而是一般的信号处理,所以阅读它是个好主意。
某些集成可能没有错误去除噪音。您可以使用不同的算法。
要“保持高值”,你应该想一想实际意味着什么:检测和存储曲线的最大值。通过一些离散区分,您可以检测尖峰,例如:由于掉在桌子上这是一个广泛的领域,只是做一些实验。
看到模式的好动作是将它们显示为曲线,类似于示波器。如果你不想在C中进行图形处理,你可以将值传递给套接字并使用像Python这样的高级语言来绘制和进行一些处理。只是一个想法!