13 static Eigen::Matrix<typename MatT::Scalar, MatT::ColsAtCompileTime, MatT::RowsAtCompileTime>
pseudoinverse(
const MatT &mat,
typename MatT::Scalar tolerance =
typename MatT::Scalar{1e-4}) {
14 typedef typename MatT::Scalar Scalar;
15 auto svd = mat.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV);
16 const auto &singularValues = svd.singularValues();
17 Eigen::Matrix<Scalar, MatT::ColsAtCompileTime, MatT::RowsAtCompileTime> singularValuesInv(mat.cols(), mat.rows());
18 singularValuesInv.setZero();
19 for (
unsigned int i = 0; i < singularValues.size(); ++i) {
20 if (singularValues(i) > tolerance) {
21 singularValuesInv(i, i) = Scalar{1} / singularValues(i);
24 singularValuesInv(i, i) = Scalar{0};
27 return svd.matrixV() * singularValuesInv * svd.matrixU().adjoint();
37 static std::array<double, 16>
forward(
const Eigen::Matrix<double, 7, 1>& q);
38 static std::array<double, 16>
forwardElbow(
const Eigen::Matrix<double, 7, 1>& q);
39 static Eigen::Matrix<double, 6, 1>
forwardEuler(
const Eigen::Matrix<double, 7, 1>& q);
40 static Eigen::Matrix<double, 6, 7>
jacobian(
const Eigen::Matrix<double, 7, 1>& q);
41 static Eigen::Matrix<double, 7, 1>
inverse(
const Eigen::Matrix<double, 6, 1>& x_target,
const Eigen::Matrix<double, 7, 1>& q0, std::optional<NullSpaceHandling> null_space = std::nullopt);