2013-09-13 3 views
3

У меня есть несколько преобразований в Eigen, в виде переводов (Eigen::Vector3f) и поворотов (Eigen::Quaternionf). Я хотел бы объединить все эти преобразования в порядке моего выбора в матрицу преобразования 4x4 Eigen::Matrix4f.Объединение множественных преобразований в Eigen в одну матрицу преобразования

Например, я хотел бы применить следующие преобразования в порядке А, В, С, D, E:

Eigen::Vector3f translation_A; 
Eigen::Quaternionf rotation_B; 
Eigen::Quaternionf rotation_C; 
Eigen::Quaternionf rotation_D; 
Eigen::Vector3f translation_E; 

Что это самый простой способ достижения этой цели? Я до сих пор их применения индивидуальны для моих окончательных данных так:

pcl::transformPointCloud(*cloud_in, *cloud_out, translation_A, IDENTITY_QUATERNION); 
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_B); 
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_C); 
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_D); 
pcl::transformPointCloud(*cloud_out, *cloud_out, translation_E, IDENTITY_QUATERNION); 

... но должна быть простым (встроенным?) Способом объединения этих преобразований с использованием Эйгена, в окончательную трансформацию 4x4 матрица.

ответ

7

Существует хороший учебник в документации Эйген: here

В вашем случае, это должно выглядеть так:

Eigen::Vector3f trans_vec_A; 
//note that you have to create a Translation because multiplying a 
//Transform with a vector will _apply_ the transform to the vector 
Eigen::Translation<float,3> translation_A(trans_vec_A); 
Eigen::Quaternionf rotation_B; 
Eigen::Quaternionf rotation_C; 
Eigen::Quaternionf rotation_D; 
Eigen::Vector3f trans_vec_E; 
Eigen::Translation<float,3> translation_E(trans_vec_E); 
Eigen::Transform<float,3,Affine> combined = 
     translation_A * rotation_B * rotation_C * rotation_D * translation_E; 

Обратите внимание, что

combined = A*B*C*D*E 

так combined применяется к вектору v является

combined*v = A*B*C*D*E*v = A*(B*(C*(D*(E*v)))) 

это, E применяется сначала, затем D и т. Д. На мой взгляд, это правильный номер, но это может быть вопросом вкуса.

+0

Спасибо, я попробовал это, но это не дало того же результата, что и применение каждого отдельно. По прихоти я попытался изменить порядок умножений в «комбинированном» продукте, и это дало правильный результат ... Является ли это тем, как работают преобразования Eigen? Начиная со спины? –

+0

@BillCheatham Да, они работают «математически». Я обновлю свой ответ, чтобы показать вам, как это сделать. – us2012

+0

Да, это имеет смысл. Думаю, упорядочение преобразований может быть немного сложным. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^