Сохраните ориентацию к массиву - и сравните - PullRequest
22 голосов
/ 16 июня 2011

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

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

Спасибо!

Ответы [ 2 ]

46 голосов
/ 16 июня 2011

Попробуйте динамическое искажение времени .Вот иллюстративный пример с 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

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

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

Я только что заметил, что вы используете рыскание, тангаж и крен. Проще говоря: не и еще одна причина не .Можете ли вы использовать данные акселерометра вместо этого?«Акселерометр - это прямое измерение ориентации» (из рукописи DCM ), и это то, что вам нужно.А что касается вопроса ТС, имеет ли значение ориентация относительно Севера?Думаю, нет.

Гораздо проще сравнивать векторы ускорения, чем ориентации (углы Эйлера, матрицы вращения, кватернионы), как указывалось в 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),

, то есть Евклидово расстояние между двумя точками.

8 голосов
/ 27 июня 2011

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

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

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

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

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

  1. Вращение вокруг шага + 90 °
  2. Вращение вокруг крена + 90 °

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

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

Кей

...