所以我用C编写的程序在一个非常高的数据速率来打印3轴陀螺仪的数值。 的值是上升,对运动和下降,如果该设备是静止的角速度的瞬时值。 我需要它来保持较高的值,并在返回位置回到零。 如果我在一个固定的采样时间整合价值,我会做到这一点? 我该如何去整合? 我在C编程初学者。 谢谢
Answer 1:
角速度是:
ω=Δφ/ΔT=(φN - φN-1)/(T N - T N-1)
所以, 目前的角度可以从前面的角度来计算:
φN =φ-1 +ω·Δt的
而相应的C代码...
double angle = 0; /* or any initial value */
for ( ;; ) {
double omega = get_angular_velocity();
angle += omega * timestep;
}
......提供的功能get_angular_velocity
在定期返回一个值, timestep
的时间间隔。
Answer 2:
首先你要明白一个数字陀螺仪的物理方面:它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
,但在此之前,你能做到这一点,你需要几件事情:
- 陀螺增益; 这被在数据表相关联到其上的值在指定的灵敏度(对于2000dps的灵敏度即GAIN = 0.07) - 它都应该是在数据片的表,它依赖于陀螺仪的配置方式。
- 你需要选择在您整合值的时间间隔,这又取决于陀螺仪配置(请参阅DPS设置),但你应该罚款10或20毫秒。
- 确保你有一个很好的周期性读陀螺仪值(即只有一个每10ms)
编写一些代码来把它所有在一起 - 就像这样:
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); } }
这应该让你开始在正确的道路上,我希望:)
Answer 3:
这实际上是没有多少关于C,但一般信号处理,所以它是阅读关于一个好主意。
有些集成可能不会是错误的去除噪声。 还有,你可以使用不同的算法。
“高举高值”,应该只是觉得有点什么实际意义:检测和存储曲线的最大值。 对于一些离散的分化,可以检测尖峰,例如,由于在一个表中下降。 这是一个广泛的领域,只是做了一些实验。
一个良好的起动看到的图案是将它们显示为曲线,类似于示波器。 如果你不想在C中的图形处理,你可能管的值到插座内,用高级语言如Python绘制和做一些处理。 只是一个想法!