function [q, solInfo] = computeIK(T, qini, solTol, gradTol)
persistent ik
if isempty(ik)
robot = robotics.manip.internal.robotplant.puma560DH();
robot.DataFormat = 'column';
ik = inverseKinematics('RigidBodyTree', robot);
ik.SolverParameters.MaxIterations = 100;
ik.SolverParameters.AllowRandomRestart = false;
end
ik.SolverParameters.SolutionTolerance = solTol;
ik.SolverParameters.GradientTolerance = gradTol;
[q, solInfo] = ik('L6', T, ones(1,6), qini);
end