32 #include <Eigen/Dense> 39 if (target.isZero()) {
40 throw Setup_error(
"Rotation:calculate_rotation_to_target: " 41 "Invalid target: cannot rotate to origin.");
44 const int num_dims = target.rows();
49 Eigen::MatrixXd mat_fr_target(
50 Eigen::MatrixXd::Zero(num_dims, num_dims));
51 mat_fr_target.row(0) = target;
53 Eigen::FullPivLU<Eigen::MatrixXd> mat_t_lu(mat_fr_target);
56 assert(mat_t_lu.dimensionOfKernel() == num_dims - 1);
57 Eigen::MatrixXd mat_fr_kernel = mat_t_lu.kernel();
60 Eigen::MatrixXd mat_basis = Eigen::MatrixXd(num_dims, num_dims);
61 mat_basis.col(0) = target;
62 for (
int i = 1; i != num_dims; ++i) {
63 mat_basis.col(i) = mat_fr_kernel.col(i - 1);
69 Eigen::MatrixXd m_cob_new_to_old(
70 mat_basis.fullPivHouseholderQr().matrixQ());
74 m_cob_new_to_old.col(0) = target.normalized();
76 return m_cob_new_to_old;
Eigen::MatrixXd calculate_rotation_to_target(const Eigen::VectorXd &target)
Calculate the rotation matrix for a rotation to the target vector.
Exception indicating general setup error.