The `inverseKinematics`

and `generalizedInverseKinematics`

classes give you access to inverse kinematics
(IK) algorithms. You can use these algorithms to generate a robot configuration that
achieves specified goals and constraints for the robot. This robot configuration is a list
of joint positions that are within the position limits of the robot model and do not violate
any constraints the robot has.

MATLAB^{®} supports two algorithms for achieving an IK solution:
the BFGS projection algorithm and the Levenberg-Marquardt algorithm.
Both algorithms are iterative, gradient-based optimization methods
that start from an initial guess at the solution and seek to minimize
a specific cost function. If either algorithm converges to a configuration
where the cost is close to zero within a specified tolerance, it has
found a solution to the inverse kinematics problem. However, for some
combinations of initial guesses and desired end effector poses, the
algorithm may exit without finding an ideal robot configuration. To
handle this, the algorithm utilizes a random restart mechanism. If
enabled, the random restart mechanism restarts the iterative search
from a random robot configuration whenever that search fails to find
a configuration that achieves the desired end effector pose. These
random restarts continue until either a qualifying IK solution is
found, the maximum time has elapsed, or the iteration limit is reached.

To set your algorithm, specify the `SolverAlgorithm`

property
as either `'BFGSGradientProjection'`

or `'LevenbergMarquardt'`

.

The Broyden-Fletcher-Goldfarb-Shanno (BFGS) gradient projection algorithm is a quasi-Newton method that uses the gradients of the cost function from past iterations to generate approximate second-derivative information. The algorithm uses this second-derivative information in determining the step to take in the current iteration. A gradient projection method is used to deal with boundary limits on the cost function that the joint limits of the robot model create. The direction calculated is modified so that the search direction is always valid.

This method is the default algorithm and is more robust at finding solutions than the Levenberg-Marquardt method. It is more effective for configurations near joint limits or when the initial guess is not close to the solution. If your initial guess is close to the solution and a quicker solution is needed, consider the Levenberg-Marquardt method.

The Levenberg-Marquardt (LM) algorithm variant used in the `InverseKinematics`

class
is an error-damped least-squares method. The error-damped factor helps
to prevent the algorithm from escaping a local minimum. The LM algorithm
is optimized to converge much faster if the initial guess is close
to the solution. However the algorithm does not handle arbitrary initial
guesses well. Consider using this algorithm for finding IK solutions
for a series of poses along a desired trajectory of the end effector.
Once a robot configuration is found for one pose, that configuration
is often a good initial guess at an IK solution for the next pose
in the trajectory. In this situation, the LM algorithm may yield faster
results. Otherwise, use the BFGS Gradient Projection instead.

Each algorithm has specific tunable parameters to improve solutions.
These parameters are specified in the `SolverParameters`

property
of the object.

The solver parameters for the BFGS algorithm have the following fields:

`MaxIterations`

— Maximum number of iterations allowed. The default is 1500.`MaxTime`

— Maximum number of seconds that the algorithm runs before timing out. The default is 10.`GradientTolerance`

— Threshold on the gradient of the cost function. The algorithm stops if the magnitude of the gradient falls below this threshold. Must be a positive scalar.`SolutionTolerance`

— Threshold on the magnitude of the error between the end-effector pose generated from the solution and the desired pose. The weights specified for each component of the pose in the object are included in this calculation. Must be a positive scalar.`EnforceJointLimits`

— Indicator if joint limits are considered in calculating the solution.`JointLimits`

is a property of the robot model in`rigidBodyTree`

. By default, joint limits are enforced.`AllowRandomRestarts`

— Indicator if random restarts are allowed. Random restarts are triggered when the algorithm approaches a solution that does not satisfy the constraints. A randomly generated initial guess is used.`MaxIteration`

and`MaxTime`

are still obeyed. By default, random restarts are enabled.`StepTolerance`

— Minimum step size allowed by the solver. Smaller step sizes usually mean that the solution is close to convergence. The default is 10^{–14}.

The solver parameters for the LM algorithm have the following extra fields in addition to what the BFGS Gradient Projection method requires:

`ErrorChangeTolerance`

— Threshold on the change in end-effector pose error between iterations. The algorithm returns if the changes in all elements of the pose error are smaller than this threshold. Must be a positive scalar.`DampingBias`

— A constant term for damping. The LM algorithm has a damping feature controlled by this constant that works with the cost function to control the rate of convergence. To disable damping, use the`UseErrorDamping`

parameter.`UseErrorDamping`

— 1 (default), Indicator of whether damping is used. Set this parameter to`false`

to disable dampening.

While using the inverse kinematics algorithms, each call on the object returns solution information about how the algorithm performed. The solution information is provided as a structure with the following fields:

`Iterations`

— Number of iterations run by the algorithm.`NumRandomRestarts`

— Number of random restarts because algorithm got stuck in a local minimum.`PoseErrorNorm`

— The magnitude of the pose error for the solution compared to the desired end effector pose.`ExitFlag`

— Code that gives more details on the algorithm execution and what caused it to return. For the exit flags of each algorithm type, see Exit Flags.`Status`

— Character vector describing whether the solution is within the tolerance (`'success'`

) or the best possible solution the algorithm could find (`'best available'`

).

In the solution information, the exit flags give more details
on the execution of the specific algorithm. Look at the `Status`

property
of the object to find out if the algorithm was successful. Each exit
flag code has a defined description.

`'BFGSGradientProjection'`

algorithm exit flags:

`1`

— Local minimum found.`2`

— Maximum number of iterations reached.`3`

— Algorithm timed out during operation.`4`

— Minimum step size. The step size is below the`StepToleranceSize`

field of the`SolverParameters`

property.`5`

— No exit flag. Relevant to`'LevenbergMarquardt'`

algorithm only.`6`

— Search direction invalid.`7`

— Hessian is not positive semidefinite.

`'LevenbergMarquardt'`

algorithm exit flags:

`1`

— Local minimum found.`2`

— Maximum number of iterations reached.`3`

— Algorithm timed out during operation.`4`

— Minimum step size. The step size is below the`StepToleranceSize`

field of the`SolverParameters`

property.`5`

— The change in end-effector pose error is below the`ErrorChangeTolerance`

field of the`SolverParameters`

property.

[1] Badreddine, Hassan, Stefan Vandewalle, and Johan Meyers.
"Sequential Quadratic Programming (SQP) for Optimal Control in Direct
Numerical Simulation of Turbulent Flow." *Journal of Computational
Physics*. 256 (2014): 1–16. doi:10.1016/j.jcp.2013.08.044.

[2] Bertsekas, Dimitri P. *Nonlinear Programming*.
Belmont, MA: Athena Scientific, 1999.

[3] Goldfarb, Donald. "Extension of Davidon’s Variable
Metric Method to Maximization Under Linear Inequality and Equality
Constraints." *SIAM Journal on Applied Mathematics*.
Vol. 17, No. 4 (1969): 739–64. doi:10.1137/0117067.

[4] Nocedal, Jorge, and Stephen Wright. *Numerical
Optimization*. New York, NY: Springer, 2006.

[5] Sugihara, Tomomichi. "Solvability-Unconcerned Inverse
Kinematics by the Levenberg–Marquardt Method." *IEEE
Transactions on Robotics* Vol. 27, No. 5 (2011): 984–91.
doi:10.1109/tro.2011.2148230.

[6] Zhao, Jianmin, and Norman I. Badler. "Inverse Kinematics
Positioning Using Nonlinear Programming for Highly Articulated Figures." *ACM
Transactions on Graphics* Vol. 13, No. 4 (1994): 313–36.
doi:10.1145/195826.195827.

`generalizedInverseKinematics`

| `inverseKinematics`

| `rigidBodyTree`