chainiksolvervel_wdls.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "chainiksolvervel_wdls.hpp"
00023 #include "utilities/svd_eigen_HH.hpp"
00024
00025 namespace KDL
00026 {
00027
00028 ChainIkSolverVel_wdls::ChainIkSolverVel_wdls(const Chain& _chain,double _eps,int _maxiter):
00029 chain(_chain),
00030 jnt2jac(chain),
00031 jac(chain.getNrOfJoints()),
00032 U(MatrixXd::Zero(6,chain.getNrOfJoints())),
00033 S(VectorXd::Zero(chain.getNrOfJoints())),
00034 V(MatrixXd::Zero(chain.getNrOfJoints(),chain.getNrOfJoints())),
00035 eps(_eps),
00036 maxiter(_maxiter),
00037 tmp(VectorXd::Zero(chain.getNrOfJoints())),
00038 tmp_jac(MatrixXd::Zero(6,chain.getNrOfJoints())),
00039 tmp_jac_weight1(MatrixXd::Zero(6,chain.getNrOfJoints())),
00040 tmp_jac_weight2(MatrixXd::Zero(6,chain.getNrOfJoints())),
00041 tmp_ts(MatrixXd::Zero(6,6)),
00042 tmp_js(MatrixXd::Zero(chain.getNrOfJoints(),chain.getNrOfJoints())),
00043 weight_ts(MatrixXd::Identity(6,6)),
00044 weight_js(MatrixXd::Identity(chain.getNrOfJoints(),chain.getNrOfJoints())),
00045 lambda(0.0)
00046 {
00047 }
00048
00049 ChainIkSolverVel_wdls::~ChainIkSolverVel_wdls()
00050 {
00051 }
00052
00053 void ChainIkSolverVel_wdls::setWeightJS(const Eigen::MatrixXd& Mq){
00054 weight_js = Mq;
00055 }
00056
00057 void ChainIkSolverVel_wdls::setWeightTS(const Eigen::MatrixXd& Mx){
00058 weight_ts = Mx;
00059 }
00060
00061 void ChainIkSolverVel_wdls::setLambda(const double& lambda_in)
00062 {
00063 lambda=lambda_in;
00064 }
00065
00066 int ChainIkSolverVel_wdls::CartToJnt(const JntArray& q_in, const Twist& v_in, JntArray& qdot_out)
00067 {
00068 jnt2jac.JntToJac(q_in,jac);
00069
00070 double sum;
00071 unsigned int i,j;
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 tmp_jac_weight1 = (jac.data*weight_js).lazy();
00082 tmp_jac_weight2 = (weight_ts*tmp_jac_weight1).lazy();
00083
00084
00085 int ret = svd_eigen_HH(tmp_jac_weight2,U,S,V,tmp,maxiter);
00086
00087
00088 tmp_ts = (weight_ts*U.corner(Eigen::TopLeft,6,6)).lazy();
00089 tmp_js = (weight_js*V).lazy();
00090
00091
00092 for (i=0;i<jac.columns();i++) {
00093 sum = 0.0;
00094 for (j=0;j<jac.rows();j++) {
00095 if(i<6)
00096 sum+= tmp_ts(j,i)*v_in(j);
00097 else
00098 sum+=0.0;
00099 }
00100 if(S(i)==0||S(i)<eps)
00101 tmp(i) = sum*((S(i)/(S(i)*S(i)+lambda*lambda)));
00102 else
00103 tmp(i) = sum/S(i);
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 qdot_out.data=(tmp_js*tmp).lazy();
00116 return ret;
00117 }
00118
00119 }