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 };