diff --git a/orocos_kdl/src/chainjnttojacsolver.cpp b/orocos_kdl/src/chainjnttojacsolver.cpp index c24a9a312..688528b88 100644 --- a/orocos_kdl/src/chainjnttojacsolver.cpp +++ b/orocos_kdl/src/chainjnttojacsolver.cpp @@ -97,5 +97,65 @@ namespace KDL } return (error = E_NOERROR); } + + int ChainJntToJacSolver::JntToJac(const JntArray& q_in, std::vector& jac, int seg_nr) + { + if(locked_joints_.size() != chain.getNrOfJoints()) + return (error = E_NOT_UP_TO_DATE); + unsigned int segmentNr; + if(seg_nr<0) + segmentNr=chain.getNrOfSegments(); + else + segmentNr = seg_nr; + + //Initialize Jacobian to zero since only segmentNr columns are computed + SetToZero(jac[0]); + + if( q_in.rows()!=chain.getNrOfJoints() || jac[0].columns() != chain.getNrOfJoints()) + return (error = E_SIZE_MISMATCH); + else if(segmentNr>chain.getNrOfSegments()) + return (error = E_OUT_OF_RANGE); + else if(jac.size() < segmentNr) + return (error = E_SIZE_MISMATCH); + + T_tmp = Frame::Identity(); + SetToZero(t_tmp); + int j=0; + int k=0; + Frame total; + + // Loop through segments + for (unsigned int i=0;i& jac, int seg_nr=-1); /** * diff --git a/orocos_kdl/tests/solvertest.cpp b/orocos_kdl/tests/solvertest.cpp index c42c8b696..3a88d0606 100644 --- a/orocos_kdl/tests/solvertest.cpp +++ b/orocos_kdl/tests/solvertest.cpp @@ -815,6 +815,43 @@ void SolverTest::FkPosAndIkPosLocal(Chain& chain,ChainFkSolverPos& fksolverpos, } +void SolverTest::JacAllSegments() +{ + std::cout << "KDL Jac Solver Test for returning all segment Jacobians" << std::endl; + + double eps = 1e-6; + + unsigned int nj = motomansia10.getNrOfJoints(); + unsigned int ns = motomansia10.getNrOfSegments(); + + JntArray q(nj); + Jacobian jac(nj); + std::vector jac_all(ns, Jacobian(nj)); + + ChainJntToJacSolver jacsolver(motomansia10); + + // random + q(0) = 0.2; + q(1) = 0.6; + q(2) = 1.; + q(3) = 0.5; + q(4) = -1.4; + q(5) = 0.3; + q(6) = -0.8; + + CPPUNIT_ASSERT_EQUAL((int)SolverI::E_NOERROR, jacsolver.JntToJac(q, jac_all, ns)); + for (unsigned int seg=0; seg chain_jnt_to_jac_solver(m, "ChainJntToJacSolver"); chain_jnt_to_jac_solver.def(py::init(), py::arg("chain")); - chain_jnt_to_jac_solver.def("JntToJac", &ChainJntToJacSolver::JntToJac, + chain_jnt_to_jac_solver.def("JntToJac", (int (ChainJntToJacSolver::*)(const JntArray&, Jacobian&, int)) &ChainJntToJacSolver::JntToJac, + py::arg("q_in"), py::arg("jac"), py::arg("seg_nr")=-1); + chain_jnt_to_jac_solver.def("JntToJac", (int (ChainJntToJacSolver::*)(const JntArray&, std::vector&, int)) &ChainJntToJacSolver::JntToJac, py::arg("q_in"), py::arg("jac"), py::arg("seg_nr")=-1); chain_jnt_to_jac_solver.def("setLockedJoints", &ChainJntToJacSolver::setLockedJoints, py::arg("locked_joints"));