27 #ifndef G2O_SE3QUAT_H_ 28 #define G2O_SE3QUAT_H_ 33 #include <Eigen/Geometry> 37 typedef Eigen::Matrix<double, 6, 1, Eigen::ColMajor>
Vector6d;
38 typedef Eigen::Matrix<double, 7, 1, Eigen::ColMajor>
Vector7d;
46 Eigen::Quaterniond
_r;
66 template <
typename Derived>
67 explicit SE3Quat(
const Eigen::MatrixBase<Derived>& v)
69 assert((v.size() == 6 || v.size() == 7) &&
"Vector dimension does not match");
71 for (
int i=0; i<3; i++){
73 _r.coeffs()(i)=v[i+3];
79 double w2=1.-_r.squaredNorm();
80 _r.w()= (w2<0.) ? 0. : sqrt(w2);
83 else if (v.size() == 7) {
85 for (
int i=0; i<3; ++i, ++idx)
87 for (
int i=0; i<4; ++i, ++idx)
88 _r.coeffs()(i) = v(idx);
97 inline const Eigen::Quaterniond&
rotation()
const {
return _r;}
103 result.
_t += _r*tr2.
_t;
122 ret.
_r=_r.conjugate();
123 ret.
_t=ret.
_r*(_t*-1.);
127 inline double operator [](
int i)
const {
131 return _r.coeffs()[i-3];
148 _r=Eigen::Quaterniond(v[6], v[3], v[4], v[5]);
164 double w = 1.-v[3]*v[3]-v[4]*v[4]-v[5]*v[5];
166 _r=Eigen::Quaterniond(sqrt(w), v[3], v[4], v[5]);
168 _r=Eigen::Quaterniond(0, -v[3], -v[4], -v[5]);
177 Matrix3D _R = _r.toRotationMatrix();
178 double d = 0.5*(_R(0,0)+_R(1,1)+_R(2,2)-1);
191 V_inv = Matrix3D::Identity()- 0.5*Omega + (1./12.)*(Omega*Omega);
195 double theta = acos(d);
196 omega = theta/(2*sqrt(1-d*d))*dR;
198 V_inv = ( Matrix3D::Identity() - 0.5*Omega
199 + ( 1-theta/(2*tan(theta/2)))/(theta*theta)*(Omega*Omega) );
203 for (
int i=0; i<3;i++){
206 for (
int i=0; i<3;i++){
223 for (
int i=0; i<3; i++)
226 for (
int i=0; i<3; i++)
227 upsilon[i]=update[i+3];
229 double theta = omega.norm();
237 R = (Matrix3D::Identity() + Omega + Omega*Omega);
245 R = (Matrix3D::Identity()
246 + sin(theta)/theta *Omega
247 + (1-cos(theta))/(theta*theta)*Omega2);
249 V = (Matrix3D::Identity()
250 + (1-cos(theta))/(theta*theta)*Omega
251 + (theta-sin(theta))/(pow(theta,3))*Omega2);
253 return SE3Quat(Eigen::Quaterniond(R),V*upsilon);
256 Eigen::Matrix<double, 6, 6, Eigen::ColMajor>
adj()
const 259 Eigen::Matrix<double, 6, 6, Eigen::ColMajor> res;
260 res.block(0,0,3,3) = R;
261 res.block(3,3,3,3) = R;
262 res.block(3,0,3,3) =
skew(_t)*R;
263 res.block(0,3,3,3) = Matrix3D::Zero(3,3);
269 Eigen::Matrix<double,4,4,Eigen::ColMajor> homogeneous_matrix;
270 homogeneous_matrix.setIdentity();
271 homogeneous_matrix.block(0,0,3,3) = _r.toRotationMatrix();
272 homogeneous_matrix.col(3).head(3) = translation();
274 return homogeneous_matrix;
290 result.translation() = translation();
Eigen::Matrix< double, 4, 4, Eigen::ColMajor > to_homogeneous_matrix() const
Eigen::Matrix< double, 3, 1, Eigen::ColMajor > Vector3D
Vector7d toVector() const
Vector3D map(const Vector3D &xyz) const
Eigen::Matrix< double, 7, 1 > Vector7d
Line2D operator*(const SE2 &t, const Line2D &l)
Eigen::Matrix< double, 6, 6, Eigen::ColMajor > adj() const
SE3Quat(const Eigen::Quaterniond &q, const Vector3D &t)
static SE3Quat exp(const Vector6d &update)
Vector6d toMinimalVector() const
#define G2O_TYPES_SLAM3D_API
void fromMinimalVector(const Vector6d &v)
Eigen::Transform< double, 3, Eigen::Isometry, Eigen::ColMajor > Isometry3D
void fromVector(const Vector7d &v)
const Eigen::Quaterniond & rotation() const
SE3Quat(const Matrix3D &R, const Vector3D &t)
Eigen::Matrix< double, 3, 3, Eigen::ColMajor > Matrix3D
std::ostream & operator<<(std::ostream &os, const G2OBatchStatistics &st)
void setTranslation(const Vector3D &t_)
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
G2O_TYPES_SLAM3D_API Vector3D deltaR(const Matrix3D &R)
void setRotation(const Eigen::Quaterniond &r_)
G2O_TYPES_SLAM3D_API Matrix3D skew(const Vector3D &v)
SE3Quat(const Eigen::MatrixBase< Derived > &v)
const Vector3D & translation() const
Matrix< double, 6, 1, Eigen::ColMajor > Vector6d