18 #ifndef __se3_force_dense_hpp__ 19 #define __se3_force_dense_hpp__ 26 template<
typename Derived>
27 struct SE3GroupAction< ForceDense<Derived> >
29 typedef typename SE3GroupAction< Derived >::ReturnType ReturnType;
32 template<
typename Derived,
typename MotionDerived>
33 struct MotionAlgebraAction< ForceDense<Derived>, MotionDerived >
35 typedef typename MotionAlgebraAction< Derived, MotionDerived >::ReturnType ReturnType;
39 template<
typename Derived>
44 FORCE_TYPEDEF_TPL(Derived);
52 Derived & setZero() { linear().setZero(); angular().setZero();
return derived(); }
53 Derived & setRandom() { linear().setZero(); angular().setZero();
return derived(); }
57 {
return linear() == other.
linear() && angular() == other.
angular(); }
61 {
return other.derived() == derived(); }
73 Derived & operator=(
const Eigen::MatrixBase<V6> & v)
75 EIGEN_STATIC_ASSERT_VECTOR_ONLY(V6); assert(v.size() == 6);
76 linear() = v.template segment<3>(LINEAR);
77 angular() = v.template segment<3>(ANGULAR);
81 ForcePlain operator-()
const {
return derived().__opposite__(); }
83 ForcePlain operator+(
const ForceDense<M1> & v)
const {
return derived().__plus__(v.derived()); }
85 ForcePlain operator-(
const ForceDense<M1> & v)
const {
return derived().__minus__(v.derived()); }
88 Derived & operator+=(
const ForceDense<M1> & v) {
return derived().__pequ__(v.derived()); }
91 { v.derived().addTo(derived());
return derived(); }
94 Derived & operator-=(
const ForceDense<M1> & v) {
return derived().__mequ__(v.derived()); }
96 ForcePlain __opposite__()
const {
return ForcePlain(-linear(),-angular()); }
100 {
return ForcePlain(linear()+v.
linear(), angular()+v.
angular()); }
102 template<
typename M1>
104 {
return ForcePlain(linear()-v.
linear(), angular()-v.
angular()); }
106 template<
typename M1>
108 { linear() += v.
linear(); angular() += v.
angular();
return derived(); }
110 template<
typename M1>
112 { linear() -= v.
linear(); angular() -= v.
angular();
return derived(); }
114 template<
typename OtherScalar>
115 ForcePlain __mult__(
const OtherScalar & alpha)
const 116 {
return ForcePlain(alpha*linear(),alpha*angular()); }
118 template<
typename OtherScalar>
119 ForcePlain __div__(
const OtherScalar & alpha)
const 120 {
return derived().__mult__((OtherScalar)(1)/alpha); }
122 template<
typename F1>
124 {
return phi.linear().dot(linear()) + phi.angular().dot(angular()); }
126 template<
typename M1,
typename M2>
129 fout.
linear() = v.angular().cross(linear());
130 fout.
angular() = v.angular().cross(angular())+v.linear().cross(linear());
133 template<
typename M1>
141 template<
typename M2>
142 bool isApprox(
const ForceDense<M2> & f,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 143 {
return derived().isApprox_impl(f, prec);}
145 template<
typename D2>
146 bool isApprox_impl(
const ForceDense<D2> & f,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 148 return linear().isApprox(f.
linear(), prec) && angular().isApprox(f.
angular(), prec);
151 template<
typename S2,
int O2,
typename D2>
154 f.
linear() = m.rotation()*linear();
155 f.
angular() = m.rotation()*angular() + m.translation().cross(f.
linear());
158 template<
typename S2,
int O2>
162 se3Action_impl(m,res);
166 template<
typename S2,
int O2,
typename D2>
169 f.
linear() = angular()-m.translation().cross(linear());
171 f.
linear() = m.rotation().transpose()*linear();
174 template<
typename S2,
int O2>
175 ForcePlain se3ActionInverse_impl(
const SE3Tpl<S2,O2> & m)
const 178 se3ActionInverse_impl(m,res);
182 void disp_impl(std::ostream & os)
const 185 <<
" f = " << linear().transpose () << std::endl
186 <<
"tau = " << angular().transpose () << std::endl;
190 ForceRefType
ref() {
return derived().ref(); }
195 template<
typename F1>
198 {
return f.derived()*alpha; }
202 #endif // ifndef __se3_force_dense_hpp__
ConstAngularType angular() const
Return the angular part of the force vector.
ConstLinearType linear() const
Return the linear part of the force vector.
Base interface for forces representation.