00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "chainiksolvervel_pinv_nso.hpp"
00023
00024 namespace KDL
00025 {
00026 ChainIkSolverVel_pinv_nso::ChainIkSolverVel_pinv_nso(const Chain& _chain, JntArray _opt_pos, JntArray _weights, double _eps, int _maxiter, double _alpha):
00027 chain(_chain),
00028 jnt2jac(chain),
00029 jac(chain.getNrOfJoints()),
00030 svd(jac),
00031 U(6,JntArray(chain.getNrOfJoints())),
00032 S(chain.getNrOfJoints()),
00033 V(chain.getNrOfJoints(),JntArray(chain.getNrOfJoints())),
00034 tmp(chain.getNrOfJoints()),
00035 tmp2(chain.getNrOfJoints()-6),
00036 eps(_eps),
00037 maxiter(_maxiter),
00038 alpha(_alpha),
00039 weights(_weights),
00040 opt_pos(_opt_pos)
00041 {
00042 }
00043
00044 ChainIkSolverVel_pinv_nso::ChainIkSolverVel_pinv_nso(const Chain& _chain, double _eps, int _maxiter, double _alpha):
00045 chain(_chain),
00046 jnt2jac(chain),
00047 jac(chain.getNrOfJoints()),
00048 svd(jac),
00049 U(6,JntArray(chain.getNrOfJoints())),
00050 S(chain.getNrOfJoints()),
00051 V(chain.getNrOfJoints(),JntArray(chain.getNrOfJoints())),
00052 tmp(chain.getNrOfJoints()),
00053 tmp2(chain.getNrOfJoints()-6),
00054 eps(_eps),
00055 maxiter(_maxiter),
00056 alpha(_alpha)
00057 {
00058 }
00059
00060 ChainIkSolverVel_pinv_nso::~ChainIkSolverVel_pinv_nso()
00061 {
00062 }
00063
00064
00065 int ChainIkSolverVel_pinv_nso::CartToJnt(const JntArray& q_in, const Twist& v_in, JntArray& qdot_out)
00066 {
00067
00068
00069 jnt2jac.JntToJac(q_in,jac);
00070
00071
00072
00073
00074 int ret = svd.calculate(jac,U,S,V,maxiter);
00075
00076 double sum;
00077 unsigned int i,j;
00078
00079
00080
00081
00082
00083
00084 for (i=0;i<jac.columns();i++) {
00085 sum = 0.0;
00086 for (j=0;j<jac.rows();j++) {
00087 sum+= U[j](i)*v_in(j);
00088 }
00089
00090
00091 tmp(i) = sum*(fabs(S(i))<eps?0.0:1.0/S(i));
00092 }
00093
00094
00095 for (i=0;i<jac.columns();i++) {
00096 sum = 0.0;
00097 for (j=0;j<jac.columns();j++) {
00098 sum+=V[i](j)*tmp(j);
00099 }
00100
00101 qdot_out(i)=sum;
00102 }
00103
00104
00105
00106 for(i = 0; i < jac.columns(); i++)
00107 tmp(i) = weights(i)*(opt_pos(i) - q_in(i));
00108
00109
00110 for (i=jac.rows()+1;i<jac.columns();i++) {
00111 tmp2(i-(jac.rows()+1)) = 0.0;
00112 for (j=0;j<jac.columns();j++) {
00113 tmp2(i-(jac.rows()+1)) +=V[j](i)*tmp(j);
00114 }
00115 }
00116
00117 for (i=0;i<jac.columns();i++) {
00118 sum = 0.0;
00119 for (j=jac.rows()+1;j<jac.columns();j++) {
00120 sum +=V[i](j)*tmp2(j);
00121 }
00122 qdot_out(i) += alpha*sum;
00123 }
00124
00125
00126 return ret;
00127 }
00128
00129 int ChainIkSolverVel_pinv_nso::setWeights(const JntArray & _weights)
00130 {
00131 weights = _weights;
00132 return 0;
00133 }
00134 int ChainIkSolverVel_pinv_nso::setOptPos(const JntArray & _opt_pos)
00135 {
00136 opt_pos = _opt_pos;
00137 return 0;
00138 }
00139 int ChainIkSolverVel_pinv_nso::setAlpha(const double _alpha)
00140 {
00141 alpha = _alpha;
00142 return 0;
00143 }
00144
00145
00146 }