45inline void skew(Eigen::MatrixBase<Derived>& s,
46 const Eigen::MatrixBase<DerivedOther>& v) {
47 const double x = 2 * v(0);
48 const double y = 2 * v(1);
49 const double z = 2 * v(2);
51 s << 0., -z, y, z, 0, -x, -y, x, 0;
53 s << 0., z, -y, -z, 0, x, y, -x, 0;
63void skew(Eigen::MatrixBase<Derived>& Sx, Eigen::MatrixBase<Derived>& Sy,
64 Eigen::MatrixBase<Derived>& Sz,
65 const Eigen::MatrixBase<DerivedOther>& R) {
66 const double r11 = 2 * R(0, 0), r12 = 2 * R(0, 1), r13 = 2 * R(0, 2),
67 r21 = 2 * R(1, 0), r22 = 2 * R(1, 1), r23 = 2 * R(1, 2),
68 r31 = 2 * R(2, 0), r32 = 2 * R(2, 1), r33 = 2 * R(2, 2);
70 Sx << 0, 0, 0, r31, r32, r33, -r21, -r22, -r23;
71 Sy << -r31, -r32, -r33, 0, 0, 0, r11, r12, r13;
72 Sz << r21, r22, r23, -r11, -r12, -r13, 0, 0, 0;
74 Sx << 0, 0, 0, -r31, -r32, -r33, r21, r22, r23;
75 Sy << r31, r32, r33, 0, 0, 0, -r11, -r12, -r13;
76 Sz << -r21, -r22, -r23, r11, r12, r13, 0, 0, 0;
81inline void skewT(Eigen::MatrixBase<Derived>& Sx,
82 Eigen::MatrixBase<Derived>& Sy,
83 Eigen::MatrixBase<Derived>& Sz,
84 const Eigen::MatrixBase<DerivedOther>& R) {
85 skew<Derived, DerivedOther, true>(Sx, Sy, Sz, R);
90 Eigen::MatrixBase<Derived>
const& JiConstRef,
91 Eigen::MatrixBase<Derived>
const& JjConstRef,
96 Eigen::MatrixBase<Derived>& Ji =
97 const_cast<Eigen::MatrixBase<Derived>&
>(JiConstRef);
98 Eigen::MatrixBase<Derived>& Jj =
99 const_cast<Eigen::MatrixBase<Derived>&
>(JjConstRef);
100 Ji.derived().resize(6, 6);
101 Jj.derived().resize(6, 6);
103 const Isometry3 A = Z.inverse() * Pi.inverse();
115 Isometry3::ConstTranslationPart tc = C.translation();
118 Isometry3::ConstTranslationPart tbc = BC.translation();
121 Eigen::Matrix<double, 3, 9, Eigen::ColMajor> dq_dR;
122 compute_dq_dR(dq_dR, Re(0, 0), Re(1, 0), Re(2, 0), Re(0, 1), Re(1, 1),
123 Re(2, 1), 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<Matrix3> M2(temp.data());
157 Eigen::Map<Matrix3> Mx(buf);
160 Eigen::Map<Matrix3> My(buf + 9);
163 Eigen::Map<Matrix3> Mz(buf + 18);
166 Eigen::Map<Matrix3> Mx(buf);
168 Eigen::Map<Matrix3> My(buf + 9);
170 Eigen::Map<Matrix3> Mz(buf + 18);
173 Ji.template block<3, 3>(3, 3) = dq_dR * M;
179 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
184 Eigen::Map<Matrix3> M2(temp.data());
185 Eigen::Map<Matrix3> Mx(buf);
188 Eigen::Map<Matrix3> My(buf + 9);
191 Eigen::Map<Matrix3> Mz(buf + 18);
194 Eigen::Map<Matrix3> Mx(buf);
196 Eigen::Map<Matrix3> My(buf + 9);
198 Eigen::Map<Matrix3> Mz(buf + 18);
201 Jj.template block<3, 3>(3, 3) = dq_dR * M;
207 Eigen::MatrixBase<Derived>
const& JiConstRef,
208 Eigen::MatrixBase<Derived>
const& JjConstRef,
211 Eigen::MatrixBase<Derived>& Ji =
212 const_cast<Eigen::MatrixBase<Derived>&
>(JiConstRef);
213 Eigen::MatrixBase<Derived>& Jj =
214 const_cast<Eigen::MatrixBase<Derived>&
>(JjConstRef);
215 Ji.derived().resize(6, 6);
216 Jj.derived().resize(6, 6);
226 Isometry3::ConstTranslationPart tb = B.translation();
228 Eigen::Matrix<double, 3, 9, Eigen::ColMajor> dq_dR;
229 compute_dq_dR(dq_dR, Re(0, 0), Re(1, 0), Re(2, 0), Re(0, 1), Re(1, 1),
230 Re(2, 1), Re(0, 2), Re(1, 2), Re(2, 2));
236 Ji.template block<3, 3>(0, 0) = -Ra;
239 Jj.template block<3, 3>(0, 0) = Re;
245 Ji.template block<3, 3>(0, 3) = Ra * S;
251 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
255 skewT(Sxt, Syt, Szt, Rb);
256 Eigen::Map<Matrix3> Mx(buf);
257 Mx.noalias() = Ra * Sxt;
258 Eigen::Map<Matrix3> My(buf + 9);
259 My.noalias() = Ra * Syt;
260 Eigen::Map<Matrix3> Mz(buf + 18);
261 Mz.noalias() = Ra * Szt;
262 Ji.template block<3, 3>(3, 3) = dq_dR * M;
270 skew(Sx, Sy, Sz, Matrix3::Identity());
271 Eigen::Map<Matrix3> Mx(buf);
272 Mx.noalias() = Re * Sx;
273 Eigen::Map<Matrix3> My(buf + 9);
274 My.noalias() = Re * Sy;
275 Eigen::Map<Matrix3> Mz(buf + 18);
276 Mz.noalias() = Re * Sz;
277 Jj.template block<3, 3>(3, 3) = dq_dR * M;
283 const Eigen::MatrixBase<Derived>& JConstRef,
285 const Isometry3& P = Isometry3::Identity()) {
286 Eigen::MatrixBase<Derived>& J =
287 const_cast<Eigen::MatrixBase<Derived>&
>(JConstRef);
288 J.derived().resize(6, 6);
294 Isometry3::ConstTranslationPart tb = B.translation();
298 Eigen::Matrix<double, 3, 9, Eigen::ColMajor> dq_dR;
299 compute_dq_dR(dq_dR, Re(0, 0), Re(1, 0), Re(2, 0), Re(0, 1), Re(1, 1),
300 Re(2, 1), Re(0, 2), Re(1, 2), Re(2, 2));
305 J.template block<3, 3>(0, 0) = Ra;
312 J.template block<3, 3>(0, 3) = Ra * S;
320 Eigen::Map<Eigen::Matrix<double, 9, 3, Eigen::ColMajor> > M(buf);
325 Eigen::Map<Matrix3> M2(temp.data());
326 Eigen::Map<Matrix3> Mx(buf);
329 Eigen::Map<Matrix3> My(buf + 9);
332 Eigen::Map<Matrix3> Mz(buf + 18);
335 Eigen::Map<Matrix3> Mx(buf);
337 Eigen::Map<Matrix3> My(buf + 9);
339 Eigen::Map<Matrix3> Mz(buf + 18);
342 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)