Orocos KDL
KDL::ChainIkSolverPos_LMA Class Reference

Solver for the inverse position kinematics that uses Levenberg-Marquardt. More...

#include <chainiksolverpos_lma.hpp>

Inheritance diagram for KDL::ChainIkSolverPos_LMA:
KDL::ChainIkSolverPos KDL::SolverI

Public Member Functions

 ChainIkSolverPos_LMA (const KDL::Chain &_chain, const Eigen::Matrix< double, 6, 1 > &_l, double _eps=1E-5, int _maxiter=500, double _eps_joints=1E-15)
 constructs an ChainIkSolverPos_LMA solver.
 ChainIkSolverPos_LMA (const KDL::Chain &_chain, double _eps=1E-5, int _maxiter=500, double _eps_joints=1E-15)
 identical the full constructor for ChainIkSolverPos_LMA, but provides for a default weight matrix.
virtual int CartToJnt (const KDL::JntArray &q_init, const KDL::Frame &T_base_goal, KDL::JntArray &q_out)
 computes the inverse position kinematics.
virtual ~ChainIkSolverPos_LMA ()
 destructor.
void compute_fwdpos (const VectorXq &q)
 for internal use only.
void compute_jacobian (const VectorXq &q)
 for internal use only. Only exposed for test and diagnostic purposes. compute_fwdpos(q) should always have been called before.
void display_jac (const KDL::JntArray &jval)
 for internal use only. Only exposed for test and diagnostic purposes.
void updateInternalDataStructures ()
virtual const char * strError (const int error) const
Public Member Functions inherited from KDL::ChainIkSolverPos
virtual ~ChainIkSolverPos ()
Public Member Functions inherited from KDL::SolverI
 SolverI ()
 Initialize latest error to E_NOERROR.
virtual ~SolverI ()
virtual int getError () const
 Return the latest error.

Public Attributes

int lastNrOfIter
 contains the last number of iterations for an execution of CartToJnt.
double lastDifference
 contains the last value for \( E \) after an execution of CartToJnt.
double lastTransDiff
 contains the last value for the (unweighted) translational difference after an execution of CartToJnt.
double lastRotDiff
 contains the last value for the (unweighted) rotational difference after an execution of CartToJnt.
VectorXq lastSV
 contains the last values for the singular values of the weighted Jacobian after an execution of CartToJnt.
MatrixXq jac
 for internal use only.
VectorXq grad
 for internal use only.
KDL::Frame T_base_head
 for internal use only.
bool display_information
 display information on each iteration step to the console.

Static Public Attributes

static const int E_GRADIENT_JOINTS_TOO_SMALL = -100
static const int E_INCREMENT_JOINTS_TOO_SMALL = -101

Additional Inherited Members

Public Types inherited from KDL::SolverI
enum  {
  E_DEGRADED = +1 , E_NOERROR = 0 , E_NO_CONVERGE = -1 , E_UNDEFINED = -2 ,
  E_NOT_UP_TO_DATE = -3 , E_SIZE_MISMATCH = -4 , E_MAX_ITERATIONS_EXCEEDED = -5 , E_OUT_OF_RANGE = -6 ,
  E_NOT_IMPLEMENTED = -7 , E_SVD_FAILED = -8
}
Protected Attributes inherited from KDL::SolverI
int error
 Latest error, initialized to E_NOERROR in constructor.

Detailed Description

Solver for the inverse position kinematics that uses Levenberg-Marquardt.

The robustness and speed of this solver is improved in several ways:

  • by using a Levenberg-Marquardt method that automatically adapts the damping when computing the inverse damped least squares inverse velocity kinematics.
  • by using an internal implementation of forward position kinematics and the Jacobian kinematics. This implementation is more numerically robust, is able to cache previous computations, and implements an \( \mathcal{O}(N) \) algorithm for the computation of the Jacobian (with \(N\), the number of joints, and for a fixed size task space).
  • by providing a way to specify the weights in task space, you can weigh rotations wrt translations. This is important e.g. to specify that rotations do not matter for the problem at hand, or to specify how important you judge rotations w.r.t. translations, typically in S.I.-units, ([m],[rad]), the rotations are over-specified, this can be avoided using the weight matrix. Weights also make the solver more robust .
  • only the constructors call memory allocation.

De general principles behind the optimisation is inspired on: Jorge Nocedal, Stephen J. Wright, Numerical Optimization,Springer-Verlag New York, 1999.

Constructor & Destructor Documentation

◆ ChainIkSolverPos_LMA() [1/2]

KDL::ChainIkSolverPos_LMA::ChainIkSolverPos_LMA ( const KDL::Chain & _chain,
const Eigen::Matrix< double, 6, 1 > & _l,
double _eps = 1E-5,
int _maxiter = 500,
double _eps_joints = 1E-15 )

constructs an ChainIkSolverPos_LMA solver.

The default parameters are chosen to be applicable to industrial-size robots (e.g. 0.5 to 3 meters range in task space), with an accuracy that is more then sufficient for typical industrial applications.

Weights are applied in task space, i.e. the kinematic solver minimizes: \( E = \Delta \mathbf{x}^T \mathbf{L} \mathbf{L}^T \Delta \mathbf{x} \), with \(\mathbf{L}\) a diagonal matrix.

Parameters
_chainspecifies the kinematic chain.
_lspecifies the "square root" of the weight (diagonal) matrix in task space. This diagonal matrix is specified as a vector.
_epsspecifies the desired accuracy in task space; after weighing with the weight matrix, it is applied on \(E\).
_maxiterspecifies the maximum number of iterations.
_eps_jointsspecifies that the algorithm has to stop when the computed joint angle increments are smaller then _eps_joints. This is to avoid unnecessary computations up to _maxiter when the joint angle increments are so small that they effectively (in floating point) do not change the joint angles any more. The default is a few digits above numerical accuracy.

◆ ChainIkSolverPos_LMA() [2/2]

KDL::ChainIkSolverPos_LMA::ChainIkSolverPos_LMA ( const KDL::Chain & _chain,
double _eps = 1E-5,
int _maxiter = 500,
double _eps_joints = 1E-15 )

identical the full constructor for ChainIkSolverPos_LMA, but provides for a default weight matrix.

\(\mathbf{L} = \mathrm{diag}\left( \begin{bmatrix} 1 & 1 & 1 & 0.01 & 0.01 & 0.01 \end{bmatrix} \right) \).

◆ ~ChainIkSolverPos_LMA()

virtual KDL::ChainIkSolverPos_LMA::~ChainIkSolverPos_LMA ( )
virtual

destructor.

Member Function Documentation

◆ CartToJnt()

virtual int KDL::ChainIkSolverPos_LMA::CartToJnt ( const KDL::JntArray & q_init,
const KDL::Frame & T_base_goal,
KDL::JntArray & q_out )
virtual

computes the inverse position kinematics.

Parameters
q_initinitial joint position.
T_base_goalgoal position expressed with respect to the robot base.
q_outjoint position that achieves the specified goal position (if successful).
Returns
E_NOERROR if successful, E_GRADIENT_JOINTS_TOO_SMALL the gradient of \( E \) towards the joints is to small, E_INCREMENT_JOINTS_TOO_SMALL if joint position increments are to small, E_MAX_ITER_EXCEEDED if number of iterations is exceeded.

Implements KDL::ChainIkSolverPos.

◆ compute_fwdpos()

void KDL::ChainIkSolverPos_LMA::compute_fwdpos ( const VectorXq & q)

for internal use only.

Only exposed for test and diagnostic purposes.

◆ compute_jacobian()

void KDL::ChainIkSolverPos_LMA::compute_jacobian ( const VectorXq & q)

for internal use only. Only exposed for test and diagnostic purposes. compute_fwdpos(q) should always have been called before.

◆ display_jac()

void KDL::ChainIkSolverPos_LMA::display_jac ( const KDL::JntArray & jval)

for internal use only. Only exposed for test and diagnostic purposes.

◆ strError()

virtual const char * KDL::ChainIkSolverPos_LMA::strError ( const int error) const
virtual

Return a description of the latest error

Returns
if error is known then a description of error, otherwise "UNKNOWN ERROR"

Reimplemented from KDL::SolverI.

◆ updateInternalDataStructures()

void KDL::ChainIkSolverPos_LMA::updateInternalDataStructures ( )
virtual

Update the internal data structures. This is required if the number of segments or number of joints of a chain/tree have changed. This provides a single point of contact for solver memory allocations.

Implements KDL::ChainIkSolverPos.

Member Data Documentation

◆ display_information

bool KDL::ChainIkSolverPos_LMA::display_information

display information on each iteration step to the console.

◆ E_GRADIENT_JOINTS_TOO_SMALL

const int KDL::ChainIkSolverPos_LMA::E_GRADIENT_JOINTS_TOO_SMALL = -100
static

◆ E_INCREMENT_JOINTS_TOO_SMALL

const int KDL::ChainIkSolverPos_LMA::E_INCREMENT_JOINTS_TOO_SMALL = -101
static

◆ grad

VectorXq KDL::ChainIkSolverPos_LMA::grad

for internal use only.

contains the gradient of the error criterion after an execution of CartToJnt.

◆ jac

MatrixXq KDL::ChainIkSolverPos_LMA::jac

for internal use only.

contains the last value for the Jacobian after an execution of compute_jacobian.

◆ lastDifference

double KDL::ChainIkSolverPos_LMA::lastDifference

contains the last value for \( E \) after an execution of CartToJnt.

◆ lastNrOfIter

int KDL::ChainIkSolverPos_LMA::lastNrOfIter

contains the last number of iterations for an execution of CartToJnt.

◆ lastRotDiff

double KDL::ChainIkSolverPos_LMA::lastRotDiff

contains the last value for the (unweighted) rotational difference after an execution of CartToJnt.

◆ lastSV

VectorXq KDL::ChainIkSolverPos_LMA::lastSV

contains the last values for the singular values of the weighted Jacobian after an execution of CartToJnt.

◆ lastTransDiff

double KDL::ChainIkSolverPos_LMA::lastTransDiff

contains the last value for the (unweighted) translational difference after an execution of CartToJnt.

◆ T_base_head

KDL::Frame KDL::ChainIkSolverPos_LMA::T_base_head

for internal use only.

contains the last value for the position of the tip of the robot (head) with respect to the base, after an execution of compute_jacobian.


The documentation for this class was generated from the following file: