2016-01-12 6 views
0

Я работаю над проектом с использованием MPU6050 с моей разработанной микросхемой для обнаружения движения объекта. Проект разделен на 2 этапа:Как получить позицию в 3D-каналах с помощью mpu 6050?

  • Этап I: визуализировать ориентацию объекта (DONE)
  • Фаза II: визуализировать положение объекта в 3D cordinates с волчком и accelerator.I следовать инструкциям этого сайта: 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 используется для визуализации 3D объекта с OpenGL:

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

Акселерометры не дают вам положения объекта, но, ну, это на свое имя, ускорение, то есть скорость изменения скорости.

Вам необходимо дважды интегрировать значения с акселерометра, чтобы определить положение объекта. Но есть улов: Технически это справедливо только для тел в свободном падении. Здесь, на Земле (и в каждом другом массивном теле во вселенной), есть гравитация. Механическим действием силы тяжести является ускорение. Таким образом, здесь, на Земле, вы можете измерять постоянное ускорение около 9,81 м/с² в направлении центра тяжести Земли (у вас уже есть постоянная величина 9,81, но вы совершенно не поняли, что это значит).

Существует no физически правильный способ компенсировать это. Ускорение - это ускорение, и на самом деле все мы перемещаемся им в пространстве-времени (поэтому время на Земле идет немного медленнее, чем в космическом пространстве), и если вы построили движение ИДУ в 4D-пространстве-времени, это будет фактическое правильное движение.

Что вы, вероятно, хотите увидеть, однако, это относительное движение в локальной ускоренной системе отсчета. Если вы принимаете постоянное ускорение, вы можете взять этот вектор ускорения и вычесть его из измеренных значений. Конечно, при каждом повороте ИДУ вектор ускорения будет вращаться, поэтому вам нужно интегрировать вращение IMU и применить его к вектору смещения ускорения перед вычитанием. Предполагая, что относительные движения коротки и имеют довольно высокую частоту, вы можете уйти с фильтрами нижних частот для сигнала акселерометра для определения вектора смещения силы тяжести.

+0

После получения данных ускорителя, что мне делать дальше? – ios198

+0

@ ios198: Интегрируйте его со временем. Если вы не понимаете, что означает «интегрирование». Я не могу заменить курс в исчислении и численном выражении на StackOverflow. Соответствующие статьи на https://en.wikipedia.org/wiki/Integral https://en.wikipedia.org/wiki/Numerical_integration и для физики позади него https://en.wikipedia.org/wiki/Equations_of_motion – datenwolf

+0

В мой пост, я уже сделал это, чтобы получить местоположение объекта сверхурочно. Что я сделал здесь неправильно? Большое спасибо за Вашу помощь. – ios198