00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include <Base/Whorl.h>
00019 #include <Base/WhorlSim.h>
00020 #include <Utils/CfgParse.h>
00021 #include <Utils/Measurement.h>
00022 #include <iostream>
00023 #include <fstream>
00024 #include <string>
00025 using namespace std;
00026 
00027 
00028 
00029 
00030 int promptMenu(int collectRuns)
00031 {
00032         const string direction[6] = {"+Z","-Z","+X","-X","+Y","-Y"};
00033         int userinput = 0;
00034 
00035         if (collectRuns < 6)
00036         {
00037                 cout << "=================================================" << endl;
00038                 cout << " MoPak orientation: " << direction[collectRuns] << " up" << endl;
00039                 cout << " Select number to proceed: 1 = ok,  2= abort program ";
00040                 cin >> userinput;
00041                 if (userinput == 1)
00042                 {
00043                         
00044                         cout << " Calibrating, please wait... " << endl;
00045                 } else
00046                 {
00047                         
00048                         cout << endl << " Stopping program... " << endl;
00049                 }
00050         } else
00051         {
00052                 userinput = 1;
00053         }
00054         return userinput;
00055 }               
00056 
00057 int main() 
00058 {
00059         cout << "=================================================" << endl;
00060         cout << " This program will calculate the offset and " << endl;
00061         cout << " scale factor for each of the 3 rate gyros and " << endl;
00062         cout << " linear accelerometers for analog MoPak use. " << endl << endl;
00063         cout << " At this time the MoPak should be placed on a " << endl;
00064         cout << " flat and stationary surface with the extender cable." << endl;
00065         cout << " Follow the prompts to re-orient the MoPak during the procedure. " << endl;
00066 
00067 
00068         cfgBody *cfgDat;
00069         CfgParse parser;
00070         
00071 
00072 
00073 
00074         cfgDat = parser.go("calibrate_analog.cfg");
00075 
00076         Whorl whorlOne;
00077         whorlOne.Initialize(cfgDat);
00078         double total[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; 
00079         double avg[6][6]; 
00080         double xlinavg[4]; 
00081         double ylinavg[4]; 
00082         double zlinavg[4]; 
00083         double linmax[3] = {0.0, 0.0, 0.0}; 
00084         double linmin[3] = {0.0, 0.0, 0.0}; 
00085         double linzero[3] = {0.0, 0.0, 0.0}; 
00086         double ratezero[3] = {0.0, 0.0, 0.0}; 
00087         double scaleFactor[3] = {0.0, 0.0, 0.0};
00088         double offset[3] = {0.0, 0.0, 0.0};
00089         double rateOffset[3] = {0.0, 0.0, 0.0};
00090         
00091         double rad2deg = 180.0/3.1415926535898; 
00092         int collectRuns = 0; 
00093         int numSamples = 300; 
00094         int promptResult = 0; 
00095         
00096         Measurement xrates[numSamples];
00097         Measurement yrates[numSamples];
00098         Measurement zrates[numSamples];
00099         Measurement xlinacc[numSamples];
00100         Measurement ylinacc[numSamples];
00101         Measurement zlinacc[numSamples];
00102 
00103         promptResult = promptMenu(collectRuns);
00104         while (promptResult == 1 && collectRuns < 6)
00105         {
00106                 for (int i = 0; i<numSamples; i++)
00107                 {
00108                         xrates[i] = whorlOne.GetRateGyro(string("dmu_rg1"))->GetMeasurement();
00109                         yrates[i] = whorlOne.GetRateGyro(string("dmu_rg2"))->GetMeasurement();
00110                         zrates[i] = whorlOne.GetRateGyro(string("dmu_rg3"))->GetMeasurement();
00111                         xlinacc[i] = whorlOne.GetAccelerometer(string("dmu_acc1"))->GetMeasurement();
00112                         ylinacc[i] = whorlOne.GetAccelerometer(string("dmu_acc2"))->GetMeasurement();
00113                         zlinacc[i] = whorlOne.GetAccelerometer(string("dmu_acc3"))->GetMeasurement();
00114                         usleep(1);
00115                 }
00116                 for (int cc = 0; cc<numSamples; cc++)
00117                 {
00118                         total[0] += xrates[cc].GetAsDouble()*-1.0*rad2deg;
00119                         total[1] += yrates[cc].GetAsDouble()*-1.0*rad2deg;
00120                         total[2] += zrates[cc].GetAsDouble()*-1.0*rad2deg;
00121                         total[3] += xlinacc[cc].GetAsDouble()/-9.81;
00122                         total[4] += ylinacc[cc].GetAsDouble()/-9.81;
00123                         total[5] += zlinacc[cc].GetAsDouble()/-9.81;
00124                 }
00125                 for (int  ii = 0; ii < 6; ii++)
00126                 {
00127                         avg[ii][collectRuns] = total[ii]/numSamples;
00128                         
00129                         total[ii] = 0;
00130                 }
00131                 switch (collectRuns)
00132                 {
00133                         case 0:
00134                                 xlinavg[0] = avg[3][collectRuns];
00135                                 ylinavg[0] = avg[4][collectRuns];
00136                                 linmax[2] = avg[5][collectRuns];
00137                                 break;
00138                         case 1:
00139                                 xlinavg[1] = avg[3][collectRuns];
00140                                 ylinavg[1] = avg[4][collectRuns];
00141                                 linmin[2] = avg[5][collectRuns];
00142                                 break;
00143                         case 2:
00144                                 linmax[0] = avg[3][collectRuns];
00145                                 ylinavg[2] = avg[4][collectRuns];
00146                                 zlinavg[0] = avg[5][collectRuns];
00147                                 break;
00148                         case 3:
00149                                 linmin[0] = avg[3][collectRuns];
00150                                 ylinavg[3] = avg[4][collectRuns];
00151                                 zlinavg[1] = avg[5][collectRuns];
00152                                 break;
00153                         case 4:
00154                                 xlinavg[2] = avg[3][collectRuns];
00155                                 linmax[1] = avg[4][collectRuns];
00156                                 zlinavg[2] = avg[5][collectRuns];
00157                                 break;
00158                         case 5:
00159                                 xlinavg[3] = avg[3][collectRuns];
00160                                 linmin[1] = avg[4][collectRuns];        
00161                                 zlinavg[3] = avg[5][collectRuns];
00162                                 break;
00163                         default:
00164                                 break;
00165                 }
00166                 cout << "=================================================" << endl;
00167                 cout << " X-RateGyro avg = " << avg[0][collectRuns] << " V " << endl;
00168                 cout << " Y-RateGyro avg = " << avg[1][collectRuns] << " V " << endl;
00169                 cout << " Z-RateGyro avg = " << avg[2][collectRuns] << " V " << endl;
00170                 cout << " X-LinAcc avg = " << avg[3][collectRuns] << " V " << endl;
00171                 cout << " Y-LinAcc avg = " << avg[4][collectRuns] << " V " << endl;
00172                 cout << " Z-LinAcc avg = " << avg[5][collectRuns] << " V " << endl << endl;
00173 
00174                 
00175                 ratezero[0] += avg[0][collectRuns];
00176                 ratezero[1] += avg[1][collectRuns];
00177                 ratezero[2] += avg[2][collectRuns];
00178 
00179                 collectRuns++;
00180                 promptResult = promptMenu(collectRuns);
00181         }
00182         
00183         if (promptResult == 1)
00184         {
00185                 
00186                 for(int b = 0; b<3; b++)
00187                 {
00188                         rateOffset[b] = ratezero[b]/6.0;
00189                 }
00190 
00191                 linzero[0] = (xlinavg[0]+xlinavg[1]+xlinavg[2]+xlinavg[3])/4.0;
00192                 linzero[1] = (ylinavg[0]+ylinavg[1]+ylinavg[2]+ylinavg[3])/4.0;
00193                 linzero[2] = (zlinavg[0]+zlinavg[1]+zlinavg[2]+zlinavg[3])/4.0;
00194         
00195                 cout << "=================================================" << endl;
00196                 cout << " X-LinAcc zero = " << linzero[0] << " V " << endl;
00197                 cout << " Y-LinAcc zero = " << linzero[1] << " V " << endl;
00198                 cout << " Z-LinAcc zero = " << linzero[2] << " V " << endl << endl;
00199         
00200                 cout << " X-LinAcc max, min = " << linmax[0] << ", " << linmin[0] << endl;
00201                 cout << " Y-LinAcc max, min = " << linmax[1] << ", " << linmin[1] << endl;
00202                 cout << " Z-LinAcc max, min = " << linmax[2] << ", " << linmin[2] << endl << endl;
00203         
00204                 for (int i=0; i<3; i++)
00205                 {
00206                         scaleFactor[i] = (-1.0*linmin[i] + 1.0*linmax[i])/2.0;
00207                         offset[i] = (linmin[i]+linzero[i]+linmax[i])/3.0;
00208                 }
00209         
00210                 cout << "=================================================" << endl;
00211                 cout << " X-RateGyro offset = " << rateOffset[0] << endl;
00212                 cout << " Y-RateGyro offset = " << rateOffset[1] << endl;
00213                 cout << " Z-RateGyro offset = " << rateOffset[2] << endl;
00214                 cout << " X-LinAcc scale factor, offset = " << scaleFactor[0] << ", " << offset[0] << endl;
00215                 cout << " Y-LinAcc scale factor, offset = " << scaleFactor[1] << ", " << offset[1] << endl;
00216                 cout << " Z-LinAcc scale factor, offset = " << scaleFactor[2] << ", " << offset[2] << endl;
00217         }
00218         return 0;
00219 }
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241