14 namespace sva_internal
17 template<
typename Derived1,
typename Derived2,
typename Derived3>
19 const Eigen::MatrixBase<Derived2> & m2,
20 Eigen::MatrixBase<Derived3>
const & result)
22 Eigen::MatrixBase<Derived3> & result_nc =
const_cast<Eigen::MatrixBase<Derived3> &
>(result);
23 result_nc.row(0) = (m1.row(1) * m2.coeff(2) - m1.row(2) * m2.coeff(1));
24 result_nc.row(1) = (m1.row(2) * m2.coeff(0) - m1.row(0) * m2.coeff(2));
25 result_nc.row(2) = (m1.row(0) * m2.coeff(1) - m1.row(1) * m2.coeff(0));
28 template<
typename Derived1,
typename Derived2,
typename Derived3>
30 const Eigen::MatrixBase<Derived2> & m2,
31 Eigen::MatrixBase<Derived3>
const & result)
33 Eigen::MatrixBase<Derived3> & result_nc =
const_cast<Eigen::MatrixBase<Derived3> &
>(result);
34 result_nc.row(0) += (m1.row(1) * m2.coeff(2) - m1.row(2) * m2.coeff(1));
35 result_nc.row(1) += (m1.row(2) * m2.coeff(0) - m1.row(0) * m2.coeff(2));
36 result_nc.row(2) += (m1.row(0) * m2.coeff(1) - m1.row(1) * m2.coeff(0));
39 template<
typename Derived1,
typename Derived2,
typename Derived3>
41 const Eigen::MatrixBase<Derived2> & m2,
42 Eigen::MatrixBase<Derived3>
const & result)
44 Eigen::MatrixBase<Derived3> & result_nc =
const_cast<Eigen::MatrixBase<Derived3> &
>(result);
45 result_nc.row(0) -= (m1.row(1) * m2.coeff(2) - m1.row(2) * m2.coeff(1));
46 result_nc.row(1) -= (m1.row(2) * m2.coeff(0) - m1.row(0) * m2.coeff(2));
47 result_nc.row(2) -= (m1.row(0) * m2.coeff(1) - m1.row(1) * m2.coeff(0));
50 template<
typename Derived1,
typename Derived2,
typename Derived3>
52 const Eigen::MatrixBase<Derived2> & m2,
53 Eigen::MatrixBase<Derived3>
const & result)
55 Eigen::MatrixBase<Derived3> & result_nc =
const_cast<Eigen::MatrixBase<Derived3> &
>(result);
56 for(
typename Derived1::Index i = 0; i < m1.cols(); ++i)
58 result_nc.col(i) = m2 * m1.col(i);
64 template<
typename Derived>
65 inline Eigen::Block<Derived, 3, Eigen::Dynamic>
motionAngular(Eigen::MatrixBase<Derived> & mv)
67 return Eigen::Block<Derived, 3, Eigen::Dynamic>(mv.derived(), 0, 0, 3, mv.cols());
70 template<
typename Derived>
71 inline Eigen::Block<const Derived, 3, Eigen::Dynamic>
motionAngular(
const Eigen::MatrixBase<Derived> & mv)
73 return Eigen::Block<const Derived, 3, Eigen::Dynamic>(mv.derived(), 0, 0, 3, mv.cols());
76 template<
typename Derived>
77 inline Eigen::Block<Derived, 3, Eigen::Dynamic>
motionLinear(Eigen::MatrixBase<Derived> & mv)
79 return Eigen::Block<Derived, 3, Eigen::Dynamic>(mv.derived(), 3, 0, 3, mv.cols());
82 template<
typename Derived>
83 inline Eigen::Block<const Derived, 3, Eigen::Dynamic>
motionLinear(
const Eigen::MatrixBase<Derived> & mv)
85 return Eigen::Block<const Derived, 3, Eigen::Dynamic>(mv.derived(), 3, 0, 3, mv.cols());
88 template<
typename Derived>
89 inline Eigen::Block<Derived, 3, Eigen::Dynamic>
forceCouple(Eigen::MatrixBase<Derived> & mv)
91 return Eigen::Block<Derived, 3, Eigen::Dynamic>(mv.derived(), 0, 0, 3, mv.cols());
94 template<
typename Derived>
95 inline Eigen::Block<const Derived, 3, Eigen::Dynamic>
forceCouple(
const Eigen::MatrixBase<Derived> & mv)
97 return Eigen::Block<const Derived, 3, Eigen::Dynamic>(mv.derived(), 0, 0, 3, mv.cols());
100 template<
typename Derived>
101 inline Eigen::Block<Derived, 3, Eigen::Dynamic>
forceForce(Eigen::MatrixBase<Derived> & mv)
103 return Eigen::Block<Derived, 3, Eigen::Dynamic>(mv.derived(), 3, 0, 3, mv.cols());
106 template<
typename Derived>
107 inline Eigen::Block<const Derived, 3, Eigen::Dynamic>
forceForce(
const Eigen::MatrixBase<Derived> & mv)
109 return Eigen::Block<const Derived, 3, Eigen::Dynamic>(mv.derived(), 3, 0, 3, mv.cols());
119 template<
typename Derived>
120 inline void MotionVec<T>::cross(
const Eigen::MatrixBase<Derived> & mv2, Eigen::MatrixBase<Derived> & result)
const
122 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
123 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
138 template<
typename Derived>
141 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
142 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
153 return angular().dot(fv2.
couple()) + linear().dot(fv2.
force());
164 template<
typename Derived>
165 inline void RBInertia<T>::mul(
const Eigen::MatrixBase<Derived> & mv, Eigen::MatrixBase<Derived> & result)
const
167 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
168 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
182 I.template triangularView<Eigen::Lower>() = inertia() + rbI.
inertia();
190 massMatrix() * mv.
linear() + gInertia().transpose() * mv.
angular());
194 template<
typename Derived>
195 inline void ABInertia<T>::mul(
const Eigen::MatrixBase<Derived> & mv, Eigen::MatrixBase<Derived> & result)
const
197 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
198 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
217 return (E * mv.
angular()).eval();
229 template<
typename Derived>
230 inline void PTransform<T>::mul(
const Eigen::MatrixBase<Derived> & mv, Eigen::MatrixBase<Derived> & result)
const
232 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
233 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
251 ret.angular_.noalias() = E.transpose() * mv.angular_;
252 ret.linear_.noalias() = E.transpose() * mv.linear_;
253 ret.linear_.noalias() += r.cross(ret.angular_);
261 return (E.transpose() * mv.
angular()).eval();
269 return (E.transpose() * mv.
linear() + r.cross(E.transpose() * mv.
angular())).eval();
273 template<
typename Derived>
276 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
277 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"motion vec and matrix must be the same type");
291 return ForceVec<T>(coupleDualMul(fv), forceDualMul(fv));
299 return (E * (fv.
couple() - r.cross(fv.
force()))).eval();
306 return (E * fv.
force()).eval();
310 template<
typename Derived>
313 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
314 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"force vec and matrix must be the same type");
332 ret.force_.noalias() = E.transpose() * fv.force_;
333 ret.couple_.noalias() = E.transpose() * fv.couple_;
334 ret.couple_.noalias() += r.cross(ret.force_);
344 return (E.transpose() * fv.couple_ + r.cross(E.transpose() * fv.force_)).eval();
351 return (E.transpose() * fv.force_).eval();
355 template<
typename Derived>
358 static_assert(Derived::RowsAtCompileTime == 6,
"the matrix must have exactly 6 rows");
359 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"force vec and matrix must be the same type");
376 I.template triangularView<Eigen::Lower>() =
379 + Eigen::vector3ToCrossMatrix<T>(rbI.
momentum() - rbI.
mass() * r) * Eigen::vector3ToCrossMatrix<T>(r))
390 I.template triangularView<Eigen::Lower>() =
391 E.transpose() * rbI.
inertia() * E
392 - Eigen::vector3ToCrossMatrix<T>(r) * Eigen::vector3ToCrossMatrix<T>(E.transpose() * rbI.
momentum())
393 - Eigen::vector3ToCrossMatrix<T>(E.transpose() * rbI.
momentum() + rbI.
mass() * r)
394 * Eigen::vector3ToCrossMatrix<T>(r);
409 M.template triangularView<Eigen::Lower>() = E * massM * E.transpose();
410 I.template triangularView<Eigen::Lower>() =
411 E * (rbI.
inertia() - rCross * rbI.
gInertia().transpose() + (tmpI * rCross)) * E.transpose();
427 M.template triangularView<Eigen::Lower>() = Mp;
428 I.template triangularView<Eigen::Lower>() =
429 (E.transpose() * rbI.
inertia() * E + rCross * Hp.transpose() - (Hp + rCross * Mp) * rCross);