我已经通过以下公式计算了加速度计的倾斜角:

Angle_Accel = atan(Ax/sqrt(Ay*Ay+Az*Az))*(180/PI)


我现在想从陀螺仪计算倾斜角度,并且使用Gx坐标进行如下积分,但是我的结果不正确。

伪代码


每0.1秒测量一次Gx。
经过灵敏度系数和偏差校正后,我乘以180 / PI以转换为下降值。
然后我将频率除以10,然后将其添加到最终角度。


C代码

Gx = (((float)GYRO_PLAY.Gyroscope_X  )* GYRO_PLAY.Gyro_Mult)-Gx_Correction;

Gy = (((float)GYRO_PLAY.Gyroscope_Y  )*  GYRO_PLAY.Gyro_Mult)-Gy_Correction;

Gz = (((float)GYRO_PLAY.Gyroscope_Z  )* GYRO_PLAY.Gyro_Mult)-Gz_Correction;

Gx_temp = (Gx*degrees)/10.0; //degrees = 180/PI

Gx_Theta = Gx_Theta + Gx_temp;


我的角度不正确。我应该如何整合?
任何帮助深表感谢。

PS:我知道有一个类似here的问题,但它不能解决我的问题,请帮助我。

最佳答案

10Hz采样似乎太低了,无论如何您都对每个采样做不必要的工作。应用原始偏差偏移并积分原始值-如果需要,可以在演示时完成以度/秒为单位的转换,而以弧度/秒为单位的中间转换毫无用处。

机器人不关心甚至不了解您不需要任何转换的单位;只是符号和大小-灵敏度可以通过您的闭环控制器系数来处理。

如何确定Gx_Correction-它会随着时间的流逝而随热漂移而变化;如果不正确或无法通过某种方式跟踪,则集成商将放大该错误。

请注意,可能无法通过SPI获得更高的采样率-这就是片上DPM的目的。

另一个可能的错误来源是使用float。 STM32F4具有单精度FPU,因此该操作将在硬件中完成-但是,如果您在中断或线程上下文中使用浮点,则应意识到除非明确实现了浮点寄存器,否则不太可能在上下文之间保留它们,因此,例如,如果浮点运算被执行浮点运算的中断所中断,则该浮点运算将被破坏。

如果积分器只需要处理原始数据值,则不需要浮点数:

Gx_Theta += GYRO_PLAY.Gyroscope_X - Gx_Zero_Bias;

关于c - MPU6050-用于自平衡机器人的陀螺仪倾斜角测量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48188777/

10-09 08:45