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