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

Я разрабатываю приложение дополненной реальности, которое (на данный момент) хочет отображать простой куб поверх поверхности и иметь возможность перемещаться в пространстве (как вращаясь, так и смещаясь), чтобы смотреть на куб под разными углами. Проблема калибровки камеры здесь не применяется, так как я прошу пользователя поместить iPhone на поверхность, на которую он хочет поместить куб, а затем нажать кнопку, чтобы изменить положение. Узнать вращение камеры очень просто с помощью 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 все еще находится в самолете, значения акселерометра не равны нулю (я думаю, есть некоторый шум). Насколько я должен фильтровать эти значения? Я вообще должен их фильтровать?


person eugeniodepalo    schedule 15.12.2010    source источник


Ответы (4)


Круто, есть люди, которые борются с той же проблемой, так что стоит потратить некоторое время :-)

Я согласен с утверждением Вестсайдера, поскольку я провел несколько недель, экспериментируя с разными подходами, и в итоге получил плохие результаты. Уверен, что ни для больших расстояний, ни для медленных движений продолжительностью более 1-2 секунд не будет приемлемого решения. Если вы можете жить с некоторыми ограничениями, такими как небольшие расстояния (‹10 см) и заданная минимальная скорость для ваших движений, то я считаю, что есть шанс найти решение - никаких гарантий. Если это так, вам потребуется довольно трудное время исследования и много разочарований, но если вы его получите, это будет очень-очень здорово :-) Может быть, эти советы вам пригодятся:

Прежде всего, чтобы упростить задачу, просто посмотрите на одну ось, например, x, но рассмотрите как левую (-x), так и правую (+ x), чтобы иметь представительную ситуацию.

Да, вы правы, вам нужно дважды интегрировать, чтобы получить положение как функцию времени. И для дальнейшей обработки вы должны сохранить первый результат интеграции (== скорость), потому что он вам понадобится на более позднем этапе для оптимизации. Делайте это очень осторожно, потому что каждая крошечная ошибка через короткий промежуток времени приведет к огромным ошибкам.

Всегда помните, что даже очень маленькая ошибка (например, <0,1%) будет быстро расти после двукратного интегрирования. Ситуация станет еще хуже через одну секунду, если вы настроите акселерометр, скажем, на 50 Гц, то есть будет обработано 50 тиков, и крошечная незначительная ошибка превзойдет "истинное" значение. Я настоятельно рекомендую не полагаться на правило трапеции, а использовать, по крайней мере, формулу Симпсона или формулу Ньютона-Котеса более высокой степени.

Если вам это удалось, вам придется следить за настройкой правильной фильтрации нижних частот. Я не могу назвать общее значение, но, как правило, экспериментирование с коэффициентами фильтрации от 0,2 до 0,8 будет хорошей отправной точкой. Правильное значение зависит от необходимого вам бизнес-кейса, например, от того, какая игра, как быстро реагировать на события, ...

Теперь у вас будет решение, которое неплохо работает при определенных обстоятельствах и в короткие сроки. Но через несколько секунд вы столкнетесь с проблемой, потому что ваш объект уносится прочь. Теперь вы перейдете к сложной части решения, с которой мне не удалось справиться за отведенное время :-(

Один многообещающий подход - ввести то, что я называю «синтетическими силами» или «виртуальными силами». Это некая стратегия реагирования на несколько плохих ситуаций, в результате которых объект ускользает, хотя устройство остается неподвижным (нет носителя языка, я имею в виду, не двигается) в ваших руках. Больше всего беспокоит скорость больше 0 без какого-либо ускорения. Это неизбежный результат распространения ошибки, и с ним можно справиться путем искусственного замедления, что означает введение виртуального замедления, даже если реального аналога нет. Очень упрощенный пример:

if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) {

     vX *= 0.9;
}

`

Чтобы приручить зверя, вам понадобится сочетание таких условий. Требуется много попыток и ошибок, чтобы нащупать правильный путь, и это будет самой сложной частью проблемы.

Если вам когда-либо удавалось взломать код, пожалуйста, дайте мне знать, мне очень любопытно узнать, возможно ли это вообще или нет :-)

Ура Кей

person Kay    schedule 08.01.2011

Когда iPhone 4 был совсем новым, я потратил много-много часов, пытаясь получить точное смещение с помощью акселерометров и гироскопа. Особых опасений по поводу постепенного дрейфа не должно быть, поскольку устройству нужно было переместиться не более чем на пару метров, а сбор данных обычно длился не более нескольких минут. Мы испробовали всевозможные подходы и даже получили помощь от нескольких инженеров Apple. В конечном итоге казалось, что гироскоп не справился с этой задачей. Это было хорошо для трехмерной ориентации, но на этом все ... опять же, по словам очень знающих инженеров.

Я хотел бы услышать, что кто-то опровергнет это, потому что приложение никогда не получалось так, как мы надеялись, и т. Д.

person westsider    schedule 07.01.2011

Еще пытаюсь получить смещение на айфоне. Вместо использования интегрирования я использовал базовую физическую формулу d = .5a * t ^ 2, предполагая, что начальная скорость равна 0 (не похоже, что вы можете принять начальную скорость равной 0). Пока вроде работает неплохо.

Моя проблема в том, что я использую deviceMotion. И значения неверны. deviceMotion.gravity читается около 0. Есть идеи? - ОК Исправлено, очевидно, что deviceMotion.gravity имеет значения x, y и z. Если вы не укажете, что хотите, вы вернете x (который должен быть около 0).

person gope    schedule 15.01.2011
comment
Проблема с d = 0,5 * a * t ^ 2 в целом заключается в том, что для этого требуется постоянное ускорение, как описано в en.wikipedia.org/wiki/Acceleration. - person Kay; 16.01.2011
comment
Что ж, предположим, что v (0) == 0 критично, но нам нужна точка для начала, и мы должны жить с этим. ИМО, более важная часть появляется через несколько секунд, когда у вас есть == 0 и v! = 0 (как описано в моем ответе). - person Kay; 16.01.2011

Найдите этот вопрос два года спустя, Я только что нашел проект дополненной реальности на Набор документов для iOS 6 под названием pARk. Он обеспечивает приблизительный захват и расчет смещения с помощью гироскопа, также известного как CoreMotion.Framework.

Я только начинаю изучать код.

продолжение следует...

person Henry    schedule 11.10.2012