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