30 MOTION_TYPEDEF_TPL(Derived);
48 angular().setRandom();
55 X.template block<3, 3>(ANGULAR, ANGULAR) = X.template block<3, 3>(LINEAR, LINEAR) =
57 X.template block<3, 3>(LINEAR, ANGULAR) =
skew(linear());
58 X.template block<3, 3>(ANGULAR, LINEAR).setZero();
66 X.template block<3, 3>(ANGULAR, ANGULAR) = X.template block<3, 3>(LINEAR, LINEAR) =
68 X.template block<3, 3>(ANGULAR, LINEAR) =
skew(linear());
69 X.template block<3, 3>(LINEAR, ANGULAR).setZero();
77 M.template block<3, 3>(0, 0) =
skew(angular());
78 M.template block<3, 1>(0, 3) = linear();
79 M.template block<1, 4>(3, 0).setZero();
84 bool isEqual_impl(
const MotionDense<D2> & other)
const 86 return linear() == other.linear() && angular() == other.angular();
92 return other.derived() == derived();
97 Derived & operator=(
const MotionDense<D2> & other)
99 return derived().set(other.derived());
102 Derived & operator=(
const MotionDense & other)
104 return derived().set(other.derived());
107 template<
typename D2>
108 Derived & set(
const MotionDense<D2> & other)
110 linear() = other.linear();
111 angular() = other.angular();
115 template<
typename D2>
118 other.derived().setTo(derived());
122 template<
typename V6>
123 Derived & operator=(
const Eigen::MatrixBase<V6> & v)
125 EIGEN_STATIC_ASSERT_VECTOR_ONLY(V6);
126 assert(v.size() == 6);
127 linear() = v.template segment<3>(LINEAR);
128 angular() = v.template segment<3>(ANGULAR);
134 return derived().__opposite__();
136 template<
typename M1>
137 MotionPlain operator+(
const MotionDense<M1> & v)
const 139 return derived().__plus__(v.derived());
141 template<
typename M1>
142 MotionPlain operator-(
const MotionDense<M1> & v)
const 144 return derived().__minus__(v.derived());
147 template<
typename M1>
148 Derived & operator+=(
const MotionDense<M1> & v)
150 return derived().__pequ__(v.derived());
152 template<
typename M1>
155 v.derived().addTo(derived());
159 template<
typename M1>
160 Derived & operator-=(
const MotionDense<M1> & v)
162 return derived().__mequ__(v.derived());
170 template<
typename M1>
171 MotionPlain __plus__(
const MotionDense<M1> & v)
const 173 return MotionPlain(linear() + v.linear(), angular() + v.angular());
176 template<
typename M1>
177 MotionPlain __minus__(
const MotionDense<M1> & v)
const 179 return MotionPlain(linear() - v.linear(), angular() - v.angular());
182 template<
typename M1>
183 Derived & __pequ__(
const MotionDense<M1> & v)
185 linear() += v.linear();
186 angular() += v.angular();
190 template<
typename M1>
191 Derived & __mequ__(
const MotionDense<M1> & v)
193 linear() -= v.linear();
194 angular() -= v.angular();
198 template<
typename OtherScalar>
199 MotionPlain __mult__(
const OtherScalar & alpha)
const 201 return MotionPlain(alpha * linear(), alpha * angular());
204 template<
typename OtherScalar>
205 MotionPlain __div__(
const OtherScalar & alpha)
const 207 return derived().__mult__((OtherScalar)(1) / alpha);
210 template<
typename F1>
213 return phi.
linear().dot(linear()) + phi.
angular().dot(angular());
217 typename MotionAlgebraAction<D, Derived>::ReturnType cross_impl(
const D & d)
const 219 return d.motionAction(derived());
222 template<
typename M1,
typename M2>
223 void motionAction(
const MotionDense<M1> & v, MotionDense<M2> & mout)
const 225 mout.linear() = v.linear().cross(angular()) + v.angular().cross(linear());
226 mout.angular() = v.angular().cross(angular());
229 template<
typename M1>
230 MotionPlain motionAction(
const MotionDense<M1> & v)
const 233 motionAction(v, res);
237 template<
typename M2>
239 const MotionDense<M2> & m2,
240 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 242 return derived().isApprox_impl(m2, prec);
245 template<
typename D2>
247 const MotionDense<D2> & m2,
248 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 250 return linear().isApprox(m2.linear(), prec) && angular().isApprox(m2.angular(), prec);
253 bool isZero_impl(
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 255 return linear().isZero(prec) && angular().isZero(prec);
258 template<
typename S2,
int O2,
typename D2>
259 void se3Action_impl(
const SE3Tpl<S2, O2> & m, MotionDense<D2> & v)
const 261 v.angular().noalias() = m.rotation() * angular();
262 v.linear().noalias() = m.rotation() * linear() + m.translation().cross(v.angular());
265 template<
typename S2,
int O2>
266 typename SE3GroupAction<Derived>::ReturnType se3Action_impl(
const SE3Tpl<S2, O2> & m)
const 268 typename SE3GroupAction<Derived>::ReturnType res;
269 se3Action_impl(m, res);
273 template<
typename S2,
int O2,
typename D2>
274 void se3ActionInverse_impl(
const SE3Tpl<S2, O2> & m, MotionDense<D2> & v)
const 276 v.linear().noalias() =
277 m.rotation().transpose() * (linear() - m.translation().cross(angular()));
278 v.angular().noalias() = m.rotation().transpose() * angular();
281 template<
typename S2,
int O2>
282 typename SE3GroupAction<Derived>::ReturnType
285 typename SE3GroupAction<Derived>::ReturnType res;
286 se3ActionInverse_impl(m, res);
290 void disp_impl(std::ostream & os)
const 292 os <<
" v = " << linear().transpose() << std::endl
293 <<
" w = " << angular().transpose() << std::endl;
299 return derived().ref();
305 MotionDense(
const MotionDense &) =
delete;