Go to the documentation of this file.
5 #ifndef __pinocchio_multibody_liegroup_special_orthogonal_operation_hpp__
6 #define __pinocchio_multibody_liegroup_special_orthogonal_operation_hpp__
17 template<
int Dim,
typename Scalar,
int Options = 0>
22 template<
int Dim,
typename Scalar,
int Options>
27 template<
typename _Scalar,
int _Options>
39 template<
typename _Scalar,
int _Options>
51 template<
typename _Scalar,
int _Options>
53 :
public LieGroupBase<SpecialOrthogonalOperationTpl<2, _Scalar, _Options>>
56 typedef Eigen::Matrix<Scalar, 2, 2>
Matrix2;
57 typedef typename Eigen::NumTraits<Scalar>::Real
RealScalar;
59 template<
typename Matrix2Like>
63 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix2Like, 2, 2);
67 static const Scalar PI_value = PI<Scalar>();
77 static_cast<Scalar>(-PI_value)),
94 assert(check_expression_if_real<Scalar>(theta == theta) &&
"theta is NaN");
100 template<
typename Matrix2Like>
104 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix2Like, 2, 2);
132 return std::string(
"SO(2)");
135 template<
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
137 const Eigen::MatrixBase<ConfigL_t> &
q0,
138 const Eigen::MatrixBase<ConfigR_t> &
q1,
139 const Eigen::MatrixBase<Tangent_t> &
d)
142 R(0, 0) =
R(1, 1) =
q0.dot(
q1);
148 template<ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianOut_t>
150 const Eigen::MatrixBase<ConfigL_t> &
q0,
151 const Eigen::MatrixBase<ConfigR_t> &
q1,
152 const Eigen::MatrixBase<JacobianOut_t> &
J)
155 R(0, 0) =
R(1, 1) =
q0.dot(
q1);
163 template<
class ConfigIn_t,
class Velocity_t,
class ConfigOut_t>
165 const Eigen::MatrixBase<ConfigIn_t> &
q,
166 const Eigen::MatrixBase<Velocity_t> &
v,
167 const Eigen::MatrixBase<ConfigOut_t> &
qout)
175 Scalar cosOmega, sinOmega;
176 SINCOS(omega, &sinOmega, &cosOmega);
179 out << cosOmega * ca - sinOmega * sa, sinOmega * ca + cosOmega * sa;
182 const Scalar norm2 = out.squaredNorm();
183 out *= (3 - norm2) / 2;
187 template<
class Config_t,
class Jacobian_t>
189 const Eigen::MatrixBase<Config_t> &
q,
const Eigen::MatrixBase<Jacobian_t> &
J)
191 assert(
J.rows() ==
nq() &&
J.cols() ==
nv() &&
"J is not of the right dimension");
196 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
198 const Eigen::MatrixBase<Config_t> & ,
199 const Eigen::MatrixBase<Tangent_t> & ,
200 const Eigen::MatrixBase<JacobianOut_t> &
J,
216 assert(
false &&
"Wrong Op requesed value");
221 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
223 const Eigen::MatrixBase<Config_t> & ,
224 const Eigen::MatrixBase<Tangent_t> & ,
225 const Eigen::MatrixBase<JacobianOut_t> &
J,
241 assert(
false &&
"Wrong Op requesed value");
246 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
248 const Eigen::MatrixBase<Config_t> & ,
249 const Eigen::MatrixBase<Tangent_t> & ,
250 const Eigen::MatrixBase<JacobianIn_t> & Jin,
251 const Eigen::MatrixBase<JacobianOut_t> & Jout)
256 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
258 const Eigen::MatrixBase<Config_t> & ,
259 const Eigen::MatrixBase<Tangent_t> & ,
260 const Eigen::MatrixBase<JacobianIn_t> & Jin,
261 const Eigen::MatrixBase<JacobianOut_t> & Jout)
266 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
268 const Eigen::MatrixBase<Config_t> & ,
269 const Eigen::MatrixBase<Tangent_t> & ,
270 const Eigen::MatrixBase<Jacobian_t> & )
274 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
276 const Eigen::MatrixBase<Config_t> & ,
277 const Eigen::MatrixBase<Tangent_t> & ,
278 const Eigen::MatrixBase<Jacobian_t> & )
282 template<
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
284 const Eigen::MatrixBase<ConfigL_t> &
q0,
285 const Eigen::MatrixBase<ConfigR_t> &
q1,
287 const Eigen::MatrixBase<ConfigOut_t> &
qout)
292 check_expression_if_real<Scalar>(abs(
q0.norm() - 1) < 1e-8)
293 &&
"initial configuration not normalized");
295 check_expression_if_real<Scalar>(abs(
q1.norm() - 1) < 1e-8)
296 &&
"final configuration not normalized");
299 const Scalar theta = atan2(sinTheta, cosTheta);
300 assert(check_expression_if_real<Scalar>(fabs(sin(theta) - sinTheta) < 1e-8));
302 static const Scalar PI_value = PI<Scalar>();
303 static const Scalar PI_value_lower = PI_value -
static_cast<Scalar>(1e-6);
304 using namespace internal;
307 const Scalar abs_theta = fabs(theta);
309 LT, abs_theta,
static_cast<Scalar>(1e-6),
312 LT, abs_theta, PI_value_lower,
314 (sin((
Scalar(1) -
u) * theta) / sinTheta) *
q0[0]
315 + (sin(
u * theta) / sinTheta) *
q1[0]),
320 LT, abs_theta,
static_cast<Scalar>(1e-6),
323 LT, abs_theta, PI_value_lower,
325 (sin((
Scalar(1) -
u) * theta) / sinTheta) *
q0[1]
326 + (sin(
u * theta) / sinTheta) *
q1[1]),
331 template<
class Config_t>
337 template<
class Config_t>
342 return abs(norm -
Scalar(1.0)) < prec;
345 template<
class Config_t>
350 static const Scalar PI_value = PI<Scalar>();
352 SINCOS(angle, &out(1), &out(0));
355 template<
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
357 const Eigen::MatrixBase<ConfigL_t> &,
358 const Eigen::MatrixBase<ConfigR_t> &,
359 const Eigen::MatrixBase<ConfigOut_t> &
qout)
365 template<
typename _Scalar,
int _Options>
367 :
public LieGroupBase<SpecialOrthogonalOperationTpl<3, _Scalar, _Options>>
402 return std::string(
"SO(3)");
405 template<
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
407 const Eigen::MatrixBase<ConfigL_t> &
q0,
408 const Eigen::MatrixBase<ConfigR_t> &
q1,
409 const Eigen::MatrixBase<Tangent_t> &
d)
422 template<ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianOut_t>
424 const Eigen::MatrixBase<ConfigL_t> &
q0,
425 const Eigen::MatrixBase<ConfigR_t> &
q1,
426 const Eigen::MatrixBase<JacobianOut_t> &
J)
439 const Matrix3
R =
q.matrix();
448 else if (arg ==
ARG1)
470 template<
class ConfigIn_t,
class Velocity_t,
class ConfigOut_t>
472 const Eigen::MatrixBase<ConfigIn_t> &
q,
473 const Eigen::MatrixBase<Velocity_t> &
v,
474 const Eigen::MatrixBase<ConfigOut_t> &
qout)
483 quat_map =
quat * pOmega;
489 template<
class Config_t,
class Jacobian_t>
491 const Eigen::MatrixBase<Config_t> &
q,
const Eigen::MatrixBase<Jacobian_t> &
J)
493 assert(
J.rows() ==
nq() &&
J.cols() ==
nv() &&
"J is not of the right dimension");
505 Eigen::Matrix<Scalar, NQ, NV, JacobianPlainType::Options | Eigen::RowMajor>
517 if (quat_map.coeffs()[3] >= 0.)
527 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
529 const Eigen::MatrixBase<Config_t> & ,
530 const Eigen::MatrixBase<Tangent_t> &
v,
531 const Eigen::MatrixBase<JacobianOut_t> &
J,
547 assert(
false &&
"Wrong Op requesed value");
552 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
554 const Eigen::MatrixBase<Config_t> & ,
555 const Eigen::MatrixBase<Tangent_t> &
v,
556 const Eigen::MatrixBase<JacobianOut_t> &
J,
562 Jexp3<SETTO>(
v,
J.derived());
565 Jexp3<ADDTO>(
v,
J.derived());
568 Jexp3<RMTO>(
v,
J.derived());
571 assert(
false &&
"Wrong Op requesed value");
576 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
578 const Eigen::MatrixBase<Config_t> & ,
579 const Eigen::MatrixBase<Tangent_t> &
v,
580 const Eigen::MatrixBase<JacobianIn_t> & Jin,
581 const Eigen::MatrixBase<JacobianOut_t> & J_out)
585 const Matrix3 Jtmp3 =
exp3(-
v);
586 Jout.noalias() = Jtmp3 * Jin;
589 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
591 const Eigen::MatrixBase<Config_t> & ,
592 const Eigen::MatrixBase<Tangent_t> &
v,
593 const Eigen::MatrixBase<JacobianIn_t> & Jin,
594 const Eigen::MatrixBase<JacobianOut_t> & J_out)
601 Jexp3<SETTO>(
v, Jtmp3);
603 Jout.noalias() = Jtmp3 * Jin;
606 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
608 const Eigen::MatrixBase<Config_t> & ,
609 const Eigen::MatrixBase<Tangent_t> &
v,
610 const Eigen::MatrixBase<Jacobian_t> & J_out)
614 const Matrix3 Jtmp3 =
exp3(-
v);
618 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
620 const Eigen::MatrixBase<Config_t> & ,
621 const Eigen::MatrixBase<Tangent_t> &
v,
622 const Eigen::MatrixBase<Jacobian_t> & J_out)
629 Jexp3<SETTO>(
v, Jtmp3);
634 template<
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
636 const Eigen::MatrixBase<ConfigL_t> &
q0,
637 const Eigen::MatrixBase<ConfigR_t> &
q1,
639 const Eigen::MatrixBase<ConfigOut_t> &
qout)
651 difference_impl(
q0,
q1,
w);
657 template<
class ConfigL_t,
class ConfigR_t>
659 const Eigen::MatrixBase<ConfigL_t> &
q0,
const Eigen::MatrixBase<ConfigR_t> &
q1)
664 difference_impl(
q0,
q1,
t);
666 return t.squaredNorm();
669 template<
class Config_t>
675 template<
class Config_t>
680 return abs(norm -
Scalar(1.0)) < prec;
683 template<
class Config_t>
693 template<
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
695 const Eigen::MatrixBase<ConfigL_t> &,
696 const Eigen::MatrixBase<ConfigR_t> &,
697 const Eigen::MatrixBase<ConfigOut_t> &
qout)
702 template<
class ConfigL_t,
class ConfigR_t>
704 const Eigen::MatrixBase<ConfigL_t> &
q0,
705 const Eigen::MatrixBase<ConfigR_t> &
q1,
721 #endif // ifndef __pinocchio_multibody_liegroup_special_orthogonal_operation_hpp__
static void dDifference_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< JacobianOut_t > &J)
static void integrate_impl(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Velocity_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout)
traits< SE3Tpl >::Vector3 Vector3
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > const Eigen::MatrixBase< ConfigVectorIn2 > const Scalar & u
void uniformRandom(Eigen::QuaternionBase< Derived > &q)
Uniformly random quaternion sphere.
Eigen::Matrix< Scalar, NV, 1, Options > TangentVector_t
static void normalize_impl(const Eigen::MatrixBase< Config_t > &qout)
static void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< Jacobian_t > &)
int nv(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNvVisitor to get the dimension of the joint tangent space.
#define PINOCCHIO_EIGEN_CONST_CAST(TYPE, OBJ)
Macro for an automatic const_cast.
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space.
static void integrateCoeffWiseJacobian_impl(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Jacobian_t > &J)
bool isNormalized(const Eigen::QuaternionBase< Quaternion > &quat, const typename Quaternion::Coefficients::RealScalar &prec=Eigen::NumTraits< typename Quaternion::Coefficients::RealScalar >::dummy_precision())
Check whether the input quaternion is Normalized within the given precision.
static void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &J_out)
static std::string name()
static ConfigVector_t neutral()
static void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &J_out)
static void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< Jacobian_t > &)
SE3Tpl< Scalar, Options > SE3
#define PINOCCHIO_COMPILER_DIAGNOSTIC_POP
Eigen::Matrix< typename Vector3Like::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options > exp3(const Eigen::MatrixBase< Vector3Like > &v)
Exp: so3 -> SO3.
static void integrate_impl(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Velocity_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout)
static void dDifference_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< JacobianOut_t > &J)
#define PINOCCHIO_LIE_GROUP_TPL_PUBLIC_INTERFACE(Derived)
static void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &Jout)
static void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< Jacobian_t > &J_out)
static void random_impl(const Eigen::MatrixBase< Config_t > &qout)
static void dIntegrate_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
static void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &Jout)
if_then_else_impl< LhsType, RhsType, ThenType, ElseType >::ReturnType if_then_else(const ComparisonOperators op, const LhsType &lhs_value, const RhsType &rhs_value, const ThenType &then_value, const ElseType &else_value)
void SINCOS(const S1 &a, S2 *sa, S3 *ca)
Computes sin/cos values of a given input scalar.
static void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< Jacobian_t > &J_out)
#define PINOCCHIO_COMPILER_DIAGNOSTIC_IGNORED_MAYBE_UNINITIALIZED
Eigen::NumTraits< Scalar >::Real RealScalar
static bool isNormalized_impl(const Eigen::MatrixBase< Config_t > &qin, const Scalar &prec)
void Jlog3(const Scalar &theta, const Eigen::MatrixBase< Vector3Like > &log, const Eigen::MatrixBase< Matrix3Like > &Jlog)
Derivative of log3.
traits< SE3Tpl >::Matrix3 Matrix3
bool isNormalized(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ConfigVectorType > &q, const Scalar &prec=Eigen::NumTraits< Scalar >::dummy_precision())
Check whether a configuration vector is normalized within the given precision provided by prec.
Eigen::Quaternion< Scalar > Quaternion_t
static void randomConfiguration_impl(const Eigen::MatrixBase< ConfigL_t > &, const Eigen::MatrixBase< ConfigR_t > &, const Eigen::MatrixBase< ConfigOut_t > &qout)
traits< LieGroupDerived >::Scalar Scalar
void exp3(const Eigen::MatrixBase< Vector3Like > &v, Eigen::QuaternionBase< QuaternionLike > &quat_out)
Exp: so3 -> SO3 (quaternion)
Eigen::Matrix< typename QuaternionLike::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(typename QuaternionLike::Vector3)::Options > log3(const Eigen::QuaternionBase< QuaternionLike > &quat, typename QuaternionLike::Scalar &theta)
Same as log3 but with a unit quaternion as input.
static bool isSameConfiguration_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &prec)
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > & q0
static Scalar squaredDistance_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1)
static std::string name()
#define PINOCCHIO_COMPILER_DIAGNOSTIC_PUSH
macros for pragma push/pop/ignore deprecated warnings
static void random_impl(const Eigen::MatrixBase< Config_t > &qout)
Eigen::Matrix< Scalar, 3, 1, Options > Vector3
static void difference_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< Tangent_t > &d)
Eigen::Matrix< Scalar, 2, 2 > Matrix2
Eigen::Map< Quaternion_t > QuaternionMap_t
static Index nv()
Get dimension of Lie Group tangent space.
static void randomConfiguration_impl(const Eigen::MatrixBase< ConfigL_t > &, const Eigen::MatrixBase< ConfigR_t > &, const Eigen::MatrixBase< ConfigOut_t > &qout)
bool defineSameRotation(const Eigen::QuaternionBase< D1 > &q1, const Eigen::QuaternionBase< D2 > &q2, const typename D1::RealScalar &prec=Eigen::NumTraits< typename D1::Scalar >::dummy_precision())
Check if two quaternions define the same rotations.
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > & q
Eigen::Matrix< Scalar, NV, NV, Options > JacobianMatrix_t
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
static void dIntegrate_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
static void dIntegrate_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
#define PINOCCHIO_DEFAULT_QUATERNION_NORM_TOLERANCE_VALUE
void firstOrderNormalize(const Eigen::QuaternionBase< D > &q)
static ConfigVector_t neutral()
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > const Eigen::MatrixBase< ConfigVectorIn2 > & q1
static void dIntegrate_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
Common traits structure to fully define base classes for CRTP.
static Index nv()
Get dimension of Lie Group tangent space.
static void interpolate_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &u, const Eigen::MatrixBase< ConfigOut_t > &qout)
PINOCCHIO_EIGEN_PLAIN_TYPE(ConfigVectorType) integrate(const ModelTpl< Scalar
Integrate a configuration vector for the specified model for a tangent vector during one unit time.
static void normalize_impl(const Eigen::MatrixBase< Config_t > &qout)
static bool isNormalized_impl(const Eigen::MatrixBase< Config_t > &qin, const Scalar &prec)
static void difference_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< Tangent_t > &d)
void Jexp3CoeffWise(const Eigen::MatrixBase< Vector3Like > &v, const Eigen::MatrixBase< Matrix43Like > &Jexp)
Derivative of where is a small perturbation of at identity.
Eigen::Map< const Quaternion_t > ConstQuaternionMap_t
Eigen::Matrix< Scalar, NQ, 1, Options > ConfigVector_t
static void interpolate_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &u, const Eigen::MatrixBase< ConfigOut_t > &qout)
static Matrix2Like::Scalar log(const Eigen::MatrixBase< Matrix2Like > &R)
Eigen::NumTraits< Scalar >::Real RealScalar
static Matrix2Like::Scalar Jlog(const Eigen::MatrixBase< Matrix2Like > &)
void normalize(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ConfigVectorType > &qout)
Normalize a configuration vector.
Main pinocchio namespace.
static void integrateCoeffWiseJacobian_impl(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Jacobian_t > &J)
pinocchio
Author(s):
autogenerated on Fri Nov 1 2024 02:41:48