如何使用mpu 6050在3D坐标中获得位置?

时间:2016-01-12 07:33:45

标签: opengl 3d accelerator mpu

我正在使用MPU6050和我设计的芯片来检测物体移动。 项目分为两个阶段:

  • 阶段I:可视化对象方向(DONE)
  • 第二阶段:使用陀螺仪和加速器可视化3D坐标中的物体位置。我遵循本网站的说明:http://www.x-io.co.uk/oscillatory-motion-tracking-with-x-imu/。必须通过“双重整合”从这个位置得出这个位置;加速度计首先进行积分以产生速度,然后再次产生位置。

    void COpenGLControl::Update()
    {
      double mX;
      double mY;
      double mZ;
      mX = mXCordinate*9.81;  // mXCordinate-> X accelerator
      mY = mYCordinate*9.81;  // mYCordinate-> Y accelerator
      mZ = mZCordinate*9.81;  // mZCordinate-> Z accelerator
    
      /* linear velocity*/
      curVelX = preVelX  + mX *sampleRate;
      curVelY = preVelY  + mY*sampleRate;
      curVelZ = preVelZ  + mZ*sampleRate;
      /* linear location*/
      curLoX = preLoX + curVelX*sampleRate;
      curLoY = preLoY + curVelY*sampleRate;
      curLoZ = preLoZ + curVelZ*sampleRate;
    
      preVelX = curVelX;
      preVelY = curVelY;
      preVelZ = curVelZ;
    
      preLoX = curLoX;
      preLoY = curLoY;
      preLoZ = curLoZ;
     }
    

然后curLoX,curLoY,curLoZ用于使用openGL可视化3D对象:

glPushMatrix();
glTranslatef(curLoY,curLoX,curLoZ); //-> object moving visualization
glBegin(GL_QUADS);  
........       
glPopMatrix();

我的目的是当向上,向下,向左,向右移动物体时,3D物体将具有相同的移动。但是,当我在http://www.x-io.co.uk/oscillatory-motion-tracking-with-x-imu/中旋转设备而不是线性移动时,对象才会移动。 我该如何解决这个问题? enter image description here

1 个答案:

答案 0 :(得分:1)

加速度计不会给你物体的位置,而是它的名字,加速度,即速度的变化率。

您必须随时间对加速度计的值进行双重积分,以确定对象的位置。但是有一个问题:技术上这样做只适用于自由落体的身体。在地球上(以及宇宙中的每一个巨大的身体)都有引力。重力的机械效应是加速度。所以在地球上你可以测量到地球重心的恒定加速度大约9.81m /s²(那里你已经有9.81的常数,但你完全误解了它的含义)。

没有物理上正确的方法来弥补这一点。加速度是加速度,实际上我们都是在时空中移动(这就是为什么地球上的时间比在外层空间慢一点)并且如果你在4D时空中绘制IMU的运动,它就是实际的适当的运动。

然而,您可能希望看到的是局部加速参照系中的相对运动。如果假设恒定加速度,则可以采用此加速度矢量并从测量值中减去该加速度矢量。当然,对于IMU的每次旋转,加速度矢量都将旋转,因此您必须集成IMU旋转并在减去之前将其应用于加速度偏移矢量。假设相对运动很短并且频率相当高,您可以通过对加速度计信号进行低通滤波来确定重力偏移矢量。