Объединение нескольких преобразований в Eigen в одну матрицу преобразований

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

Например, я хотел бы применить следующие преобразования в порядке A, B, C, 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);

…но должен быть простой (встроенный?) способ объединения этих преобразований с использованием Eigen в конечную матрицу преобразования 4×4.

4

Решение

В документах Eigen есть хороший учебник: Вот

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

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, и так далее. На мой взгляд, это правильный порядок, но это может быть дело вкуса.

8

Другие решения

Других решений пока нет …