Go to the documentation of this file.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 #include <stdio.h>
00026 
00027 
00028 typedef struct
00029 {
00030   double x, y, z;
00031 } KineVector;
00032 
00033 
00034 
00035 typedef struct
00036 {
00037   KineVector p;
00038   KineVector n;
00039   KineVector o;
00040   KineVector a;
00041 } EndEffector;
00042 
00043 class KineCalc
00044 {
00045   public:
00046     KineCalc (void);
00047 
00048     
00049     void CalculateFK (const double fromJoints[]);
00050     bool CalculateIK (const EndEffector &fromPosition);
00051 
00052     
00053     const KineVector& GetP (void) const   { return endEffector.p; }
00054     const KineVector& GetN (void) const   { return endEffector.n; }
00055     const KineVector& GetO (void) const   { return endEffector.o; }
00056     const KineVector& GetA (void) const   { return endEffector.a; }
00057     void SetP (const KineVector &newP)    { endEffector.p.x = newP.x; endEffector.p.y = newP.y; endEffector.p.z = newP.z; }
00058     void SetN (const KineVector &newN)    { endEffector.n.x = newN.x; endEffector.n.y = newN.y; endEffector.n.z = newN.z; }
00059     void SetO (const KineVector &newO)    { endEffector.o.x = newO.x; endEffector.o.y = newO.y; endEffector.o.z = newO.z; }
00060     void SetA (const KineVector &newA)    { endEffector.a.x = newA.x; endEffector.a.y = newA.y; endEffector.a.z = newA.z; }
00061     void SetP (double newPX, double newPY, double newPZ);
00062     void SetN (double newNX, double newNY, double newNZ);
00063     void SetO (double newOX, double newOY, double newOZ);
00064     void SetA (double newAX, double newAY, double newAZ);
00065 
00066     double GetTheta (unsigned int index);
00067     const double* GetThetas (void) const  { return joints; }
00068     void SetTheta (unsigned int index, double newVal);
00069     void SetLinkLengths (double newLink1, double newLink2, double newLink3, double newLink4, double newLink5);
00070     void SetOffset (unsigned int joint, double newOffset);
00071     void SetJointRange (unsigned int joint, double min, double max);
00072 
00073     
00074     KineVector CalculateN (const EndEffector &pose);
00075     KineVector Normalise (const KineVector &vector);
00076 
00077   protected:
00078     void CalcTheta4and5 (double angles[], const EndEffector &fromPosition);
00079     int ChooseSolution (const EndEffector &fromPosition, const double solutions[][5]);
00080     double CalcSolutionError (const double solution[], const EndEffector &fromPosition);
00081     EndEffector CalcFKForJoints (const double angles[]);
00082     bool SolutionInRange (const double angles[]);
00083 
00084     void PrintEndEffector (const EndEffector &endEffector);
00085 
00086     
00087     
00088     
00089     
00090     EndEffector endEffector;
00091 
00092     
00093     
00094     
00095     double joints[5];
00096     
00097     double jointOffsets[5];
00098     
00099     double jointMin[5];
00100     double jointMax[5];
00101 
00102     
00103     
00104     
00105     double link1, link2, link3, link4, link5;
00106 };