我正在使用MPU6050和我设计的芯片来检测物体移动。 项目分为两个阶段:
第二阶段:使用陀螺仪和加速器可视化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/中旋转设备而不是线性移动时,对象才会移动。 我该如何解决这个问题?
答案 0 :(得分:1)
加速度计不会给你物体的位置,而是它的名字,加速度,即速度的变化率。
您必须随时间对加速度计的值进行双重积分,以确定对象的位置。但是有一个问题:技术上这样做只适用于自由落体的身体。在地球上(以及宇宙中的每一个巨大的身体)都有引力。重力的机械效应是加速度。所以在地球上你可以测量到地球重心的恒定加速度大约9.81m /s²(那里你已经有9.81的常数,但你完全误解了它的含义)。
没有物理上正确的方法来弥补这一点。加速度是加速度,实际上我们都是在时空中移动(这就是为什么地球上的时间比在外层空间慢一点)并且如果你在4D时空中绘制IMU的运动,它就是实际的适当的运动。
然而,您可能希望看到的是局部加速参照系中的相对运动。如果假设恒定加速度,则可以采用此加速度矢量并从测量值中减去该加速度矢量。当然,对于IMU的每次旋转,加速度矢量都将旋转,因此您必须集成IMU旋转并在减去之前将其应用于加速度偏移矢量。假设相对运动很短并且频率相当高,您可以通过对加速度计信号进行低通滤波来确定重力偏移矢量。