Я пытаюсь отследить вращение сферы, отслеживая поверхностные элементы на сфере.
TL; DR : Я неправильно усредняю кватернионы?
Введение
Давайте пропустим обнаружение и сопоставление функций, это просто ORB + FLANN из OpenCV. Это дает мне два набора (совпавших) ключевых точек для двух последовательных кадров.
Я проецирую ключевые точки в 3d, помещая их на сферу в соответствии с их расстоянием до центра сфер 1 . Это дает мне ключевые точки в системе координат сфер.
(не говоря уже о больших векторах)
Из сопоставленных ключевых точек как векторов я вычисляю набор кватернионов, представляющих вращение с момента последнего кадра ( используемый алгоритм ).
a = np.cross(v1,v2)
w = np.sqrt(np.linalg.norm(v1)**2 * np.linalg.norm(v2)**2) + np.dot(v1,v2)
return quaternion(w, a[0], a[1], a[2]).normalized()
Проблема
Итак, на данный момент моя идея состоит в том, что все эти кватернионы представляют одно и то же вращение (плюс / минус шум). Таким образом, теоретически я должен быть в состоянии вычислить средний кватернион моего набора кватернионов и иметь хорошее представление о том, как моя сфера двигалась с момента последнего кадра ( алгоритм использовал ).
np.linalg.eig(np.mean(np.array([np.outer(q,q) for q in quats]), axis=0))[0]
Дело в том, что это приводит к единичным кватернионам для всех кадров (или рядом, как e ^ -06 close):
quaternion(0.999999999865224, -4.24742027709118e-06, 1.4799762763963e-05, 5.69900765792268e-06)
(«наивное» усреднение по всем кватернионам на самом деле дает результаты, которые выглядят так, как будто бы они соответствуют исходному вращению, но я бы предпочел использовать проверенный метод)
Итак, у меня есть две теории:
- Наличие нескольких тысяч кватернионов приводит к катастрофическому сокращению в вычислениях суммирования и собственных векторов. Или (более вероятно):
- У меня ошибка в мышлении.
Мысли
1 Я знаю, что мне приходится иметь дело с проекцией камер, но для подтверждения концепции я решил игнорировать это.