Crude navigation

Dependencies:   GPS L3GD20 LSM303DLHC mbed PID

main.cpp

Committer:
Spilly
Date:
2015-02-21
Revision:
0:e79311aae7ed
Child:
2:503a5ac6c3b6

File content as of revision 0:e79311aae7ed:

#include "mbed.h"
#include "GPS.h"
#include "modSensData.h"

//Radius of the earth in meters
#define EARTHRADIUS 6378100.0f
//Tolerance for heading actual and heading needed
#define HEADDIFF 5.0f
//Period in seconds of the the main loop
#define PERIOD 1

//GPS
GPS gps(D9, D7);

//X-Bee
Serial xBee(PTC15, PTC14);


float startPos[2], curPos[2], goalPos[2] = {35.478593, -81.981878}, polarVector[2];

void setGoalPos(float lat, float lon);
void makeVector(void);
char whichWay(float magHead, float calcHead);
void testYaw(void);

int main()
{
    xBee.baud(9600);
    
    //uncomment to check math for calculating needed heading
    //testYaw();
    
    xBee.printf("\nI'm Alive...\n");
    
    //Setup the GPS
    gps.Init();
    
    gps.parseData();
    
    //wait until we have a gps fix
    while(gps.fixtype == 0)
    {
        xBee.printf("fix %d\n", gps.fixtype);
        gps.parseData();
        wait(.2);    
    }
    
    //set starting position
    curPos[0] = gps.latitude;
    curPos[1] = gps.longitude;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    //printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.latitude, gps.longitude, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
    //printf("magn %f\tangle %f\tlat %f\tlon %f\tgoalLat %f\tgoalLon %f\n", polarVector[0], polarVector[1], gps.latitude, gps.longitude, goalPos[0], goalPos[1]);
    
    while (1) 
    {
        // Process / check GPS data
        gps.parseData();
        //printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.latitude, gps.longitude, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
        
        //update current position
        curPos[0] = gps.latitude;
        curPos[1] = gps.longitude;
        
        makeVector();
        
        //get data from IMU and do calculations to determine heading
        updateAngles();
        
        //decide which way to go
        char direction = whichWay(yaw, polarVector[1]);
        xBee.printf("dist %f\tneed %f\tcurrent %f\tdir %c\tlat %f\tlon %f\tgoalLat %f\tgoalLon %f\n", polarVector[0], polarVector[1], yaw, direction, gps.latitude, gps.longitude, goalPos[0], goalPos[1]);
        wait(PERIOD);
    }
}

//create polar vector based on two sets of latitude and longitude
void makeVector(void)
{
    float arcLength[2];
    
    //arc length = radius * angle
    //Y
    arcLength[1] = EARTHRADIUS * (goalPos[0] - curPos[0]);
    //X
    arcLength[0] = EARTHRADIUS * (curPos[1] - goalPos[1]);
    
    //arcLength[0] = EARTHRADIUS * (curPos[1] - goalPos[1]);
    //arcLength[1] = EARTHRADIUS * (curPos[0] - goalPos[0]);
    //calculate magnitude of vector
    polarVector[0] = sqrt((arcLength[0] * arcLength[0]) + (arcLength[1] * arcLength[1]));
    
    //Use arcTan(-x/y) b/c we want our heading to be in respect to North (North = 0 degrees, East = 90 deg, etc.)
    polarVector[1] = (RADTODEGREE * (atan2(-arcLength[0], arcLength[1])));
    
    //make negative angles positive
    if(polarVector[1] < 0) polarVector[1] = polarVector[1] + 360;
}

//Decide which direction to turn based on current compass heading and heading required
char whichWay(float magHead, float calcHead)
{
    
    float absOfDiff = sqrt((calcHead - magHead) * (calcHead - magHead));
    
    //Is the heading off enough to care?
    if((absOfDiff >= HEADDIFF) && (absOfDiff <= (360.0f - HEADDIFF)))
    {
        if(calcHead > magHead)
        {
            if((calcHead - magHead) < 180)
            {
                return 'R';
            }
            return 'L';
        }
        else if((magHead - calcHead) < 180)
        {
            return 'L';
        }
        return 'R';
    }
    return 'G';
}

//Test for verifying heading
void testYaw(void)
{
    //set test position to indicate a necessary heading of:
    curPos[0] = 34.833716f;
    curPos[1] = -82.404188f;
    
    //due north
    goalPos[0] = 35.833716f;
    goalPos[1] = -82.404188f;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees due north\n", polarVector[0], polarVector[1]);
    
    //due south
    goalPos[0] = 33.833716f;
    goalPos[1] = -82.404188f;
    
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees due south\n", polarVector[0], polarVector[1]);
    
    //due east
    goalPos[0] = 34.833716f;
    goalPos[1] = -81.404188f;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees due east\n", polarVector[0], polarVector[1]);
    
    
    //due west
    goalPos[0] = 34.833716f;
    goalPos[1] = -83.404188f;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees due west\n", polarVector[0], polarVector[1]);
    
    //north east
    goalPos[0] = 35.833716f;
    goalPos[1] = -81.404188f;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees north east\n", polarVector[0], polarVector[1]);
    
    
    //north west
    goalPos[0] = 35.833716f;
    goalPos[1] = -83.404188f;
    
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees north west\n", polarVector[0], polarVector[1]);
    
    //south east
    goalPos[0] = 33.833716f;
    goalPos[1] = -81.404188f;
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees south east\n", polarVector[0], polarVector[1]);
    
    
    //south west
    goalPos[0] = 33.833716f;
    goalPos[1] = -83.404188f;
    
    
    //Convert starting position and goal position to a vector
    makeVector();
    
    xBee.printf("dist %fmeters\tangle %fdegrees south west\n", polarVector[0], polarVector[1]);
    
    while(1);
    
    /*
    //below is useful when checking compass heading
    while(1)
    {
        updateAngles();
        char direction = whichWay(yaw, polarVector[1]);
        //printf("accX %f\taccY %f\taccZ %f\tmagX %f\tmagY %f\tmagZ %f\troll %f\tpitch %f\tyaw %f\tturn %c\n", accel[0], accel[1], accel[2], magnetom[0], magnetom[1], magnetom[2], roll, pitch, yaw, direction);
        wait(1);
    }
    */
}