lidar_optimization.cpp
Go to the documentation of this file.
1 
3 
4 // Original Author of FLOAM: Wang Han
5 // Email wh200720041@gmail.com
6 // Homepage https://wanghan.pro
7 
9 
10 
11 namespace floam
12 {
13 namespace lidar
14 {
15 
16 bool PoseSE3Parameterization::Plus(const double *x, const double *delta, double *x_plus_delta) const
17 {
18  Eigen::Map<const Eigen::Vector3d> trans(x + 4);
19 
20  Eigen::Quaterniond delta_q;
21  Eigen::Vector3d delta_t;
22  getTransformFromSe3(Eigen::Map<const Eigen::Matrix<double,6,1>>(delta), delta_q, 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);
26 
27  quater_plus = delta_q * quater;
28  trans_plus = delta_q * trans + delta_t;
29 
30  return true;
31 }
32 
33 bool PoseSE3Parameterization::ComputeJacobian(const double *x, double *jacobian) const
34 {
35  Eigen::Map<Eigen::Matrix<double, 7, 6, Eigen::RowMajor>> j(jacobian);
36  (j.topRows(6)).setIdentity();
37  (j.bottomRows(1)).setZero();
38 
39  return true;
40 }
41 
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);
46 
47  double theta = omega.norm();
48  double half_theta = 0.5*theta;
49 
50  double imag_factor;
51  double real_factor = cos(half_theta);
52  if(theta<1e-10)
53  {
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;
57  }
58  else
59  {
60  double sin_half_theta = sin(half_theta);
61  imag_factor = sin_half_theta/theta;
62  }
63 
64  q = Eigen::Quaterniond(real_factor, imag_factor*omega.x(), imag_factor*omega.y(), imag_factor*omega.z());
65 
66 
67  Eigen::Matrix3d J;
68  if (theta<1e-10)
69  {
70  J = q.matrix();
71  }
72  else
73  {
74  Eigen::Matrix3d Omega2 = Omega*Omega;
75  J = (Eigen::Matrix3d::Identity() + (1-cos(theta))/(theta*theta)*Omega + (theta-sin(theta))/(pow(theta,3))*Omega2);
76  }
77 
78  t = J*upsilon;
79 }
80 
81 Eigen::Matrix<double,3,3> skew(Eigen::Matrix<double,3,1>& mat_in){
82  Eigen::Matrix<double,3,3> skew_mat;
83  skew_mat.setZero();
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);
90  return skew_mat;
91 }
92 
93 } // namespace lidar
94 } // namespace floam
floam::lidar::getTransformFromSe3
void getTransformFromSe3(const Eigen::Matrix< double, 6, 1 > &se3, Eigen::Quaterniond &q, Eigen::Vector3d &t)
Definition: lidar_optimization.cpp:42
floam::lidar::PoseSE3Parameterization::ComputeJacobian
virtual bool ComputeJacobian(const double *x, double *jacobian) const
Definition: lidar_optimization.cpp:33
floam::lidar::skew
Eigen::Matrix3d skew(Eigen::Vector3d &mat_in)
floam::lidar::PoseSE3Parameterization::Plus
virtual bool Plus(const double *x, const double *delta, double *x_plus_delta) const
Definition: lidar_optimization.cpp:16
setIdentity
void setIdentity(geometry_msgs::Transform &tx)
lidar_optimization.hpp
floam
Major rewrite Author: Evan Flynn.
Definition: lidar.hpp:15
t
geometry_msgs::TransformStamped t


floam
Author(s): Han Wang
autogenerated on Wed Mar 2 2022 00:23:09