19 #ifndef __se3_joint_free_flyer_hpp__ 20 #define __se3_joint_free_flyer_hpp__ 22 #include "pinocchio/macros.hpp" 23 #include "pinocchio/spatial/inertia.hpp" 24 #include "pinocchio/multibody/joint/joint-base.hpp" 25 #include "pinocchio/multibody/constraint.hpp" 26 #include "pinocchio/spatial/explog.hpp" 27 #include "pinocchio/math/fwd.hpp" 28 #include "pinocchio/math/quaternion.hpp" 35 struct ConstraintIdentity;
40 typedef double Scalar;
41 typedef Eigen::Matrix<double,3,1,0> Vector3;
42 typedef Eigen::Matrix<double,4,1,0> Vector4;
43 typedef Eigen::Matrix<double,6,1,0> Vector6;
44 typedef Eigen::Matrix<double,3,3,0> Matrix3;
45 typedef Eigen::Matrix<double,4,4,0> Matrix4;
46 typedef Eigen::Matrix<double,6,6,0> Matrix6;
47 typedef Matrix3 Angular_t;
48 typedef Vector3 Linear_t;
49 typedef const Matrix3 ConstAngular_t;
50 typedef const Vector3 ConstLinear_t;
51 typedef Matrix6 ActionMatrix_t;
52 typedef Eigen::Quaternion<double,0> Quaternion_t;
61 typedef Eigen::Matrix<Scalar,6,1,0> JointMotion;
62 typedef Eigen::Matrix<Scalar,6,1,0> JointForce;
63 typedef Eigen::Matrix<Scalar,6,6> DenseBase;
70 enum { NV = 6, Options = 0 };
75 SE3::Matrix6 se3Action(
const SE3 & m)
const {
return m.toActionMatrix(); }
77 int nv_impl()
const {
return NV; }
81 Force::Vector6 operator* (
const Force & phi)
88 DenseBase variation(
const Motion & m)
const {
return m.toActionMatrix(); }
94 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(D,6);
106 inline const Inertia::Matrix6 & operator* (
const Inertia::Matrix6 & Y,
const ConstraintIdentity &)
111 inline Inertia::Matrix6 & operator* (Inertia::Matrix6 & Y,
const ConstraintIdentity &)
123 const Eigen::MatrixBase<D> &
132 struct ActionReturn<ConstraintIdentity >
133 {
typedef SE3::Matrix6 Type; };
136 struct JointFreeFlyer;
145 typedef double Scalar;
152 typedef Eigen::Matrix<double,6,NV> F_t;
155 typedef Eigen::Matrix<double,6,NV> U_t;
156 typedef Eigen::Matrix<double,NV,NV> D_t;
157 typedef Eigen::Matrix<double,6,NV> UD_t;
159 typedef Eigen::Matrix<double,NQ,1> ConfigVector_t;
160 typedef Eigen::Matrix<double,NV,1> TangentVector_t;
167 typedef JointFreeFlyer JointDerived;
170 typedef Eigen::Matrix<double,6,6> Matrix6;
171 typedef Eigen::Quaternion<double> Quaternion;
172 typedef Eigen::Matrix<double,3,1> Vector3;
192 typedef JointFreeFlyer JointDerived;
199 typedef Motion::Vector3 Vector3;
201 JointDataDerived createData()
const {
return JointDataDerived(); }
204 inline void forwardKinematics(Transformation_t & M,
const Eigen::MatrixBase<V> & q_joint)
const 206 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigVector_t,V);
208 typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
210 ConstQuaternionMap_t quat(q_joint.template tail<4>().data());
212 assert(std::fabs(quat.coeffs().squaredNorm()-1.) <= 1e-4);
214 M.rotation(quat.matrix());
215 M.translation(q_joint.template head<3>());
218 void calc(JointDataDerived & data,
219 const Eigen::VectorXd & qs)
const 221 typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
223 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type q = qs.segment<NQ>(idx_q());
224 ConstQuaternionMap_t quat(q.tail<4> ().data());
226 data.M.rotation (quat.matrix());
227 data.M.translation (q.head<3>());
230 void calc(JointDataDerived & data,
231 const Eigen::VectorXd & qs,
232 const Eigen::VectorXd & vs )
const 234 typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
236 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type q = qs.segment<NQ>(idx_q());
237 data.v = vs.segment<NV>(idx_v());
239 ConstQuaternionMap_t quat(q.tail<4> ().data());
241 data.M.rotation (quat.matrix());
242 data.M.translation (q.head<3>());
245 void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I,
const bool update_I)
const 248 data.Dinv = I.inverse();
254 Scalar finiteDifferenceIncrement()
const 257 return 2.*sqrt(sqrt(Eigen::NumTraits<Scalar>::epsilon()));
260 ConfigVector_t integrate_impl(
const Eigen::VectorXd & qs,
const Eigen::VectorXd & vs)
const 262 typedef Eigen::Map<Motion_t::Quaternion_t> QuaternionMap_t;
264 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q = qs.segment<NQ> (idx_q ());
265 Eigen::VectorXd::ConstFixedSegmentReturnType<NV>::Type & q_dot = vs.segment<NV> (idx_v ());
268 Transformation_t M0; forwardKinematics(M0,q);
269 Transformation_t M1(M0*exp6(Motion_t(q_dot)));
271 res.head<3>() = M1.translation();
272 QuaternionMap_t res_quat(res.tail<4>().data());
273 res_quat = M1.rotation();
276 firstOrderNormalize(res_quat);
281 ConfigVector_t interpolate_impl(
const Eigen::VectorXd & q0,
const Eigen::VectorXd & q1,
const double u)
const 283 typedef Eigen::Map<Motion_t::Quaternion_t> QuaternionMap_t;
285 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ());
286 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ());
288 if (u == 0.)
return q_0;
289 else if( u == 1.)
return q_1;
296 TangentVector_t nu(u*difference(q0, q1));
297 Transformation_t M0; forwardKinematics(M0,q_0);
298 Transformation_t M1(M0*exp6(Motion_t(nu)));
301 res.head<3>() = M1.translation();
302 QuaternionMap_t res_quat(res.tail<4>().data());
303 res_quat = M1.rotation();
304 firstOrderNormalize(res_quat);
310 ConfigVector_t random_impl()
const 312 ConfigVector_t q(ConfigVector_t::Random());
314 typedef Eigen::Map<Motion_t::Quaternion_t> QuaternionMap_t;
315 uniformRandom(QuaternionMap_t(q.segment<4>(3).data()));
320 ConfigVector_t randomConfiguration_impl(
const ConfigVector_t & lower_pos_limit,
const ConfigVector_t & upper_pos_limit )
const throw (std::runtime_error)
322 ConfigVector_t result;
324 for (Index i = 0; i < 3; ++i)
326 if(lower_pos_limit[i] == -std::numeric_limits<double>::infinity() ||
327 upper_pos_limit[i] == std::numeric_limits<double>::infinity() )
329 std::ostringstream error;
330 error <<
"non bounded limit. Cannot uniformly sample joint nb " << id();
331 throw std::runtime_error(error.str());
334 result[i] = lower_pos_limit[i] + (upper_pos_limit[i] - lower_pos_limit[i]) * (Scalar)(rand())/RAND_MAX;
337 typedef Eigen::Map<Motion_t::Quaternion_t> QuaternionMap_t;
338 uniformRandom(QuaternionMap_t(result.segment<4>(3).data()));
343 TangentVector_t difference_impl(
const Eigen::VectorXd & q0,
const Eigen::VectorXd & q1)
const 345 Transformation_t M0(Transformation_t::Identity()); forwardKinematics(M0, q0.segment<NQ> (idx_q ()));
346 Transformation_t M1(Transformation_t::Identity()); forwardKinematics(M1, q1.segment<NQ> (idx_q ()));
348 return se3::log6(M0.inverse()*M1);
351 double distance_impl(
const Eigen::VectorXd & q0,
const Eigen::VectorXd & q1)
const 353 return difference_impl(q0,q1).norm();
356 ConfigVector_t neutralConfiguration_impl()
const 364 void normalize_impl(Eigen::VectorXd& q)
const 366 q.segment<4>(idx_q()+3).normalize();
369 bool isSameConfiguration_impl(
const Eigen::VectorXd& q1,
const Eigen::VectorXd& q2,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 371 typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
373 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ());
374 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_2 = q2.segment<NQ> (idx_q ());
376 ConstQuaternionMap_t quat1(q_1.tail<4> ().data());
377 ConstQuaternionMap_t quat2(q_2.tail<4> ().data());
379 return ( q_1.head<3>().isApprox(q_2.head<3>(), prec) && defineSameRotation(quat1,quat2) );
382 static std::string classname() {
return std::string(
"JointModelFreeFlyer"); }
383 std::string shortname()
const {
return classname(); }
389 #endif // ifndef __se3_joint_free_flyer_hpp__
Concreate Class representing a force.
const Vector6 & toVector() const
Return the force.