| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | #include "chainiksolvervel_wdls.hpp" |
| | #include "utilities/svd_eigen_HH.hpp" |
| |
|
| | namespace KDL |
| | { |
| | |
| | ChainIkSolverVel_wdls::ChainIkSolverVel_wdls(const Chain& _chain,double _eps,int _maxiter): |
| | chain(_chain), |
| | jnt2jac(chain), |
| | jac(chain.getNrOfJoints()), |
| | U(MatrixXd::Zero(6,chain.getNrOfJoints())), |
| | S(VectorXd::Zero(chain.getNrOfJoints())), |
| | V(MatrixXd::Zero(chain.getNrOfJoints(),chain.getNrOfJoints())), |
| | eps(_eps), |
| | maxiter(_maxiter), |
| | tmp(VectorXd::Zero(chain.getNrOfJoints())), |
| | tmp_jac(MatrixXd::Zero(6,chain.getNrOfJoints())), |
| | tmp_jac_weight1(MatrixXd::Zero(6,chain.getNrOfJoints())), |
| | tmp_jac_weight2(MatrixXd::Zero(6,chain.getNrOfJoints())), |
| | tmp_ts(MatrixXd::Zero(6,6)), |
| | tmp_js(MatrixXd::Zero(chain.getNrOfJoints(),chain.getNrOfJoints())), |
| | weight_ts(MatrixXd::Identity(6,6)), |
| | weight_js(MatrixXd::Identity(chain.getNrOfJoints(),chain.getNrOfJoints())), |
| | lambda(0.0), |
| | lambda_scaled(0.0), |
| | nrZeroSigmas(0), |
| | svdResult(0), |
| | sigmaMin(0) |
| | { |
| | } |
| | |
| | ChainIkSolverVel_wdls::~ChainIkSolverVel_wdls() |
| | { |
| | } |
| | |
| | void ChainIkSolverVel_wdls::setWeightJS(const Eigen::MatrixXd& Mq){ |
| | weight_js = Mq; |
| | } |
| | |
| | void ChainIkSolverVel_wdls::setWeightTS(const Eigen::MatrixXd& Mx){ |
| | weight_ts = Mx; |
| | } |
| |
|
| | void ChainIkSolverVel_wdls::setLambda(const double lambda_in) |
| | { |
| | lambda=lambda_in; |
| | } |
| |
|
| | void ChainIkSolverVel_wdls::setEps(const double eps_in) |
| | { |
| | eps=eps_in; |
| | } |
| |
|
| | void ChainIkSolverVel_wdls::setMaxIter(const int maxiter_in) |
| | { |
| | maxiter=maxiter_in; |
| | } |
| |
|
| | int ChainIkSolverVel_wdls::CartToJnt(const JntArray& q_in, const Twist& v_in, JntArray& qdot_out) |
| | { |
| | jnt2jac.JntToJac(q_in,jac); |
| | |
| | double sum; |
| | unsigned int i,j; |
| | |
| | |
| | nrZeroSigmas = 0 ; |
| | sigmaMin = 0.; |
| | lambda_scaled = 0.; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | tmp_jac_weight1 = jac.data.lazyProduct(weight_js); |
| | tmp_jac_weight2 = weight_ts.lazyProduct(tmp_jac_weight1); |
| | |
| | |
| | svdResult = svd_eigen_HH(tmp_jac_weight2,U,S,V,tmp,maxiter); |
| | if (0 != svdResult) |
| | { |
| | qdot_out.data.setZero() ; |
| | return (error = E_SVD_FAILED); |
| | } |
| |
|
| | |
| | tmp_ts = weight_ts.lazyProduct(U.topLeftCorner(6,6)); |
| | tmp_js = weight_js.lazyProduct(V); |
| |
|
| | |
| | if ( jac.columns() >= 6 ) { |
| | sigmaMin = S(5); |
| | } |
| | else { |
| | sigmaMin = 0.; |
| | } |
| |
|
| | |
| | for (i=0;i<jac.columns();i++) { |
| | sum = 0.0; |
| | for (j=0;j<jac.rows();j++) { |
| | if(i<6) |
| | sum+= tmp_ts(j,i)*v_in(j); |
| | else |
| | sum+=0.0; |
| | } |
| | |
| | |
| | |
| | if ( sigmaMin < eps ) |
| | { |
| | lambda_scaled = sqrt(1.0-(sigmaMin/eps)*(sigmaMin/eps))*lambda ; |
| | } |
| | if(fabs(S(i))<eps) { |
| | if (i<6) { |
| | |
| | tmp(i) = sum*((S(i)/(S(i)*S(i)+lambda_scaled*lambda_scaled))); |
| | } |
| | else { |
| | tmp(i)=0.0; |
| | } |
| | |
| | ++nrZeroSigmas ; |
| | } |
| | else { |
| | tmp(i) = sum/S(i); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | qdot_out.data=tmp_js.lazyProduct(tmp); |
| |
|
| | |
| | |
| | if ( nrZeroSigmas > (jac.columns()-jac.rows()) ) { |
| | return (error = E_CONVERGE_PINV_SINGULAR); |
| | } else { |
| | return (error = E_NOERROR); |
| | } |
| | } |
| |
|
| | const char* ChainIkSolverVel_wdls::strError(const int error) const |
| | { |
| | if (E_SVD_FAILED == error) |
| | return "SVD failed"; |
| | else return SolverI::strError(error); |
| | } |
| |
|
| | } |
| |
|