// SPDX-License-Identifier: LGPL-2.1-or-later // Copyright (C) 2009 Ruben Smits // Version: 1.0 // Author: Ruben Smits // Maintainer: Ruben Smits // URL: http://www.orocos.org/kdl // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "chainidsolver_recursive_newton_euler.hpp" #include "frames_io.hpp" namespace KDL{ ChainIdSolver_RNE::ChainIdSolver_RNE(const Chain& chain_,Vector grav): chain(chain_),nj(chain.getNrOfJoints()),ns(chain.getNrOfSegments()), X(ns),S(ns),v(ns),a(ns),f(ns) { ag=-Twist(grav,Vector::Zero()); } int ChainIdSolver_RNE::CartToJnt(const JntArray &q, const JntArray &q_dot, const JntArray &q_dotdot, const Wrenches& f_ext,JntArray &torques) { //Check sizes when in debug mode if(q.rows()!=nj || q_dot.rows()!=nj || q_dotdot.rows()!=nj || torques.rows()!=nj || f_ext.size()!=ns) return (error = -1); unsigned int j=0; //Sweep from root to leaf for(unsigned int i=0;i=0;i--){ if(chain.getSegment(i).getJoint().getType()!=Joint::None) torques(j--)=dot(S[i],f[i]); if(i!=0) f[i-1]=f[i-1]+X[i]*f[i]; } return (error = E_NOERROR); } }//namespace