40 #include <eigen3/Eigen/Eigenvalues>
42 void quatToRPY(
const geometry_msgs::Quaternion& q,
double& roll,
double& pitch,
double& yaw)
44 double as = std::min(-2. * (q.x * q.z - q.w * q.y), .99999);
46 pitch = std::asin(as);
52 double roll, pitch, yaw;
59 Eigen::MatrixXd Q = Eigen::MatrixXd::Zero(4, quaternions.size());
61 for (
size_t i = 0; i < quaternions.size(); ++i)
72 Eigen::EigenSolver<Eigen::MatrixXd> es(Q * Q.transpose());
74 auto eigenvalues = es.eigenvalues();
76 double max_value = eigenvalues[max_idx].real();
77 for (
size_t i = 1; i < 4; ++i)
79 double real = eigenvalues[i].real();
87 auto eigenvector = es.eigenvectors().col(max_idx).normalized();
88 tf2::Quaternion mean_orientation(eigenvector[0].real(), eigenvector[1].real(), eigenvector[2].real(),
89 eigenvector[3].real());
90 return mean_orientation;
95 Eigen::Matrix3d r = rot.transpose();
97 double trace = r.trace();
100 double s = sqrt(trace + 1.0) * 2.0;
101 quat.setValue((r(2, 1) - r(1, 2)) /
s, (r(0, 2) - r(2, 0)) /
s, (r(1, 0) - r(0, 1)) /
s, 0.25 *
s);
103 else if ((r(0, 0) > r(1, 1)) && (r(0, 0) > r(2, 2)))
105 double s = sqrt(1.0 + r(0, 0) - r(1, 1) - r(2, 2)) * 2.0;
106 quat.setValue(0.25 *
s, (r(0, 1) + r(1, 0)) /
s, (r(0, 2) + r(2, 0)) /
s, (r(2, 1) - r(1, 2)) /
s);
108 else if (r(1, 1) > r(2, 2))
110 double s = sqrt(1.0 + r(1, 1) - r(0, 0) - r(2, 2)) * 2.0;
111 quat.setValue((r(0, 1) + r(1, 0)) /
s, (r(0, 1) + r(1, 0)) /
s, 0.25 *
s, (r(0, 2) - r(2, 0)) /
s);
115 double s = sqrt(1.0 + r(2, 2) - r(0, 0) - r(1, 1)) * 2.0;
116 quat.setValue((r(0, 2) + r(2, 0)) /
s, (r(1, 2) + r(2, 1)) /
s, 0.25 *
s, (r(1, 0) - r(0, 1)) /
s);