calculate
Dependencies: mbed X_NUCLEO_IKS01A3 Mahony_Algorithm
Revision 5:62994bb9fff9, committed 2020-04-29
- Comitter:
- zollecy1
- Date:
- Wed Apr 29 10:54:59 2020 +0000
- Parent:
- 4:7d13076ecece
- Child:
- 6:4641f2b2684b
- Commit message:
- ..
Changed in this revision
--- 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