completed code

Dependencies:   mbed

main.cpp

Committer:
tlee6414
Date:
2018-11-19
Revision:
4:4b6f0c4cd39f
Parent:
3:461a9012682d
Child:
5:4af75af374cc

File content as of revision 4:4b6f0c4cd39f:

#include "sensor_fusion.h"
#include "quaternion.h"
#include "millis.h"
#include "mbed.h"


MPU6050 mpu(SDA,SCL);

Serial pc(USBTX,USBRX,115200);


void normalize(struct vector *raw, struct vector *normalized);

int main() {
    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()) {
            continue;
        }
        
        //raw data
        struct vector accel;


        
        //bias
        struct vector gyro_bias = {0, 0, 0};
        struct vector accel_bias = {500, 350, 2000};
        
        //gets raw data
        mpu.read_raw(&gyro.x, &gyro.y, &gyro.z, &accel.x, &accel.y, &accel.z);
        //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);

        //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",  orientation.x, orientation.y, orientation.z);
        
        //wait(1);
    }
}