calculate

Dependencies:   mbed X_NUCLEO_IKS01A3 Mahony_Algorithm

Files at this revision

API Documentation at this revision

Comitter:
zollecy1
Date:
Wed Apr 29 10:54:59 2020 +0000
Parent:
4:7d13076ecece
Child:
6:4641f2b2684b
Commit message:
..

Changed in this revision

CalculateData.cpp Show annotated file Show diff for this revision Revisions of this file
CalculateData.h Show annotated file Show diff for this revision Revisions of this file
Mahony_Algorithm.lib Show annotated file Show diff for this revision Revisions of this file
--- a/CalculateData.cpp	Fri Apr 24 15:10:06 2020 +0000
+++ b/CalculateData.cpp	Wed Apr 29 10:54:59 2020 +0000
@@ -37,19 +37,20 @@
 static LSM6DSOSensor        *acc_gyro;                          //Gyro-Sensor
 static LIS2DW12Sensor       *accelerometer;                     //Acceleroation-Sensor
 static LIS2MDLSensor        *magnetometer;                      //Magnetometer
+const float                 accOffset[3] = {-0.007734011220907f, -0.007085474965694f, -9.910594323583762f};
 const int                   FILTERSIZE = 28;
-static int                  acc_filter[3][FILTERSIZE];
-static int                  gyro_filter[3][FILTERSIZE];
-static int                  speed_filter[3][FILTERSIZE];
-const double                filter_koef[FILTERSIZE] = {0.04002232346037,  -0.1345598020407, -0.05881026752833, -0.03718019471321,
-                                                        -0.02581625686635, -0.01315040166028, 0.003361386671892,   0.0234601656009,
-                                                        0.04581625763125,  0.06897560043795,   0.0905455051097,   0.1088826077838,
-                                                        0.1221264326899,   0.1290832392388,   0.1290832392388,   0.1221264326899,
-                                                        0.1088826077838,   0.0905455051097,  0.06897560043795,  0.04581625763125,
-                                                        0.0234601656009, 0.003361386671892, -0.01315040166028, -0.02581625686635,
-                                                        -0.03718019471321, -0.05881026752833,  -0.1345598020407,  0.04002232346037
-                                                        };
-
+static float                acc_filter[3][FILTERSIZE];
+static float                gyro_filter[3][FILTERSIZE];
+static float                speed_filter[3][FILTERSIZE];
+float                       magtransformationmatrix[3][3]={{1.624f, 0.049f, 0.011f}, {-0.004f, 1.668f, 0.001f}, {0.074f, 0.001f, 1.635f}};
+float                       bias[3]={-466.649f, -273.636f, 58.044f};
+const float                 filter_koef[FILTERSIZE] = {1.54459639027449f, -5.19311640449656f, -2.26968649197199f, -1.43490906020467f,
+                                                        -0.996336387257677f, -0.507518334242666f, 0.129727243968288f, 0.905406882193463f,
+                                                        1.76820384311742f, 2.66200095951371f, 3.49445629978250f, 4.20214691216170f,
+                                                        4.71327076441993f, 4.98175738274206f, 4.98175738274206f, 4.71327076441993f,
+                                                        4.20214691216170f, 3.49445629978250f, 2.66200095951371f, 1.76820384311742f,
+                                                        0.905406882193463f, 0.129727243968288f, -0.507518334242666f, -0.996336387257677f,
+                                                        -1.43490906020467f, -2.26968649197199f, -5.19311640449656f, 1.54459639027449f};
 
 
 
@@ -70,7 +71,7 @@
     magnetometer->enable();
     
     //initialisation Mahony
-    mahony = new MahonyAHRS(166.7);
+    mahony = new MahonyAHRS(200.0);
 }
 
 
@@ -86,11 +87,8 @@
     for (int i = 0; i<3; i++){
         acc[i]=0;
         acc_old[i]=0;
-        gyro[i]=0;
-        gyro_old[i]=0;
         speed[i]=0;
         speed_old[i]=0;
-        angle[i]=0;
         pos[i]=0;
     }
     
@@ -131,7 +129,7 @@
         acc_gyro->get_x_axes(buf_acc);
         acc_gyro->get_g_axes(buf_gyro);
         magnetometer->get_m_axes(buf_mag);
-        t[counter-1]=(double)timer.read_ms()/1000.0f;
+        t[counter-1]=(float)timer.read_ms();
         
         for(int i=0;i<3;i++){
             array_acc[i][counter-1]=buf_acc[i];
@@ -159,12 +157,6 @@
     list->posX= pos[0];
     list->posY= pos[1];
     list->posZ= pos[2];
-    list->gyroX= gyro[0];
-    list->gyroY= gyro[1];
-    list->gyroZ= gyro[2];
-    list->angleX= angle[0];
-    list->angleY= angle[1];
-    list->angleZ= angle[2];
     list->time= t_old;
 }
 
@@ -173,25 +165,36 @@
 void CalculateData::update(){
     
     for(int i=0;i<counter;i++){
-        mahony->update(array_gyro[0][i]*PI/180000.0f, array_gyro[1][i]*PI/180000.0f, array_gyro[2][i]*PI/180000.0f, array_acc[0][i]/1000.0f, array_acc[1][i]/1000.0f, array_acc[2][i]/1000.0f,
-        0.0f,0.0f,0.0f);// array_mag[0][i]/1000.0f, array_mag[1][i]/1000.0f, array_mag[2][i]/1000.0f);
-        /*filterAcc(array_acc, i, acc);
-        filterGyro(array_gyro, i, gyro);
-        integrate(acc, acc_old, speed, t[i], t_old);
-        integrate(gyro, gyro_old, angle, t[i], t_old);
-        filterSpeed(speed, speed);
-        integrate(speed, speed_old, pos, t[i], t_old);
+        
+        float buff[3];
+        
+        calibrationMag(array_mag[0][i],array_mag[1][i],array_mag[2][i], buff);
+                
+        mahony->update(-array_gyro[2][i]*PI/180000.0f, array_gyro[0][i]*PI/180000.0f, array_gyro[1][i]*PI/180000.0f,
+        -array_acc[2][i]/1000.0f, array_acc[0][i]/1000.0f, array_acc[1][i]/1000.0f,
+        buff[2], buff[0], -buff[1]);
+        
+        mahony->getEuler();
+        transform(array_acc, i, acc, mahony->getRoll(), mahony->getPitch(), mahony->getYaw());
+        
+        //filterAcc(acc);
+        
+        integrate(acc, acc_old, speed, t[i], t_old); //in mm/s
+        
+        //filterSpeed(speed);
+        
+        integrate(speed, speed_old, pos, t[i], t_old); //in um
         
         for (int j=0; j<3;j++){
             acc_old[j] = acc[j];
-            gyro_old[j] = gyro[j];
             speed_old[j] = speed[j];
         }
-        t_old=t[i];*/
+        t_old=t[i];
     }
     counter = 0;
-    mahony->getEuler();
-    printf("Roll:\t%i\tPitch\t%i\tYaw:\t%i\r\n",mahony->getRoll(),mahony->getPitch(),mahony->getYaw());
+    //printf("Roll:\t%i\tPitch:\t%i\tYaw:\t%i\r\n",mahony->getRoll(),mahony->getPitch(),mahony->getYaw());
+    printf("%f, %f, %f, %f, %f, %f, %f\r\n",acc[0],acc[1],acc[2], t_old/1000.0f, speed[0]/1000.0f,speed[1]/1000.0f,speed[2]/1000.0f);
+    //printf("%f, %f, %f\r\n",acc[0],acc[1],acc[2]);
 }
 
 
@@ -200,8 +203,8 @@
 
 
 //Daten Integrieren nach expl. Euler
-void CalculateData::integrate(double *x, double *x_old, double *y, double t, double t_old){
-    double dt = t-t_old;
+void CalculateData::integrate(float *x, float *x_old, float *y, float t, float t_old){
+    float dt = t-t_old;
     
     for(int i = 0;i < 3;i++){
         y[i] = y[i] + ((x[i]+x_old[i])/2.0f)*dt;
@@ -213,69 +216,71 @@
 
 
 //FIR-Filter (Accelerometer)
-void CalculateData::filterAcc(int array[3][30],int index, double *target){
+void CalculateData::filterAcc(float *array){
     
     double sum_array[] = {0, 0, 0};
     
     for(int j=0;j<3;j++){
         for(int i=0;i<FILTERSIZE-2;i++){
             acc_filter[j][i] = acc_filter[j][i+1];
-            sum_array[j] += (filter_koef[i] * (double)acc_filter[j][i]);
+            sum_array[j] += (filter_koef[i] * (float)acc_filter[j][i]);
         }
-        acc_filter[j][FILTERSIZE-1] = array[j][index];
-        sum_array[j] += (filter_koef[FILTERSIZE-1] * (double)acc_filter[j][FILTERSIZE-1]);
-        target[j] = sum_array[j];
+        acc_filter[j][FILTERSIZE-1] = array[j];
+        sum_array[j] += (filter_koef[FILTERSIZE-1] * (float)acc_filter[j][FILTERSIZE-1]);
+        array[j] = sum_array[j]/FILTERSIZE;
     }        
 
 }
 
-//FIR-Filter (Gyro)
-void CalculateData::filterGyro(int array[3][30],int index, double *target){
-    double sum_array[] = {0, 0, 0};
-    
-    for(int j=0;j<3;j++){
-        for(int i=0;i<FILTERSIZE-2;i++){
-            gyro_filter[j][i] = gyro_filter[j][i+1];
-            sum_array[j] += (filter_koef[i] * (double)gyro_filter[j][i]);
-        }
-        gyro_filter[j][FILTERSIZE-1] = array[j][index];
-        sum_array[j] += (filter_koef[FILTERSIZE-1] * (double)gyro_filter[j][FILTERSIZE-1]);
-        target[j] = sum_array[j];
-    }
-}
 
 //FIR-Filter (Speed)
-void CalculateData::filterSpeed(double *array, double *target){
+void CalculateData::filterSpeed(float *array){
     double sum_array[] = {0, 0, 0};
     
     for(int j=0;j<3;j++){
         for(int i=0;i<FILTERSIZE-2;i++){
             speed_filter[j][i] = speed_filter[j][i+1];
-            sum_array[j] += (filter_koef[i] * (double)speed_filter[j][i]);
+            sum_array[j] += (filter_koef[i] * (float)speed_filter[j][i]);
         }
         speed_filter[j][FILTERSIZE-1] = array[j];
-        sum_array[j] += (filter_koef[FILTERSIZE-1] * (double)speed_filter[j][FILTERSIZE-1]);
-        target[j] = sum_array[j];
+        sum_array[j] += (filter_koef[FILTERSIZE-1] * (float)speed_filter[j][FILTERSIZE-1]);
+        array[j] = sum_array[j]/FILTERSIZE;
     }
 }
 
 
+void CalculateData::calibrationMag(int x,int y,int z, float *buff){
+    buff[0] = magtransformationmatrix[0][0]*((float)x-bias[0])+
+    magtransformationmatrix[0][1]*((float)y-bias[1])+
+    magtransformationmatrix[0][2]*((float)z-bias[2]);
+    
+    buff[1] = magtransformationmatrix[1][0]*((float)x-bias[0])+
+    magtransformationmatrix[1][1]*((float)y-bias[1])+
+    magtransformationmatrix[1][2]*((float)z-bias[2]);
+    
+    buff[2] = magtransformationmatrix[2][0]*((float)x-bias[0])+
+    magtransformationmatrix[2][1]*((float)y-bias[1])+
+    magtransformationmatrix[2][2]*((float)z-bias[2]);
+}
 
-/*
+
 //Beschleunigung in globale Koordinaten Transformieren
-void CalculateData::transform(int *acc, int *angle){
-    double acc_new[3];                      //Neue Werte
-    double a = angle[0]*PI/(1000.0*180.0);  //Winkel alpha in rad
-    double b = angle[1]*PI/(1000.0*180.0);  //Winkel beta in rad
-    double c = angle[2]*PI/(1000.0*180.0);  //Winkel gamma in rad
+void CalculateData::transform(int old_val[3][100], int index, float *new_val, int roll, int pitch, int yaw){
+    
+    //Koeffizienten zum umrechnen
+    float sa = sin((float)yaw*PI/180.0f);    
+    float ca = cos((float)yaw*PI/180.0f);
+    float sb = sin((float)(-pitch)*PI/180.0f);
+    float cb = cos((float)(-pitch)*PI/180.0f);
+    float sc = sin((float)roll*PI/180.0f);
+    float cc = cos((float)roll*PI/180.0f);
     
     //Transformation
-    acc_new[0] = (double)acc[0]*cos(a)*cos(c) - (double)acc[1]*cos(b)*sin(c) + (double)acc[2]*sin(b);
-    acc_new[1] = (double)acc[0]*(cos(a)*sin(c)+sin(a)*sin(b)*cos(c)) + (double)acc[1]*(cos(a)*cos(c)-sin(a)*sin(b)*cos(c)) - (double)acc[2]*sin(a)*cos(b);
-    acc_new[2] = (double)acc[0]*(sin(a)*sin(c)-cos(a)*sin(b)*cos(c)) - (double)acc[1]*(sin(a)*cos(c)+cos(a)*sin(b)*sin(c)) + (double)acc[2]*cos(a)*cos(b);
-    
-    for(int i=0;i<3;i++){
-        acc[i] = (int)acc_new[i];
-    }
+    /*new_val[0] = -(float)old_val[2][index]*(ca*cb) - (float)old_val[0][index]*(ca*sb*sc-cc*sa) + (float)old_val[1][index]*(ca*cc*sb+sa*sc);
+    new_val[1] = -(float)old_val[2][index]*(cb*sa) - (float)old_val[0][index]*(ca*cc+sa*sb*sc) + (float)old_val[1][index]*(cc*sa*sb-ca*sc);
+    new_val[2] = -(float)old_val[2][index]*(-sb) - (float)old_val[0][index]*(cb*sc) + (float)old_val[1][index]*(cb*cc);
+    */
+    new_val[0] = (-(float)old_val[2][index]*(ca*cb) + (float)old_val[0][index]*(cb*sa) + (float)old_val[1][index]*(-sb))*0.0098f - accOffset[0];
+    new_val[1] = (-(float)old_val[2][index]*(ca*sb*sc-cc*sa) + (float)old_val[0][index]*(ca*cc+sa*sb*sc) + (float)old_val[1][index]*(cb*sc))*0.0098f - accOffset[1];
+    new_val[2] = (-(float)old_val[2][index]*(ca*cc*sb+sa*sc) + (float)old_val[0][index]*(cc*sa*sb-ca*sc) + (float)old_val[1][index]*(cb*cc))*0.0098f - accOffset[2];
 }
-*/
\ No newline at end of file
--- a/CalculateData.h	Fri Apr 24 15:10:06 2020 +0000
+++ b/CalculateData.h	Wed Apr 29 10:54:59 2020 +0000
@@ -49,12 +49,12 @@
 private:
 
     
-    void                        integrate(double *x, double *x_old, double *y, double t, double t_old);
-    //void                        transform(int *acc, int *angle);
-    void                        filterAcc(int array[3][30],int index, double *target);
-    void                        filterGyro(int array[3][30],int index, double *target);
-    void                        filterSpeed(double *array, double *target);
+    void                        integrate(float *x, float *x_old, float *y, float t, float t_old);
+    void                        transform(int old_val[3][100], int index, float *new_val, int roll, int pitch, int yaw);
+    void                        filterAcc(float *array);
+    void                        filterSpeed(float *array);
     void                        run();
+    void                        calibrationMag(int x,int y,int z, float *buff);
 
     
     
@@ -69,16 +69,13 @@
     bool                        periodic_task;          //boolean periodic condition
     
     
-    double                      acc[3];         
-    double                      gyro[3];
-    double                      acc_old[3];
-    double                      gyro_old[3];
-    double                      speed[3];
-    double                      speed_old[3];
-    double                      angle[3];
-    double                      pos[3];
-    double                      t[30];
-    double                      t_old;
+    float                       acc[3];
+    float                       acc_old[3];
+    float                       speed[3];
+    float                       speed_old[3];
+    float                       pos[3];
+    float                       t[100];
+    float                       t_old;
   
     
 };
--- a/Mahony_Algorithm.lib	Fri Apr 24 15:10:06 2020 +0000
+++ b/Mahony_Algorithm.lib	Wed Apr 29 10:54:59 2020 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/b50559/code/Mahony_Algorithm/#da9dac34fd93
+https://os.mbed.com/users/zollecy1/code/Mahony_Algorithm/#0d456c561eab