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);
Definition: ABInertia.h:19
matrix3_t massMatrix() const
Definition: ABInertia.h:60
ABInertia< T > operator+(const ABInertia< T > &rbI) const
Definition: ABInertia.h:104
ABInertia< T > operator*(T2 scalar) const
Definition: ABInertia.h:142
void mul(const Eigen::MatrixBase< Derived > &mv, Eigen::MatrixBase< Derived > &result) const
Definition: Operators.h:195
const matrix3_t & gInertia() const
Definition: ABInertia.h:69
matrix3_t inertia() const
Definition: ABInertia.h:81
Definition: ForceVec.h:20
vector3_t & force()
Definition: ForceVec.h:77
vector3_t & couple()
Definition: ForceVec.h:55
Definition: MotionVec.h:20
const vector3_t & angular() const
Definition: MotionVec.h:51
const vector3_t & linear() const
Definition: MotionVec.h:63
MotionVec< T > cross(const MotionVec< T > &mv2) const
Definition: Operators.h:113
ForceVec< T > crossDual(const ForceVec< T > &fv2) const
Definition: Operators.h:132
T dot(const ForceVec< T > &fv2) const
Definition: Operators.h:151
Definition: RBInertia.h:25
RBInertia< T > operator*(T2 scalar) const
Definition: RBInertia.h:134
void mul(const Eigen::MatrixBase< Derived > &mv, Eigen::MatrixBase< Derived > &result) const
Definition: Operators.h:165
const vector3_t & momentum() const
Definition: RBInertia.h:62
matrix3_t inertia() const
Definition: RBInertia.h:74
T mass() const
Definition: RBInertia.h:56
Matrix3< T > vector3ToCrossMatrix(const Vector3< T > &vec)
Definition: EigenUtility.h:16
Matrix< T, 3, 1 > Vector3
Definition: EigenTypedef.h:18
Matrix< T, 3, 3 > Matrix3
Definition: EigenTypedef.h:20
void colwiseLeftMultEq(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2, Eigen::MatrixBase< Derived3 > const &result)
Definition: Operators.h:51
void colwiseCrossEq(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2, Eigen::MatrixBase< Derived3 > const &result)
Definition: Operators.h:18
void colwiseCrossPlusEq(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2, Eigen::MatrixBase< Derived3 > const &result)
Definition: Operators.h:29
void colwiseCrossMinusEq(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2, Eigen::MatrixBase< Derived3 > const &result)
Definition: Operators.h:40
Definition: ABInertia.h:11
Eigen::Block< Derived, 3, Eigen::Dynamic > motionLinear(Eigen::MatrixBase< Derived > &mv)
Definition: Operators.h:77
Eigen::Block< Derived, 3, Eigen::Dynamic > forceCouple(Eigen::MatrixBase< Derived > &mv)
Definition: Operators.h:89
Eigen::Block< Derived, 3, Eigen::Dynamic > forceForce(Eigen::MatrixBase< Derived > &mv)
Definition: Operators.h:101
Eigen::Block< Derived, 3, Eigen::Dynamic > motionAngular(Eigen::MatrixBase< Derived > &mv)
Definition: Operators.h:65