00001 
00002 #ifndef INCLUDED_IKCalliope_h_
00003 #define INCLUDED_IKCalliope_h_
00004 
00005 #include "Motion/IKSolver.h"
00006 
00007 #if defined(TGT_IS_CALLIOPE3) && defined(TGT_HAS_ARMS)
00008 
00009 class IKCalliope : public IKSolver {
00010 public:
00011   static const float EPSILON;
00012 
00013   IKCalliope();
00014 
00015   using IKSolver::solve;
00016   using IKSolver::step;
00017 
00018   virtual bool solve(const Point& pEff, const Rotation& oriEff, KinematicJoint& j,
00019                      const Position& pTgt, float posPri, 
00020                      const Orientation& oriTgt, float oriPri) const;
00021 
00022   virtual StepResult_t step(const Point& pEff, const Rotation& oriEff, KinematicJoint& j,
00023                             const Position& pTgt, float pDist, float posPri, 
00024                             const Orientation& oriTgt, float oriDist, float oriPri) const;
00025   
00026 
00027   static const std::string autoRegisterIKCalliope;
00028 
00029 };
00030 
00031 #elif defined(TGT_IS_CALLIOPE5) && defined(TGT_HAS_ARMS)
00032 
00033 
00034 class IKCalliope : public IKSolver {
00035 public:
00036   static const float EPSILON;
00037 
00038   IKCalliope();
00039   
00040   using IKSolver::solve;
00041   using IKSolver::step;
00042   
00043 
00044   virtual bool solve(const Point& pEff, const Rotation& oriEff, KinematicJoint& j, const Position& pTgt, float posPri, const Orientation& oriTgt, float oriPri) const;
00045   
00046 
00047   virtual StepResult_t step(const Point& pEff, const Rotation& oriEff, KinematicJoint& j, const Position& pTgt, float pDist, float posPri, const Orientation& oriTgt, float oriDist, float oriPri) const;
00048   
00049 protected:
00050 
00051   static bool isSideGrasp(const Rotation &oriEff, const Orientation &oriTgt);
00052 
00053 
00054   static bool isOverheadGrasp(const Rotation &oriEff, const Orientation &oriTgt);
00055 
00056 
00057   static bool analyticallySolvable(const Rotation &oriEff,
00058                                    const Position &pTgt, const Orientation &oriTgt);
00059 
00060 
00061   static bool gradientSolve(const Point& pEff, const Rotation& oriEff, KinematicJoint& j, 
00062                             const Position& pTgt, float posPri, const Orientation& oriTgt, float oriPri);
00063 
00064 
00065   struct Solutions {
00066     Solutions() : angles(),noSols(),valid() {}
00067     fmat::Matrix<2,3> angles;
00068     int noSols;
00069     bool valid;
00070   };
00071   
00072 
00073 
00074 
00075   Solutions closestThreeLinkIK(const fmat::Column<2>& t, bool posPri, float prefPhi, const fmat::Column<2>& delta) const;
00076   
00077 
00078 
00079   Solutions pointToward(const fmat::Column<2>& target, bool posPri, float prefPhi) const;
00080   
00081 
00082 
00083 
00084   Solutions validAngles(Solutions solutions) const;
00085   
00086 
00087 
00088   Solutions threeLinkIK(fmat::Column<2> t, float phi) const;
00089   
00090 
00091 
00092 
00093   fmat::Matrix<2,2> twoLinkIK(fmat::Column<2> t) const;
00094   
00095 
00096 
00097   int closestSolution(KinematicJoint& j, Solutions s) const;
00098   
00099 
00100 
00101 
00102   void assureOrientation(Solutions& s, float phi) const;
00103   
00104 
00105   static const std::string autoRegisterIKCalliope;
00106   
00107 
00108   float L1, L2;
00109   
00110 
00111   float jointLimits[3][2];
00112   
00113 
00114   float qGripper;
00115   
00116 
00117   float qWristRot;
00118   
00119 
00120   float qOffset;
00121   
00122 
00123   fmat::Transform baseToArm;
00124   
00125 
00126   fmat::Quaternion baseToArmRot;
00127   
00128 
00129   float shoulderOffset;
00130 };
00131 
00132 #elif defined(TGT_IS_CALLIOPE2) && defined(TGT_HAS_ARMS)
00133 
00134 
00135 class IKCalliope : public IKSolver {
00136 public:
00137   static const float EPSILON;
00138 
00139   IKCalliope();
00140   
00141   using IKSolver::solve;
00142   using IKSolver::step;
00143   
00144   virtual bool solve(const Point& pEff, const Rotation& oriEff, KinematicJoint& j,
00145                      const Position& pTgt, float posPri, 
00146                      const Orientation& oriTgt, float oriPri) const;
00147 
00148   virtual StepResult_t step(const Point& pEff, const Rotation& oriEff, KinematicJoint& j,
00149                             const Position& pTgt, float pDist, float posPri, 
00150                             const Orientation& oriTgt, float oriDist, float oriPri) const;
00151   
00152 private:
00153 
00154   static const std::string autoRegisterIKCalliope;
00155   
00156 
00157   fmat::Transform baseToArm;
00158   
00159 
00160   plist::Angle qOffset;
00161   
00162 
00163   plist::Angle gripperOffset;
00164   
00165 
00166   fmat::fmatReal forearmLength;
00167 };
00168 
00169 #  endif
00170 
00171 #endif