Trilateration Based Local Position System

Dependents:   TDP_main_BartFork TDP_main TDP_main TDP_main_fork

LPS.h

Committer:
Joseph_Penikis
Date:
2015-03-12
Revision:
3:dd68ac680416
Parent:
2:21ca29888540

File content as of revision 3:dd68ac680416:

#ifndef LPS_H
#define LPS_H

#include "mbed.h"

typedef struct _3D_Vector{    
    float x;
    float y;
    float z;   
} __3D_Vector;

class LPS {
    public:
        // Eventually use this to setup pin interconnects to Basestation
        LPS(PinName MOSI, PinName MISO, PinName SCLK);
        ~LPS();
    
        void calibratePosition(float iCal, float dCal, float jCal);
    
        void setHome(_3D_Vector home);
        
        void updateLocation();
    
        float getCurrentX();
        float getCurrentY();
        float getCurrentZ();
        _3D_Vector getCurrentLocation();  
        
        _3D_Vector getBeacon_1_Location();
        _3D_Vector getBeacon_2_Location();
        _3D_Vector getBeacon_3_Location();    
        
        // debug functions 
        _3D_Vector getUnitX();
        _3D_Vector getUnitY();
        _3D_Vector getUnitZ();
        float geti();
        float getd();
        float getj();
    private:
        SPI _spi;
        
        // Bunch of storage locations for SPI transfers
        int received_1;
        int received_2;
        int received_3;
        /*
         The three displacemnet values corrosponding to the calibration positions
            - ALL MOST BE Z=0
            - ONE MUST BE ORIGIN (ALREADY ASSUMED)
            - ONE MUST BE ON X_AXIS
            
            Cal Point 1 is origin (0,0,0)
            theta_1 : x-coordinate of Cal Point 2
            theta_2 : x-coordinate of Cal Point 3
            theta_3 : y-coordinate of Cal Point 3
            
            i.e.
            Cal Point 1 : {0,0,0}
            Cal Point 2 : {theta_1,0,0}
            Cal Point 3 : {theta_2,theta_3,0}        
        */
        // i,d and j
        float i,d,j;
        
        // Unit Vector
        _3D_Vector unitX, unitY, unitZ;
        
        // The received distances from the beacons
        float beacon_1_distance;
        float beacon_2_distance;
        float beacon_3_distance;
        
        // The computed location of all three beacons
        _3D_Vector beacon_1_loc;
        _3D_Vector beacon_2_loc;
        _3D_Vector beacon_3_loc;
        
        // Home location
        _3D_Vector home;
        // Current location, two possible locations, still need to determine if i can narrow these down analytically,
        // currently, current_1 contains value closes to z = 0;
        _3D_Vector current_1;
        _3D_Vector current_2;
        
        void updateDistances(); 
        
        int fetchTimeOverSPI(int inst);
        
        // Special function used for reading in and storing all 9 distances needed for calibration, abuse _3D_Vector to optimise memory
        void updateCalibrationDistances();
        
        // Calculate all the necessary unitX, unitY, unitZ, i, d, and j values
        void calcUnitVectorsAndScalars();
        
};

         
// Calculates the coordinates based off of received timings/Calibration mode, values are dependent on mode (Calibrate or Acquire)
// Passing by reference just saves a bit of memery (and time?)
float calcX(float t1, float t2, float d);
float calcY(float t1, float t3, float i, float j, float x);
float calcZ(float t1, float x, float y);

// Static functions that don't belong to the object
_3D_Vector addFourVectors(_3D_Vector a, _3D_Vector b, _3D_Vector c, _3D_Vector d);
_3D_Vector scaleVector(_3D_Vector a, float scale);
_3D_Vector unitVector(_3D_Vector a);

float dot_Product(_3D_Vector a, _3D_Vector b);
float vectorMagnitude(_3D_Vector a);
_3D_Vector cross_Product(_3D_Vector a, _3D_Vector b);  
_3D_Vector subTwoVectors(_3D_Vector a, _3D_Vector b);
#endif