5 #ifndef __pinocchio_force_dense_hpp__ 6 #define __pinocchio_force_dense_hpp__ 13 template<
typename Derived>
14 struct SE3GroupAction< ForceDense<Derived> >
16 typedef typename SE3GroupAction< Derived >::ReturnType ReturnType;
19 template<
typename Derived,
typename MotionDerived>
20 struct MotionAlgebraAction< ForceDense<Derived>, MotionDerived >
22 typedef typename MotionAlgebraAction< Derived, MotionDerived >::ReturnType ReturnType;
26 template<
typename Derived>
31 FORCE_TYPEDEF_TPL(Derived);
38 using Base::operator=;
40 Derived & setZero() { linear().setZero(); angular().setZero();
return derived(); }
41 Derived & setRandom() { linear().setRandom(); angular().setRandom();
return derived(); }
45 {
return linear() == other.
linear() && angular() == other.
angular(); }
49 {
return other.derived() == derived(); }
63 return derived().setFrom(other.derived());
67 Derived & operator=(
const Eigen::MatrixBase<V6> & v)
69 EIGEN_STATIC_ASSERT_VECTOR_ONLY(V6); assert(v.size() == 6);
70 linear() = v.template segment<3>(LINEAR);
71 angular() = v.template segment<3>(ANGULAR);
75 ForcePlain operator-()
const {
return derived().__opposite__(); }
77 ForcePlain operator+(
const ForceDense<F1> & f)
const {
return derived().__plus__(f.derived()); }
79 ForcePlain operator-(
const ForceDense<F1> & f)
const {
return derived().__minus__(f.derived()); }
82 Derived & operator+=(
const ForceDense<F1> & f) {
return derived().__pequ__(f.derived()); }
85 { f.derived().addTo(derived());
return derived(); }
88 Derived & operator-=(
const ForceDense<M1> & v) {
return derived().__mequ__(v.derived()); }
90 ForcePlain __opposite__()
const {
return ForcePlain(-linear(),-angular()); }
94 {
return ForcePlain(linear()+v.
linear(), angular()+v.
angular()); }
98 {
return ForcePlain(linear()-v.
linear(), angular()-v.
angular()); }
100 template<
typename M1>
102 { linear() += v.
linear(); angular() += v.
angular();
return derived(); }
104 template<
typename M1>
106 { linear() -= v.
linear(); angular() -= v.
angular();
return derived(); }
108 template<
typename OtherScalar>
109 ForcePlain __mult__(
const OtherScalar & alpha)
const 110 {
return ForcePlain(alpha*linear(),alpha*angular()); }
112 template<
typename OtherScalar>
113 ForcePlain __div__(
const OtherScalar & alpha)
const 114 {
return derived().__mult__((OtherScalar)(1)/alpha); }
116 template<
typename F1>
118 {
return phi.linear().dot(linear()) + phi.angular().dot(angular()); }
120 template<
typename M1,
typename M2>
123 fout.
linear().noalias() = v.angular().cross(linear());
124 fout.
angular().noalias() = v.angular().cross(angular())+v.linear().cross(linear());
127 template<
typename M1>
135 template<
typename M2>
136 bool isApprox(
const ForceDense<M2> & f,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 137 {
return derived().isApprox_impl(f, prec);}
139 template<
typename D2>
140 bool isApprox_impl(
const ForceDense<D2> & f,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 142 return linear().isApprox(f.
linear(), prec) && angular().isApprox(f.
angular(), prec);
145 template<
typename S2,
int O2,
typename D2>
148 f.
linear().noalias() = m.rotation()*linear();
149 f.
angular().noalias() = m.rotation()*angular();
153 template<
typename S2,
int O2>
157 se3Action_impl(m,res);
161 template<
typename S2,
int O2,
typename D2>
164 f.
linear().noalias() = m.rotation().transpose()*linear();
165 f.
angular().noalias() = m.rotation().transpose()*(angular()-m.translation().cross(linear()));
168 template<
typename S2,
int O2>
169 ForcePlain se3ActionInverse_impl(
const SE3Tpl<S2,O2> & m)
const 172 se3ActionInverse_impl(m,res);
176 void disp_impl(std::ostream & os)
const 179 <<
" f = " << linear().transpose () << std::endl
180 <<
"tau = " << angular().transpose () << std::endl;
184 ForceRefType
ref() {
return derived().ref(); }
189 template<
typename F1>
192 {
return f.derived()*alpha; }
196 #endif // ifndef __pinocchio_force_dense_hpp__
ConstAngularType angular() const
Return the angular part of the force vector.
Base interface for forces representation.
Main pinocchio namespace.
Common traits structure to fully define base classes for CRTP.
ConstLinearType linear() const
Return the linear part of the force vector.