orocos_kdl
treeiksolverpos_nr_jl.cpp
Go to the documentation of this file.
1 // Copyright (C) 2007-2008 Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
2 // Copyright (C) 2008 Mikael Mayer
3 // Copyright (C) 2008 Julia Jesse
4 
5 // Version: 1.0
6 // Author: Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
7 // Maintainer: Ruben Smits <ruben dot smits at mech dot kuleuven dot be>
8 // URL: http://www.orocos.org/kdl
9 
10 // This library is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU Lesser General Public
12 // License as published by the Free Software Foundation; either
13 // version 2.1 of the License, or (at your option) any later version.
14 
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Lesser General Public License for more details.
19 
20 // You should have received a copy of the GNU Lesser General Public
21 // License along with this library; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 
25 
26 namespace KDL {
28  const std::vector<std::string>& _endpoints,
29  const JntArray& _q_min, const JntArray& _q_max,
30  TreeFkSolverPos& _fksolver, TreeIkSolverVel& _iksolver,
31  unsigned int _maxiter, double _eps) :
32  tree(_tree), q_min(_q_min), q_max(_q_max), iksolver(_iksolver),
33  fksolver(_fksolver), delta_q(tree.getNrOfJoints()),
34  endpoints(_endpoints), maxiter(_maxiter), eps(_eps)
35  {
36  for (size_t i = 0; i < endpoints.size(); i++) {
37  frames.insert(Frames::value_type(endpoints[i], Frame::Identity()));
38  delta_twists.insert(Twists::value_type(endpoints[i], Twist::Zero()));
39  }
40  }
41 
42  double TreeIkSolverPos_NR_JL::CartToJnt(const JntArray& q_init, const Frames& p_in, JntArray& q_out) {
43  q_out = q_init;
44 
45  //First check if all elements in p_in are available:
46  for(Frames::const_iterator f_des_it=p_in.begin();f_des_it!=p_in.end();++f_des_it)
47  if(frames.find(f_des_it->first)==frames.end())
48  return -2;
49 
50  unsigned int k=0;
51  while(++k <= maxiter) {
52  for (Frames::const_iterator f_des_it=p_in.begin();f_des_it!=p_in.end();++f_des_it){
53  //Get all iterators for this endpoint
54  Frames::iterator f_it = frames.find(f_des_it->first);
55  Twists::iterator delta_twist = delta_twists.find(f_des_it->first);
56 
57  fksolver.JntToCart(q_out, f_it->second, f_it->first);
58  delta_twist->second = diff(f_it->second, f_des_it->second);
59  }
60  double res = iksolver.CartToJnt(q_out, delta_twists, delta_q);
61  if (res < eps) return res;
62 
63  Add(q_out, delta_q, q_out);
64 
65  for (unsigned int j = 0; j < q_min.rows(); j++) {
66  if (q_out(j) < q_min(j))
67  q_out( j) = q_min(j);
68  else if (q_out(j) > q_max(j))
69  q_out( j) = q_max(j);
70  }
71  }
72  if (k <= maxiter)
73  return 0;
74  else
75  return -3;
76  }
77 
78 
80 
81  }
82 
83 }//namespace
84 
KDL::Frame::Identity
static Frame Identity()
Definition: frames.inl:700
KDL::TreeIkSolverPos_NR_JL::q_max
JntArray q_max
Definition: treeiksolverpos_nr_jl.hpp:70
KDL::JntArray
Definition: jntarray.hpp:69
KDL::TreeIkSolverPos_NR_JL::delta_q
JntArray delta_q
Definition: treeiksolverpos_nr_jl.hpp:73
KDL::TreeIkSolverPos_NR_JL::delta_twists
Twists delta_twists
Definition: treeiksolverpos_nr_jl.hpp:75
KDL::TreeFkSolverPos
This abstract class encapsulates a solver for the forward position kinematics for a KDL::Tree.
Definition: treefksolver.hpp:45
KDL::TreeIkSolverPos_NR_JL::fksolver
TreeFkSolverPos & fksolver
Definition: treeiksolverpos_nr_jl.hpp:72
std::vector< std::string >
std::map::find
T find(T... args)
std::vector::size
T size(T... args)
KDL::TreeIkSolverPos_NR_JL::maxiter
unsigned int maxiter
Definition: treeiksolverpos_nr_jl.hpp:78
KDL::Add
void Add(const JntArray &src1, const JntArray &src2, JntArray &dest)
Definition: jntarray.cpp:80
treeiksolverpos_nr_jl.hpp
KDL::TreeIkSolverVel
This abstract class encapsulates the inverse velocity solver for a KDL::Tree.
Definition: treeiksolver.hpp:54
KDL
Definition: kukaLWR_DHnew.cpp:25
KDL::TreeIkSolverPos_NR_JL::frames
Frames frames
Definition: treeiksolverpos_nr_jl.hpp:74
KDL::JntArray::rows
unsigned int rows() const
Definition: jntarray.cpp:70
KDL::TreeIkSolverVel::CartToJnt
virtual double CartToJnt(const JntArray &q_in, const Twists &v_in, JntArray &qdot_out)=0
KDL::TreeFkSolverPos::JntToCart
virtual int JntToCart(const JntArray &q_in, Frame &p_out, std::string segmentName)=0
std::map< std::string, Frame >
KDL::Tree
This class encapsulates a tree kinematic interconnection structure. It is built out of segments.
Definition: tree.hpp:99
KDL::Twist::Zero
static Twist Zero()
Definition: frames.inl:290
KDL::TreeIkSolverPos_NR_JL::TreeIkSolverPos_NR_JL
TreeIkSolverPos_NR_JL(const Tree &tree, const std::vector< std::string > &endpoints, const JntArray &q_min, const JntArray &q_max, TreeFkSolverPos &fksolver, TreeIkSolverVel &iksolver, unsigned int maxiter=100, double eps=1e-6)
Definition: treeiksolverpos_nr_jl.cpp:27
KDL::TreeIkSolverPos_NR_JL::CartToJnt
virtual double CartToJnt(const JntArray &q_init, const Frames &p_in, JntArray &q_out)
Definition: treeiksolverpos_nr_jl.cpp:42
std::map::begin
T begin(T... args)
std::map::insert
T insert(T... args)
KDL::TreeIkSolverPos_NR_JL::endpoints
std::vector< std::string > endpoints
Definition: treeiksolverpos_nr_jl.hpp:76
KDL::TreeIkSolverPos_NR_JL::eps
double eps
Definition: treeiksolverpos_nr_jl.hpp:79
std::map::end
T end(T... args)
KDL::TreeIkSolverPos_NR_JL::iksolver
TreeIkSolverVel & iksolver
Definition: treeiksolverpos_nr_jl.hpp:71
KDL::diff
IMETHOD Vector diff(const Vector &p_w_a, const Vector &p_w_b, double dt=1)
KDL::TreeIkSolverPos_NR_JL::~TreeIkSolverPos_NR_JL
~TreeIkSolverPos_NR_JL()
Definition: treeiksolverpos_nr_jl.cpp:79
KDL::TreeIkSolverPos_NR_JL::q_min
JntArray q_min
Definition: treeiksolverpos_nr_jl.hpp:69