Получение смещения из данных акселерометра с Core Motion - PullRequest
19 голосов
/ 15 декабря 2010

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

Ответы [ 4 ]

21 голосов
/ 08 января 2011

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

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

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

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

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

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

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

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

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

     vX *= 0.9;
}

`

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

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

Cheers Kay

7 голосов
/ 07 января 2011

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

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

5 голосов
/ 16 января 2011

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

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

1 голос
/ 11 октября 2012

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

Я только начинаю склоняться над кодом.

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

...