18 Eigen::Map<const Eigen::Vector3d> trans(x + 4);
20 Eigen::Quaterniond delta_q;
21 Eigen::Vector3d delta_t;
23 Eigen::Map<const Eigen::Quaterniond> quater(x);
24 Eigen::Map<Eigen::Quaterniond> quater_plus(x_plus_delta);
25 Eigen::Map<Eigen::Vector3d> trans_plus(x_plus_delta + 4);
27 quater_plus = delta_q * quater;
28 trans_plus = delta_q * trans + delta_t;
35 Eigen::Map<Eigen::Matrix<double, 7, 6, Eigen::RowMajor>> j(jacobian);
37 (j.bottomRows(1)).setZero();
42 void getTransformFromSe3(
const Eigen::Matrix<double,6,1>& se3, Eigen::Quaterniond& q, Eigen::Vector3d& t){
43 Eigen::Vector3d omega(se3.data());
44 Eigen::Vector3d upsilon(se3.data()+3);
45 Eigen::Matrix3d Omega =
skew(omega);
47 double theta = omega.norm();
48 double half_theta = 0.5*theta;
51 double real_factor = cos(half_theta);
54 double theta_sq = theta*theta;
55 double theta_po4 = theta_sq*theta_sq;
56 imag_factor = 0.5-0.0208333*theta_sq+0.000260417*theta_po4;
60 double sin_half_theta = sin(half_theta);
61 imag_factor = sin_half_theta/theta;
64 q = Eigen::Quaterniond(real_factor, imag_factor*omega.x(), imag_factor*omega.y(), imag_factor*omega.z());
74 Eigen::Matrix3d Omega2 = Omega*Omega;
75 J = (Eigen::Matrix3d::Identity() + (1-cos(theta))/(theta*theta)*Omega + (theta-sin(theta))/(pow(theta,3))*Omega2);
81 Eigen::Matrix<double,3,3>
skew(Eigen::Matrix<double,3,1>& mat_in){
82 Eigen::Matrix<double,3,3> skew_mat;
84 skew_mat(0,1) = -mat_in(2);
85 skew_mat(0,2) = mat_in(1);
86 skew_mat(1,2) = -mat_in(0);
87 skew_mat(1,0) = mat_in(2);
88 skew_mat(2,0) = -mat_in(1);
89 skew_mat(2,1) = mat_in(0);