30 Eigen::JacobiSVD<Eigen::MatrixXd> svd(jacobian, Eigen::ComputeThinU | Eigen::ComputeThinV);
32 Eigen::VectorXd singularValues = svd.singularValues();
33 Eigen::VectorXd singularValuesInv = Eigen::VectorXd::Zero(singularValues.rows());
36 for (uint32_t i = 0; i < singularValues.rows(); ++i)
38 double denominator = singularValues(i) * singularValues(i);
40 singularValuesInv(i) = (singularValues(i) < eps_truncation) ? 0.0 : singularValues(i) / denominator;
42 Eigen::MatrixXd
result = svd.matrixV() * singularValuesInv.asDiagonal() * svd.matrixU().transpose();
53 const Eigen::MatrixXd& jacobian)
const 55 Eigen::JacobiSVD<Eigen::MatrixXd> svd(jacobian, Eigen::ComputeThinU | Eigen::ComputeThinV);
57 Eigen::VectorXd singularValues = svd.singularValues();
58 Eigen::VectorXd singularValuesInv = Eigen::VectorXd::Zero(singularValues.rows());
59 Eigen::MatrixXd lambda = db->getDampingFactor(singularValues, jacobian);
65 for (uint32_t i = 0; i < singularValues.rows()-1; ++i)
68 singularValuesInv(i) = singularValues(i) / (
pow(singularValues(i), 2) +
pow(params.
beta, 2));
71 uint32_t m = singularValues.rows()-1;
72 singularValuesInv(m) = singularValues(m) / (
pow(singularValues(m), 2) +
pow(params.
beta, 2) + lambda(m, m));
77 for (uint32_t i = 0; i < singularValues.rows(); ++i)
79 double denominator = (singularValues(i) * singularValues(i) + lambda(i, i) );
81 singularValuesInv(i) = (singularValues(i) < eps_truncation) ? 0.0 : singularValues(i) / denominator;
92 Eigen::MatrixXd
result = svd.matrixV() * singularValuesInv.asDiagonal() * svd.matrixU().transpose();
103 Eigen::MatrixXd jac_t = jacobian.transpose();
104 uint32_t rows = jacobian.rows();
105 uint32_t cols = jacobian.cols();
109 result = jac_t * (jacobian * jac_t).inverse();
113 result = (jac_t * jacobian).inverse() * jac_t;
124 const Eigen::MatrixXd& jacobian)
const 127 Eigen::MatrixXd jac_t = jacobian.transpose();
128 uint32_t rows = jacobian.rows();
129 uint32_t cols = jacobian.cols();
132 ROS_ERROR(
"PInvDirect does not support SVD. Use PInvBySVD class instead!");
135 Eigen::MatrixXd lambda = db->getDampingFactor(Eigen::VectorXd::Zero(1, 1), jacobian);
138 Eigen::MatrixXd ident = Eigen::MatrixXd::Identity(rows, rows);
139 Eigen::MatrixXd temp = jacobian * jac_t + lambda * ident;
140 result = jac_t * temp.inverse();
144 Eigen::MatrixXd ident = Eigen::MatrixXd::Identity(cols, cols);
145 Eigen::MatrixXd temp = jac_t * jacobian + lambda * ident;
146 result = temp.inverse() * jac_t;
DampingMethodTypes damping_method
virtual Eigen::MatrixXd calculate(const Eigen::MatrixXd &jacobian) const
virtual Eigen::MatrixXd calculate(const Eigen::MatrixXd &jacobian) const
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)