00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "moveit/kdl_kinematics_plugin/chainiksolver_pos_nr_jl_mimic.hpp"
00029 #include <ros/console.h>
00030
00031 namespace KDL
00032 {
00033
00034 ChainIkSolverPos_NR_JL_Mimic::ChainIkSolverPos_NR_JL_Mimic(const Chain& _chain,
00035 const JntArray& _q_min,
00036 const JntArray& _q_max,
00037 ChainFkSolverPos& _fksolver,
00038 ChainIkSolverVel& _iksolver,
00039 unsigned int _maxiter,
00040 double _eps,
00041 bool _position_ik)
00042 : chain(_chain),
00043 q_min(_q_min),
00044 q_min_mimic(chain.getNrOfJoints()),
00045 q_max(_q_max),
00046 q_max_mimic(chain.getNrOfJoints()),
00047 q_temp(chain.getNrOfJoints()),
00048 fksolver(_fksolver),
00049 iksolver(_iksolver),
00050 delta_q(_chain.getNrOfJoints()),
00051 maxiter(_maxiter),
00052 eps(_eps),
00053 position_ik(_position_ik)
00054 {
00055 mimic_joints.resize(chain.getNrOfJoints());
00056 for(std::size_t i=0; i < mimic_joints.size(); ++i)
00057 {
00058 mimic_joints[i].reset(i);
00059 }
00060 ROS_DEBUG_NAMED("kdl","Limits");
00061 for(std::size_t i=0; i < q_min.rows(); ++i)
00062 {
00063 ROS_DEBUG_NAMED("kdl","%ld: Min: %f, Max: %f", long(i), q_min(i), q_max(i));
00064 }
00065 ROS_DEBUG_NAMED("kdl"," ");
00066 }
00067
00068 bool ChainIkSolverPos_NR_JL_Mimic::setMimicJoints(const std::vector<kdl_kinematics_plugin::JointMimic>& _mimic_joints)
00069 {
00070 if(_mimic_joints.size() != chain.getNrOfJoints())
00071 {
00072 ROS_ERROR_NAMED("kdl","Mimic Joint info should be same size as number of joints in chain: %d", chain.getNrOfJoints());
00073 return false;
00074 }
00075
00076 for(std::size_t i=0; i < _mimic_joints.size(); ++i)
00077 {
00078 if(_mimic_joints[i].map_index >= chain.getNrOfJoints())
00079 {
00080 ROS_ERROR_NAMED("kdl","Mimic Joint index should be less than number of joints in chain: %d", chain.getNrOfJoints());
00081 return false;
00082 }
00083 }
00084 mimic_joints = _mimic_joints;
00085
00086
00087
00088
00089
00090 ROS_DEBUG_NAMED("kdl","Set mimic joints");
00091 return true;
00092 }
00093
00094 void ChainIkSolverPos_NR_JL_Mimic::qToqMimic(const JntArray& q, JntArray& q_result)
00095 {
00096 for(std::size_t i=0; i < chain.getNrOfJoints(); ++i)
00097 {
00098 q_result(i) = mimic_joints[i].offset + mimic_joints[i].multiplier * q(mimic_joints[i].map_index);
00099 }
00100 }
00101
00102 void ChainIkSolverPos_NR_JL_Mimic::qMimicToq(const JntArray& q, JntArray& q_result)
00103 {
00104 for(std::size_t i=0; i < chain.getNrOfJoints(); ++i)
00105 {
00106 if(mimic_joints[i].active)
00107 {
00108 q_result(mimic_joints[i].map_index) = q(i);
00109 }
00110 }
00111 }
00112
00113 int ChainIkSolverPos_NR_JL_Mimic::CartToJnt(const JntArray& q_init, const Frame& p_in, JntArray& q_out)
00114 {
00115 return CartToJntAdvanced(q_init,p_in,q_out,false);
00116 }
00117
00118 int ChainIkSolverPos_NR_JL_Mimic::CartToJntAdvanced(const JntArray& q_init, const Frame& p_in, JntArray& q_out, bool lock_redundant_joints)
00119 {
00120
00121
00122
00123 q_temp = q_init;
00124 ROS_DEBUG_STREAM_NAMED("kdl","Input:");
00125 for(std::size_t i=0; i < q_out.rows(); ++i)
00126 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i,q_out(i));
00127
00128 unsigned int i;
00129 for(i=0;i<maxiter;++i)
00130 {
00131 fksolver.JntToCart(q_temp,f);
00132 delta_twist = diff(f,p_in);
00133
00134 if(position_ik)
00135 {
00136 if(fabs(delta_twist(0)) < eps && fabs(delta_twist(1)) < eps && fabs(delta_twist(2)) < eps)
00137 break;
00138 }
00139 else
00140 {
00141 if(Equal(delta_twist,Twist::Zero(),eps))
00142 break;
00143 }
00144
00145 ROS_DEBUG_STREAM_NAMED("kdl","delta_twist");
00146 for(std::size_t i=0; i < 6; ++i)
00147 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i, delta_twist(i));
00148
00149 iksolver.CartToJnt(q_temp,delta_twist,delta_q);
00150
00151 Add(q_temp,delta_q,q_temp);
00152
00153 ROS_DEBUG_STREAM_NAMED("kdl","delta_q");
00154 for(std::size_t i=0; i < delta_q.rows(); ++i)
00155 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i, delta_q(i));
00156
00157 ROS_DEBUG_STREAM_NAMED("kdl","q_temp");
00158 for(std::size_t i=0; i < q_temp.rows(); ++i)
00159 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i, q_temp(i));
00160
00161 for(std::size_t j=0; j<q_min.rows(); ++j)
00162 {
00163
00164 if(q_temp(j) < q_min(j))
00165 q_temp(j) = q_min(j);
00166 }
00167 for(std::size_t j=0; j<q_max.rows(); ++j)
00168 {
00169
00170 if(q_temp(j) > q_max(j))
00171 q_temp(j) = q_max(j);
00172 }
00173
00174
00175
00176
00177
00178
00179 }
00180
00181
00182 q_out = q_temp;
00183 ROS_DEBUG_STREAM_NAMED("kdl","Full Solution:");
00184 for(std::size_t i=0; i < q_temp.rows(); ++i)
00185 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i,q_temp(i));
00186
00187 ROS_DEBUG_STREAM_NAMED("kdl","Actual Solution:");
00188 for(std::size_t i=0; i < q_out.rows(); ++i)
00189 ROS_DEBUG_NAMED("kdl","%d: %f",(int) i,q_out(i));
00190
00191 if(i!=maxiter)
00192 return 0;
00193 else
00194 return -3;
00195 }
00196
00197 ChainIkSolverPos_NR_JL_Mimic::~ChainIkSolverPos_NR_JL_Mimic()
00198 {
00199 }
00200 }