Подтвердить что ты не робот

Сохранять ориентацию массива - и сравнить

Я хочу добиться следующего:

Я хочу, чтобы пользователь мог "записывать" движение iPhone с помощью гироскопа. И после этого пользователь должен иметь возможность воспроизвести одно и то же движение. Я извлекаю шаг, рулон и рыскание, используя:

 [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                       withHandler: ^(CMDeviceMotion *motion, NSError *error)
     {
         CMAttitude *attitude = motion.attitude;
         NSLog(@"pitch: %f, roll: %f, yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw);
     }];

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

Я вообще на правильном пути здесь?

ОБНОВЛЕНИЕ: Я думаю, что, возможно, ответ Алиса об использовании DTW может быть правильным для меня здесь. Но я не настолько умный (по-видимому), поэтому, если бы кто-нибудь мог помочь мне с первого шага по сравнению с массивами, я был бы счастливым человеком!

Спасибо!

4b9b3361

Ответ 1

Попробуйте динамическое изменение времени. Вот иллюстративный пример с 1D массивами. В базе данных у нас уже есть следующие 2 массива:

Массив 1: [5, 3, 1]
Массив 2: [1, 3, 5, 8, 8]

Мы измерили [2, 4, 6, 7]. Какой массив наиболее похож на недавно измеренный? Очевидно, что второй массив похож на вновь измеренный, а первый нет.

Вычислить стоимостные матрицы в соответствии с этот документ, подраздел 2.1:

D(i,j)=Dist(i,j)+MIN(D(i-1,j),D(i,j-1),D(i-1,j-1))

Здесь D(i,j) - элемент (i,j) матрицы затрат, см. ниже. Посмотрите на рисунок 3 этой статьи, чтобы увидеть, что это отношение повторения применяется. Короче: сначала вычисляются столбцы, начиная с D(1,1); D(0,*) и D(*,0) не указаны в MIN. Если мы сравниваем массивы A и B, то Dist(i,j) - это расстояние между A[i] и B[j]. Я просто использовал ABS(A[i]-B[j]). Матрицы затрат для этого примера:

Dynamic Time Warping, cost matrices

Для Array 1 у нас есть 13 в качестве оценки, для Array 2 у нас 5. Побеждает более низкая оценка, поэтому наиболее похожим массивом является Array 2. Лучший путь деформации отмечен серым.

Это всего лишь эскиз DTW. В реальном мире есть ряд проблем. Например, с использованием смещения вместо фиксированных конечных точек или определения мер соответствия: см. этот документ, стр. 363, 5. граничные условия и стр. 364. Связанная с этим бумага также содержит дополнительную информацию.

Я просто заметил, что вы используете рыскание, подачу и ролл. Проще говоря: не и еще одна причина не для. Можете ли вы использовать данные акселерометра? "Акселерометр - это прямое измерение ориентации" (из DCM manuscript), и это то, что вам нужно. А что касается вопроса о том, имеет ли ориентация относительно северной материи? Наверное, нет.

Намного легче сравнивать векторы ускорения, чем ориентации (углы Эйлера, матрицы вращения, кватернионы), поскольку tc указала это. Если вы используете данные ускорения, у вас есть 3 размерных вектора в каждой временной точке, координаты (x, y, z). Я просто вычислил

Dist(i,j)=SQRT((A[i][X]-B[j][X])^2+(A[i][Y]-B[j][Y])^2+(A[i][Z]-B[j][Z])^2),

то есть Eucledian distance между двумя точками.

Ответ 2

Я думаю, что подход Али в целом - хороший способ пойти, но есть общая проблема, называемая gimbal lock (или SO обсуждения по этой теме) при использовании углов Эйлера, например, тангажа, рулона и рыскания. Вы столкнетесь с этим, когда вы записываете более сложное движение, продолжающееся дольше, чем несколько тиков, и, таким образом, приводя к большим углам в разных направлениях angular.

В двух словах это означает, что у вас будет более одного математического представления для одной и той же позиции только в зависимости от порядка движений, которые вы сделали, чтобы добраться туда - и потери информации с другой стороны. Рассмотрим самолет, взлетающий в воздухе слева направо. Ось X - слева направо, ось Y - вверх. Следующие две последовательности движения приведут к тому же конечной позиции, хотя вы попадёте туда совершенно по-разному:

Последовательность A:

  • Вращение вокруг рыскания + 90 °
  • Вращение вокруг шага + 90 °

Последовательность B:

  • Вращение вокруг шага + 90 °
  • Вращение вокруг рулона + 90 °

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

Единственное решение этого - избегать углов Эйлера и тем самым усложнять ситуацию. Кватернионы - лучший способ справиться с этим, но потребовалось некоторое время (для меня), чтобы получить представление об этом довольно абстрактном представлении. Хорошо, этот ответ не делает вам никаких дальнейших шагов относительно вашей первоначальной проблемы, но это может помочь вам избежать траты времени. Возможно, вы можете сделать некоторые концептуальные изменения, чтобы настроить свою идею.

Кей