Среднее значение и мера распространения трехмерных вращений

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

Итак: я работаю над системой измерения, основанной на компьютерном зрении.

Я беру N снимков и обрабатываю их с помощью библиотеки, которая выводит оценки позы в виде матриц аффинного преобразования 4x4 перемещения и поворота.

В этих оценках позы есть некоторый шум. Стандартное отклонение углов Эйлера для каждой оси вращения составляет менее 2,5 градусов, поэтому все ориентации довольно близки друг к другу (для случая, когда все углы Эйлера близки к 0 или 180). Для меня важны стандартные ошибки менее 0,25 градуса. Но я уже столкнулся с проблемами, характерными для углов Эйлера.

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

Я знаю, что «средний» на самом деле не очень хорошо определен для вращений.

(Для справки, мой код написан на Numpy-тяжелом Python.)

Я также могу взвесить это среднее значение, поскольку известно, что некоторые захваты (и некоторые оси) более точны, чем другие.

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

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

Это работоспособно? Существует ли достаточно четко определенная мера распространения в этом контексте?


person ikrase    schedule 10.07.2015    source источник
comment
Я бы предпочел усреднение по матричным коэффициентам, чем по углам Эйлера.   -  person Yves Daoust    schedule 12.07.2015


Ответы (2)


Без дополнительной информации о настройке геометрии трудно ответить. В любом случае для вращений я бы:

  1. создать 3 единичных вектора

    x=(1,0,0),y=(0,1,0),z=(0,0,1)
    

    и примените к ним вращение и вызовите вывод

    x(i),y(i),z(i)
    

    он просто применяет matrix(i) с позицией (0,0,0)

  2. проделайте это со всеми измерениями, которые у вас есть

  3. теперь усреднить все векторы

    X=avg(x(1),x(2),...x(n))
    Y=avg(y(1),y(2),...y(n))
    Z=avg(z(1),z(2),...z(n))
    
  4. исправьте значения вектора

    поэтому снова создайте каждый из X,Y,Z единичных векторов и выберите ось, которая ближе всего к оси вращения, в качестве главной оси. Он останется как есть, а оставшиеся две оси будут пересчитаны как векторное произведение главной оси и другого вектора, чтобы обеспечить ортогональность. Остерегайтесь порядка умножения (неправильный порядок операндов приведет к отрицанию вывода)

  5. построить усредненную матрицу преобразования

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

person Spektre    schedule 12.07.2015
comment
Мне нравится этот метод, так как он, казалось бы, тесно связан с физическим вращением объекта с несколькими признаками, таким образом усредняя положения признаков (а также позволит получить стандартное отклонение / стандартную ошибку / дисперсию / IQR с четкое представление) - person ikrase; 13.07.2015
comment
Какая информация о настройке геометрии вам нужна? - person ikrase; 13.07.2015
comment
@ikrase, может быть, эскиз вашего скелета или что-то еще, что вы измеряете, и несколько примеров входных данных. Кстати, вы можете получить повернутые оси X, Y, Z напрямую из вашей матрицы преобразования (или из ее обратной матрицы, зависит от вашего матричного конвейера и представления) - person Spektre; 13.07.2015
comment
На самом деле, меня немного смущает то, что вы делаете на шаге 4. Вы начинаете с оси, ближайшей к оси вращения (для меня это обычно будет Y), а затем просто берете ее, затем берете вторую ось. временно вычислить третью ось как 1-й х 2-й, а затем получить истинную 2-й как 3-й х 1-й (или что-то в этом роде, коммутативность там не проверял)? Я правильно понял? - person ikrase; 14.07.2015
comment
@ikrase шаг 4 просто делает ваши вычисленные векторы осей параллельными друг другу. Если вы возьмете любые 2 непараллельных вектора a,b и сделаете из них перекрестное произведение, то вы получите параллельный вектор к их будке. Для любых 2 непараллельных векторов есть только 2 таких вектора (в 3D), один из которых является отрицанием другого c=a x b и -c= a x b Поэтому, когда вы используете это, вы можете легко исправить 2 оси от основной, чтобы обеспечить ортогональность. Так что вы правы, вам просто нужно правильно установить порядок умножения, иначе у вас будут зеркальные оси. Итак, если вы просто поменяете местами перекрестные операнды - person Spektre; 14.07.2015
comment
@ikrase Перекрестное произведение также изменяет размер выходного вектора, но если оба они единичны, то результирующий вектор также имеет единичный размер. - person Spektre; 14.07.2015
comment
Есть ли причина, почему бы просто не использовать SVD или другой метод прямой ортогонализации матрицы векторов? - person ikrase; 14.07.2015
comment
@ikrase Я привык к чистому C ++, где в моем распоряжении нет таких вещей, и в любом случае это довольно прямой путь ... грубо говоря, вы можете использовать любой другой метод, который вы знаете или можете ... - person Spektre; 14.07.2015
comment
@Spektre Я не уверен, что ты имеешь в виду под it is just applying the matrix(i) with position at (0,0,0). Вы имеете в виду взять каждую из матриц вращения и умножить каждую из $ x (i), y (i), z (i) $ и получить соответствующие векторы повернутых осей? - person Luca; 23.11.2018
comment
@Luca, если вы умножаете матрицу преобразования, смещенную на (0,0,0), на единичный базисный вектор, такой как (1,0,0), результатом будет вектор, параллельный оси x системы координат матрицы ... Взгляните на: Понимание однородных матриц преобразования 4x4... Это то же самое, что и непосредственное извлечение базисных векторов из матрицы... - person Spektre; 23.11.2018

Моахер написал статью, в которой объясняется, что существует два основных способа возьмите среднее значение матриц вращения. Первый представляет собой средневзвешенное значение, за которым следует проекция обратно в SO(3) с использованием SVD. Второй — римановский центр масс. Это понятие ближе к среднему геометрическому, и его сложнее вычислить.

person Charles F    schedule 10.04.2017