Получение смещения из данных акселерометра с помощью Core Motion

Я разрабатываю приложение дополненной реальности, которое (на данный момент) хочет отображать простой куб поверх поверхности и иметь возможность перемещаться внутри пространство (вращающееся и перемещающееся), чтобы смотреть на куб под разными углами. Проблема калибровки камеры не имеет значения. Узнать вращение камеры очень просто с помощью Gyroscope и Core Motion. Я делаю это так:

if (referenceAttitude != nil) {
    [attitude multiplyByInverseOfAttitude:referenceAttitude];
}

CMRotationMatrix mat = attitude.rotationMatrix;

GLfloat rotMat[] = {
    mat.m11, mat.m21, mat.m31, 0,
    mat.m12, mat.m22, mat.m32, 0,
    mat.m13, mat.m23, mat.m33, 0,
    0, 0, 0, 1
};

glMultMatrixf(rotMat);

Это действительно хорошо работает. В любом случае, когда я пытаюсь найти смещение в пространстве во время ускорения, возникает больше проблем. Пример Apple Teapot с Core Motion просто добавляет значения x, y и z вектора ускорения к вектору положения. Это (помимо того, что не имеет особого смысла) приводит к возвращению объекта в исходное положение после ускорения. (Так как ускорение идет от положительного к отрицательному или наоборот). Делали это так:

translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;

Что мне делать, чтобы узнать смещение по ускорению в каком-то истанте? (с известной разницей во времени). Глядя на другие ответы, кажется, что мне нужно дважды интегрировать, чтобы получить скорость от ускорения, а затем положение от скорости. Но в коде вообще нет примера, и я не думаю, что это действительно необходимо. Кроме того, существует проблема, заключающаяся в том, что когда iPhone все еще находится в самолете, значения акселерометра не равны нулю (я думаю, есть некоторый шум). Насколько я должен фильтровать эти значения? Должен ли я вообще их фильтровать?

19
задан eugeniodepalo 15 December 2010 в 19:30
поделиться