verify_limits.cc
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <float.h>
00003 #include <assert.h>
00004 #include <string.h>
00005 #include <math.h>
00006 
00007 #include "../src/FRICheck.hh"
00008 
00009 #define DEG *M_PI/180.0
00010 #define RAD /M_PI*180.0
00011 
00013 // helper function
00014 
00015 // for concatenating file names
00016 char* scat(const char* str1, const char* str2)
00017 {
00018   static char buffer[1024];
00019   buffer[0] = '\0';
00020 
00021   return strcat(strcat(buffer, str1), str2);
00022 }
00023 
00024 
00025 void extractLimits(FILE* f, double *angles, int len,
00026                    double* min6, double* min7, double* max6, double *max7)
00027 {
00028   char buffer[1024];
00029 
00030   // initialize limits
00031   for(int i=0; i < len; i++) {
00032     min6[i] =  FLT_MAX;  min7[i] =  FLT_MAX;
00033     max6[i] = -FLT_MAX;  max7[i] = -FLT_MAX;
00034   }
00035 
00036   // bin limits
00037   double bin_limits[len+1];
00038   double *bin_low=&(bin_limits[0]), *bin_high=&(bin_limits[1]);
00039 
00040   // set collection bins around desired angles for J6
00041   bin_limits[0] = -FLT_MAX;
00042   for(int i=0; i < len; i++)
00043     bin_limits[i+1] = (angles[i+1] + angles[i])/2.0;
00044   bin_limits[len] = FLT_MAX;
00045 
00046   int bin=0;
00047   float j6, j7;
00048   while(fgets(buffer, sizeof(buffer), f) != 0) {
00049     if(buffer[0] == '#')
00050       continue;
00051     if(sscanf(buffer, "%f %f", &j6, &j7) != 2)
00052       continue;
00053 
00054     // find correct bin
00055     while(j6 < bin_low[bin]  && bin > 0)
00056       bin--;
00057     while(j6 > bin_high[bin] && bin < len)
00058       bin++;
00059 
00060     // now we should have the correct bin ...
00061     assert(bin_low[bin] <= j6 && j6 <= bin_high[bin]);
00062 
00063     // record min and max
00064     if(j7 > max7[bin]) {
00065       max6[bin] = j6;
00066       max7[bin] = j7;
00067     }
00068     if(j7 < min7[bin]) {
00069       min6[bin] = j6;
00070       min7[bin] = j7;
00071     }
00072   }
00073 }
00074 
00075 void printRawLimits(FILE* f, int len, double* min6, double* min7, double* max6, double *max7)
00076 {
00077   for(int i=0; i < len; i++)
00078     fprintf(f, "%f %f\n", min6[i], min7[i]);
00079 
00080   for(int i=len-1; i >= 0; i--)
00081     fprintf(f, "%f %f\n", max6[i], max7[i]);
00082 
00083   fprintf(f, "%f %f\n", min6[0], min7[0]);
00084 }
00085 
00086 void printLimits(FILE* f, double* angles, double* min, double* max, int len)
00087 {
00088   for(int i=0; i < len; i++)
00089     fprintf(f, "%f %f\n", angles[i], min[i]);
00090 
00091   for(int i=len-1; i >= 0; i--)
00092     fprintf(f, "%f %f\n", angles[i], max[i]);
00093 
00094   fprintf(f, "%f %f\n", angles[0], min[0]);
00095 }
00096 
00097 double interpolate(double x1, double x2, double y1, double y2, double x)
00098 {
00099   double t = (x - x1)/(x2 - x1);
00100   return (1 - t)*y1 + t*y2;
00101 }
00102 
00103 void interpolateLimits(int len, double* min6, double* min7, double* max6, double *max7, double* angles, double *min, double *max)
00104 {
00105   // no interpolation possible at j6 limits
00106   min[0] = min7[0];
00107   max[0] = max7[0];
00108 
00109   min[len-1] = min7[len-1];
00110   max[len-1] = max7[len-1];
00111 
00112   // do interpolation with other points
00113   for(int i=1; i < len-1; i++) {
00114     if(min6[i] < angles[i])
00115       min[i] = interpolate(min6[i], min6[i+1], min7[i], min7[i+1], angles[i]);
00116     else
00117       min[i] = interpolate(min6[i-1], min6[i], min7[i-1], min7[i], angles[i]);
00118     
00119     if(max6[i] < angles[i])
00120       max[i] = interpolate(max6[i], max6[i+1], max7[i], max7[i+1], angles[i]);
00121     else
00122       max[i] = interpolate(max6[i-1], max6[i], max7[i-1], max7[i], angles[i]);
00123   }
00124 }
00125 
00126 #define MARGIN_IN  17 DEG
00127 #define MARGIN_OUT  3 DEG
00128 
00129 bool testLimits(int len, double *angles, double* min, double *max, double* mine, double* maxe)
00130 {
00131   bool result = true;
00132   for(int i=0; i < len; i++) {
00133     if(min[i] < mine[i] - MARGIN_OUT) {
00134       printf("lower limit @%f too low  (%f << %f) \n", angles[i] RAD, min[i] RAD, mine[i] RAD);
00135       result = false;
00136     }
00137     if(min[i] > mine[i] + MARGIN_IN) {
00138       printf("lower limit @%f too high (%f >> %f) \n", angles[i] RAD, min[i] RAD, mine[i] RAD);
00139       result = false;
00140     }
00141 
00142     if(max[i] > maxe[i] + MARGIN_OUT) {
00143       printf("upper limit @%f too high (%f >> %f) \n", angles[i] RAD, max[i] RAD, maxe[i] RAD);
00144       result = false;
00145     }
00146     if(max[i] < maxe[i] - MARGIN_IN) {
00147       printf("upper limit @%f too low (%f << %f) \n", angles[i] RAD, max[i] RAD, maxe[i] RAD);
00148       result = false;
00149     }
00150   }
00151   return result;
00152 }
00153 
00154 bool verifyHandAngles(int len, double* angles, double* min, double *max, const char* side)
00155 {
00156   FILE *f;
00157 
00158   // auto-extract limits
00159   f = fopen(scat("limits_recording_", side), "r");
00160   double min6[len], max6[len], min7[len], max7[len], mine[len], maxe[len];
00161   extractLimits(f, angles, len, min6, min7, max6, max7);
00162   fclose(f);
00163 
00164   interpolateLimits(len, min6, min7, max6, max7, angles, mine, maxe);
00165 
00166   bool result = testLimits(len, angles, min, max, mine, maxe);
00167 
00168   // print auto-extracted limits
00169   f = fopen(scat("limits_extracted_", side), "w");
00170   printRawLimits(f, len, min6, min7, max6, max7);
00171   fclose(f);
00172 
00173   // print interpolated limits
00174   f = fopen(scat("limits_interpolated_", side), "w");
00175   printLimits(f, angles, mine, maxe, len);
00176   fclose(f);
00177 
00178   // print current state
00179   f = fopen(scat("limit_", side), "w");
00180   printLimits(f, angles, min, max, len);
00181   fclose(f);
00182 
00183   return result;
00184 }
00185 
00186 int main()
00187 {
00188   bool r, result = true;
00189 
00190   printf("testing left hand angles ... ");
00191   r = verifyHandAngles(FRICheck::length_left,
00192                        FRICheck::j5_angles_left,
00193                        FRICheck::j6_min_left,
00194                        FRICheck::j6_max_left,
00195                        "left");
00196   printf("%s\n", (r) ? "PASSED" : "FAILED");
00197   result &= r;
00198 
00199   printf("testing right hand angles ... ");
00200   verifyHandAngles(FRICheck::length_right,
00201                    FRICheck::j5_angles_right,
00202                    FRICheck::j6_min_right,
00203                    FRICheck::j6_max_right,
00204                    "right");
00205   printf("%s\n", (r) ? "PASSED" : "FAILED");
00206   result &= r;
00207 
00208   return (result) ? 0 : -1;
00209 }


kuka_fri
Author(s): Ingo Kresse, Alexis Maldonado
autogenerated on Mon Oct 6 2014 09:27:40