27 const Eigen::MatrixBase<Vector3> & axis,
30 const Eigen::MatrixBase<Matrix3> & res)
32 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(
Vector3, 3);
33 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(
Matrix3, 3, 3);
35 assert(
isUnitary(axis) &&
"The axis is not unitary.");
38 Vector3 sin_axis = sin_value * axis;
42 tmp = cos1_axis.x() * axis.y();
43 res_.coeffRef(0, 1) = tmp - sin_axis.z();
44 res_.coeffRef(1, 0) = tmp + sin_axis.z();
46 tmp = cos1_axis.x() * axis.z();
47 res_.coeffRef(0, 2) = tmp + sin_axis.y();
48 res_.coeffRef(2, 0) = tmp - sin_axis.y();
50 tmp = cos1_axis.y() * axis.z();
51 res_.coeffRef(1, 2) = tmp - sin_axis.x();
52 res_.coeffRef(2, 1) = tmp + sin_axis.x();
54 res_.diagonal() = (cos1_axis.cwiseProduct(axis)).array() + cos_value;
82 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(
Matrix3, 3, 3);
85 typedef typename Matrix3::Scalar
Scalar;
88 Options = PINOCCHIO_EIGEN_PLAIN_TYPE(
Matrix3)::Options
90 typedef Eigen::Quaternion<Scalar, Options> Quaternion;
93 rot_ = quat.toRotationMatrix();
107 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(
Matrix3, 3, 3);
110 typedef Eigen::JacobiSVD<Matrix3> SVD;
111 const SVD svd(mat, Eigen::ComputeFullU | Eigen::ComputeFullV);
114 res.template leftCols<2>().noalias() =
115 svd.matrixU() * svd.matrixV().transpose().template leftCols<2>();
116 res.col(2).noalias() = res.col(0).cross(res.col(1));
void toRotationMatrix(const Eigen::MatrixBase< Vector3 > &axis, const Scalar &cos_value, const Scalar &sin_value, const Eigen::MatrixBase< Matrix3 > &res)
Computes a rotation matrix from a vector and values of sin and cos orientations values.
void normalize(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ConfigVectorType > &qout)
Normalize a configuration vector.
bool isUnitary(const Eigen::MatrixBase< MatrixLike > &mat, const typename MatrixLike::RealScalar &prec=Eigen::NumTraits< typename MatrixLike::Scalar >::dummy_precision())
Check whether the input matrix is Unitary within the given precision.