27 #ifndef G2O_ISOMETRY3D_GRADIENTS_H_ 28 #define G2O_ISOMETRY3D_GRADIENTS_H_ 35 #include <Eigen/Geometry> 42 template <
typename Derived,
typename DerivedOther>
43 inline void skew(Eigen::MatrixBase<Derived>& s,
const Eigen::MatrixBase<DerivedOther>& v){
44 const double x=2*v(0);
45 const double y=2*v(1);
46 const double z=2*v(2);
47 s << 0., z, -y, -z, 0, x, y, -x, 0;
50 template <
typename Derived,
typename DerivedOther>
51 inline void skewT(Eigen::MatrixBase<Derived>& s,
const Eigen::MatrixBase<DerivedOther>& v){
52 const double x=2*v(0);
53 const double y=2*v(1);
54 const double z=2*v(2);
55 s << 0., -z, y, z, 0, -x, -y, x, 0;
58 template <
typename Derived,
typename DerivedOther>
59 void skew(Eigen::MatrixBase<Derived>& Sx,
60 Eigen::MatrixBase<Derived>& Sy,
61 Eigen::MatrixBase<Derived>& Sz,
62 const Eigen::MatrixBase<DerivedOther>& R){
64 r11=2*R(0,0), r12=2*R(0,1), r13=2*R(0,2),
65 r21=2*R(1,0), r22=2*R(1,1), r23=2*R(1,2),
66 r31=2*R(2,0), r32=2*R(2,1), r33=2*R(2,2);
67 Sx << 0, 0, 0, -r31, -r32, -r33, r21, r22, r23;
68 Sy << r31, r32, r33, 0, 0, 0, -r11, -r12, -r13;
69 Sz << -r21, -r22, -r23, r11, r12, r13, 0, 0, 0;
72 template <
typename Derived,
typename DerivedOther>
73 inline void skewT(Eigen::MatrixBase<Derived>& Sx,
74 Eigen::MatrixBase<Derived>& Sy,
75 Eigen::MatrixBase<Derived>& Sz,
76 const Eigen::MatrixBase<DerivedOther>& R){
78 r11=2*R(0,0), r12=2*R(0,1), r13=2*R(0,2),
79 r21=2*R(1,0), r22=2*R(1,1), r23=2*R(1,2),
80 r31=2*R(2,0), r32=2*R(2,1), r33=2*R(2,2);
81 Sx << 0, 0, 0, r31, r32, r33, -r21, -r22, -r23;
82 Sy << -r31, -r32, -r33, 0, 0, 0, r11, r12, r13;
83 Sz << r21, r22, r23, -r11, -r12, -r13, 0, 0, 0;
86 template <
typename Derived>
88 Eigen::MatrixBase<Derived>
const & JiConstRef,
89 Eigen::MatrixBase<Derived>
const & JjConstRef,
96 Eigen::MatrixBase<Derived>& Ji =
const_cast<Eigen::MatrixBase<Derived>&
>(JiConstRef);
97 Eigen::MatrixBase<Derived>& Jj =
const_cast<Eigen::MatrixBase<Derived>&
>(JjConstRef);
98 Ji.derived().resize(6,6);
99 Jj.derived().resize(6,6);
113 Isometry3D::ConstTranslationPart tc = C.translation();
116 Isometry3D::ConstTranslationPart tbc = BC.translation();
119 Eigen::Matrix<double, 3 , 9, Eigen::ColMajor> dq_dR;
121 Re(0,0),Re(1,0),Re(2,0),
122 Re(0,1),Re(1,1),Re(2,1),
123 Re(0,2),Re(1,2),Re(2,2));
129 Ji.template block<3,3>(0,0)=-Ra;
132 Jj.template block<3,3>(0,0)=Rab;
138 Ji.template block<3,3>(0,3)=Ra*S;
145 Jj.template block<3,3>(0,3)=Rab*S;
151 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
156 Eigen::Map<Matrix3D> M2(temp.data());
157 Eigen::Map<Matrix3D> Mx(buf); Mx = M2;
159 Eigen::Map<Matrix3D> My(buf+9); My = M2;
161 Eigen::Map<Matrix3D> Mz(buf+18); Mz = M2;
163 Eigen::Map<Matrix3D> Mx(buf); Mx = Ra*Sxt;
164 Eigen::Map<Matrix3D> My(buf+9); My = Ra*Syt;
165 Eigen::Map<Matrix3D> Mz(buf+18); Mz = Ra*Szt;
167 Ji.template block<3,3>(3,3) = dq_dR * M;
173 Eigen::Map <Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
178 Eigen::Map<Matrix3D> M2(temp.data());
179 Eigen::Map<Matrix3D> Mx(buf); Mx = M2;
181 Eigen::Map<Matrix3D> My(buf+9); My = M2;
183 Eigen::Map<Matrix3D> Mz(buf+18); Mz = M2;
185 Eigen::Map<Matrix3D> Mx(buf); Mx = Rab*Sx;
186 Eigen::Map<Matrix3D> My(buf+9); My = Rab*Sy;
187 Eigen::Map<Matrix3D> Mz(buf+18); Mz = Rab*Sz;
189 Jj.template block<3,3>(3,3) = dq_dR * M;
193 template <
typename Derived>
195 Eigen::MatrixBase<Derived>
const & JiConstRef,
196 Eigen::MatrixBase<Derived>
const & JjConstRef,
201 Eigen::MatrixBase<Derived>& Ji =
const_cast<Eigen::MatrixBase<Derived>&
>(JiConstRef);
202 Eigen::MatrixBase<Derived>& Jj =
const_cast<Eigen::MatrixBase<Derived>&
>(JjConstRef);
203 Ji.derived().resize(6,6);
204 Jj.derived().resize(6,6);
214 Isometry3D::ConstTranslationPart tb = B.translation();
216 Eigen::Matrix<double, 3, 9, Eigen::ColMajor> dq_dR;
218 Re(0,0),Re(1,0),Re(2,0),
219 Re(0,1),Re(1,1),Re(2,1),
220 Re(0,2),Re(1,2),Re(2,2));
226 Ji.template block<3,3>(0,0)=-Ra;
229 Jj.template block<3,3>(0,0)=Re;
235 Ji.template block<3,3>(0,3)=Ra*S;
241 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
245 skewT(Sxt,Syt,Szt,Rb);
246 Eigen::Map<Matrix3D> Mx(buf); Mx.noalias() = Ra*Sxt;
247 Eigen::Map<Matrix3D> My(buf+9); My.noalias() = Ra*Syt;
248 Eigen::Map<Matrix3D> Mz(buf+18); Mz.noalias() = Ra*Szt;
249 Ji.template block<3,3>(3,3) = dq_dR * M;
257 skew(Sx,Sy,Sz,Matrix3D::Identity());
258 Eigen::Map<Matrix3D> Mx(buf); Mx.noalias() = Re*Sx;
259 Eigen::Map<Matrix3D> My(buf+9); My.noalias() = Re*Sy;
260 Eigen::Map<Matrix3D> Mz(buf+18); Mz.noalias() = Re*Sz;
261 Jj.template block<3,3>(3,3) = dq_dR * M;
266 template <
typename Derived>
268 const Eigen::MatrixBase<Derived>& JConstRef,
273 Eigen::MatrixBase<Derived>& J =
const_cast<Eigen::MatrixBase<Derived>&
>(JConstRef);
274 J.derived().resize(6,6);
280 Isometry3D::ConstTranslationPart tb = B.translation();
284 Eigen::Matrix<double, 3, 9, Eigen::ColMajor> dq_dR;
286 Re(0,0),Re(1,0),Re(2,0),
287 Re(0,1),Re(1,1),Re(2,1),
288 Re(0,2),Re(1,2),Re(2,2));
293 J.template block<3,3>(0,0)=Ra;
300 J.template block<3,3>(0,3)=Ra*S;
308 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
313 Eigen::Map<Matrix3D> M2(temp.data());
314 Eigen::Map<Matrix3D> Mx(buf); Mx = M2;
316 Eigen::Map<Matrix3D> My(buf+9); My = M2;
318 Eigen::Map<Matrix3D> Mz(buf+18); Mz = M2;
320 Eigen::Map<Matrix3D> Mx(buf); Mx = Ra*Sx;
321 Eigen::Map<Matrix3D> My(buf+9); My = Ra*Sy;
322 Eigen::Map<Matrix3D> Mz(buf+18); Mz = Ra*Sz;
324 J.template block<3,3>(3,3) = dq_dR * M;
void compute_dq_dR(Eigen::Matrix< double, 3, 9, Eigen::ColMajor > &dq_dR, const double &r11, const double &r21, const double &r31, const double &r12, const double &r22, const double &r32, const double &r13, const double &r23, const double &r33)
void skew(Eigen::MatrixBase< Derived > &s, const Eigen::MatrixBase< DerivedOther > &v)
Eigen::Transform< double, 3, Eigen::Isometry, Eigen::ColMajor > Isometry3D
Isometry3D::ConstLinearPart extractRotation(const Isometry3D &A)
Eigen::Matrix< double, 3, 3, Eigen::ColMajor > Matrix3D
void computeEdgeSE3Gradient(Isometry3D &E, Eigen::MatrixBase< Derived > const &JiConstRef, Eigen::MatrixBase< Derived > const &JjConstRef, const Isometry3D &Z, const Isometry3D &Xi, const Isometry3D &Xj, const Isometry3D &Pi, const Isometry3D &Pj)
void skewT(Eigen::MatrixBase< Derived > &s, const Eigen::MatrixBase< DerivedOther > &v)
void computeEdgeSE3PriorGradient(Isometry3D &E, const Eigen::MatrixBase< Derived > &JConstRef, const Isometry3D &Z, const Isometry3D &X, const Isometry3D &P=Isometry3D())