completed code

Dependencies:   mbed

Revision:
4:4b6f0c4cd39f
Parent:
3:461a9012682d
Child:
5:4af75af374cc
--- a/main.cpp	Mon Nov 19 01:28:14 2018 +0000
+++ b/main.cpp	Mon Nov 19 03:56:17 2018 +0000
@@ -15,6 +15,22 @@
     mpu.start();
     millis_begin();
     struct vector orientation = {0, 0, 1}; //starting point
+    struct vector gyro_previous = {0, 0, 0};
+    struct vector gyro = {0, 0, 0};
+    struct vector gyro_avg;
+    struct vector xUnit = {1, 0, 0};
+    struct vector yUnit = {0, 1, 0};
+    struct vector zUnit = {0, 0, 1};
+    struct quaternion xRot;
+    struct quaternion yRot;
+    struct quaternion zRot;
+    struct quaternion finalRot;
+    float time_current = 0;
+    float time_previous = 0;
+    float delta_time = 0;
+    float radFactor = (3.14159265358979323846/180)/15.3;
+    struct vector gAngularV = {0, 0, 0};
+    
     
     while(1) {
         if (!mpu.data_ready()) {
@@ -23,41 +39,51 @@
         
         //raw data
         struct vector accel;
-        struct vector gyro;
+
+
         
         //bias
         struct vector gyro_bias = {0, 0, 0};
         struct vector accel_bias = {500, 350, 2000};
         
         //gets raw data
-        double time = millis();
         mpu.read_raw(&gyro.x, &gyro.y, &gyro.z, &accel.x, &accel.y, &accel.z);
-        double delta_time = millis() - time; //gets time taken to turn
         //pc.printf("Accel: (%f, %f, %f)\n Gyro: (%f, %f, %f)\r\n", accel.x, accel.y, accel.z, gyro.x, gyro.y, gyro.z);
         //pc.printf( "%f %f %f\r\n", accel.x, accel.y, accel.z);
         //pc.printf("%f %f %f\r\n",  gyro.x, gyro.y, gyro.z);
         
+        //calculate angle
+        time_current = (float(millis()) / 1000);
+        delta_time = time_current - time_previous;
+        vector_add(&gyro, &gyro_previous, &gyro_avg);
+        vector_multiply(&gyro_avg, 0.5, &gAngularV);
+        vector_multiply(&gAngularV, delta_time, &gAngularV);
+        gyro_previous = gyro;
+        time_previous = time_current;
+        
+        //rotate orientation vector
+        gAngularV.x *= radFactor;
+        gAngularV.y *= radFactor;
+        gAngularV.z *= radFactor;
+        quaternion_create(&xUnit, gAngularV.x, &xRot);
+        quaternion_create(&yUnit, gAngularV.y, &yRot);
+        quaternion_create(&zUnit, gAngularV.z, &zRot);
+        quaternion_multiply(&xRot, &yRot, &finalRot);
+        quaternion_multiply(&finalRot, &zRot, &finalRot);
+        quaternion_rotate(&orientation, &finalRot, &orientation);
+        vector_normalize(&orientation, &orientation);
         
         //adds bias
         vector_add(&accel, &accel_bias, &accel);
         vector_add(&gyro, &gyro_bias, &gyro);
         //pc.printf( "%f %f %f\r\n", accel.x, accel.y, accel.z);
-        pc.printf("%f %f %f\r\n",  gyro.x, gyro.y, gyro.z);
-        //wait(0.1);
-        
+        //pc.printf("%f %f %f\r\n",  gyro.x, gyro.y, gyro.z);
+        wait(0.1);
+
         //normalize raw data to get vector
         struct vector accel_norm = {0, 0, 0};
         vector_normalize(&accel, &accel_norm);
-        //pc.printf("%f %f %f\r\n", accel_norm.x, accel_norm.y, accel_norm.z);
-        wait(0.1);
-        
-        //create a quaternion
-        struct vector gyro_norm;
-        float angle = vector_normalize(&gyro, &gyro_norm);
-        
-        struct vector orientation = {0, 0, 1};
-        quaternion quat;
-        quaternion_create(&gyro_norm, angle, &quat);
+        pc.printf("%f %f %f\r\n",  orientation.x, orientation.y, orientation.z);
         
         //wait(1);
     }