Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: GPS2 L3GD20 LSM303DLHC2 PID mbed SDFileSystem
Fork of GPSNavigation by
Diff: main.cpp
- Revision:
- 12:273479524c71
- Parent:
- 11:1b34319671eb
- Child:
- 13:17f04a55c6e2
--- a/main.cpp Mon Apr 27 18:10:52 2015 +0000
+++ b/main.cpp Wed Apr 29 18:07:43 2015 +0000
@@ -20,7 +20,7 @@
// Requires a serial to usb adapter to connect an X-Bee to a PC
// Set both X-Bees up for 115200 baud
// Use TeraTerm (or other serial program) to read and send data over X-Bees
-//
+// Set TeraTerm new line character from CR (carrage return) to LF (line feed)
// Program starts by prompting user to press any key
// Once user presses a key, the program waits for a DGPS fix (can be set by changing "FIX")
// Once the program sees a DGPS fix, manual mode is enabled
@@ -56,11 +56,20 @@
//
/*************************************************************************************************************************************************************************************************/
+//unmodified
+//mbed folder
#include "mbed.h"
+//SDFileSystem folder
+#include "SDFileSystem.h"
+
+//modified
+//GPS folder
#include "GPS.h"
+//PID folder
#include "PID.h"
-#include "SDFileSystem.h"
-#include "modSensData.h"
+
+//from scratch
+#include "IMUDataAndFilters.h"
#include "navigation.h"
#include "Actuator.h"
#include "TrollingMotor.h"
@@ -82,24 +91,32 @@
#define headKc 1.0f //directly proportional
#define headTi 0.0f //a larger number makes the integral have less affect on the output
#define headTd 0.0f //a smaller number makes the derivative have less affect on the output
+
+//PID/PID.cpp
PID headingPID(headKc, headTi, headTd, MAGN_PERIOD); //Kc, Ti, Td, interval
-AnalogIn battery(A0);
-AnalogIn pot(A1);
-
-Serial xBee(PTB11, PTB10); //UART 3
-GPS gps(PTC15, PTC14); //UART 4
-
+//mbed classes
Timer headingTime;
Timer acc;
Timer magn;
Timer inputTimer;
Timer loopTimer;
-
-FILE *fr; //file pointer for SD card
+AnalogIn battery(A0); //analog input from +12v side of linear actuator potentiometer (uses voltage divider)
+AnalogIn pot(A1); //analog input from the wiper of linear actuator potentionmeter (uses voltage divider)
+DigitalOut ldo(PTC10); //Controls 3.3V LDO v-reg powering MTK3339 (GPS) 1 = GPS powered on and 0 = GPS powered down
+DigitalOut green(D3); //Light output
+DigitalOut white(PTB9); //Light output
+Serial xBee(PTB11, PTB10); //UART 3
-//On board microSD
-SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd", PTE6, SDFileSystem::SWITCH_POS_NO, 50000000);
+//GPS/GPS.cpp
+GPS gps(PTC15, PTC14); //UART 4
+
+//Not sure where "FILE" is defined
+FILE *way; //file pointer for waypoints on SD card
+FILE *data; //file pointer for datalog
+
+//SDFileSystem/SDFileSystem.h
+SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd", PTE6, SDFileSystem::SWITCH_POS_NO, 50000000); //On board microSD
/***************************************************Prototype functions****************************************************************************************************************************/
void getDist(double posZero, double posOne, double curPos[2]);
@@ -107,35 +124,35 @@
/***************************************************End of prototype functions*********************************************************************************************************************/
/***************************************************Global Variables*******************************************************************************************************************************/
-double polarVector[2] = {0,0.0000001f};
-float manualSpeed = 0.5f;
-double curPos[2] = {0,0};
+//TODO: rewrite polar vector functions to allow elimination of global variables
-//waypoint data is overwritten by data from SD card
-double goalPos[10][2] = { {35.339289, -81.913164},
- {35.338943, -81.911024},
- {35.339289, -81.913164},
- {35.338943, -81.911024},
- {35.339289, -81.913164},
- {35.338943, -81.911024},
- {35.339289, -81.913164},
- {35.338943, -81.911024},
- {35.339289, -81.913164},
- {35.338943, -81.911024}
- };
+double polarVector[2] = {0,0.0000001f}; //poalarVector[0] = magnitude of vector, polarVector[1] = angle in degrees of vector
/*************************************************************************************************************************************************************************************************/
// MAIN
/*************************************************************************************************************************************************************************************************/
int main()
-{
+{
int wayPtNum = 0, mode = 0, adjustMode = 0;
float magDiff = 0;
float batVoltage = 0.0f, potVoltage = 0.0f, voltRatio = 0.0f;
float curSet = 0.0f, prevSet = 0.29f;
float filtered = 0.0000001f;
+ double curPos[2] = {0,0};
+ double goalPos[10][2]; //positions are initially read from SD card
+ //when a position is recorded in record mode, the previously stored position on the SD card is overwritten with the new position
+
+ //set the initial state of the lights
+ green = 1;
+ white = 0;
+ //turn the GPS 3.3V LDO v-reg on
+ ldo = 1;
+ //wait for the GPS unit to boot
+ wait(1);
+
+ //set xBee baud rate
xBee.baud(115200);
xBee.printf("\nI'm Alive...\n");
xBee.printf("Press any key to begin\n");
@@ -143,17 +160,18 @@
//wait for keypress to begin
while(!xBee.readable());
+ //Get goal positions from SD card
//start of SD card read
- fr = fopen ("/sd/GPS_CORDS.txt", "rt");
+ way = fopen ("/sd/GPS_CORDS.txt", "r");
xBee.printf("Reading SD Card Please Wait\n");
for(int x = 0; x<=9; x++)
{
- fscanf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fscanf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
xBee.printf("waypoint %d = %f,%f\n", x, goalPos[x][0], goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
//end of SD card read
//initialize magnetometer, accelerometer
@@ -176,28 +194,30 @@
}
else xBee.printf("Waiting for DGPS fix\tcurrent fix = no fix\n");
}
+
//get IMU data and calculate the tilt compensated compass
- getAccel();
- getMagn();
- updateAngles();
+ getAccel(); //IMUDataAndFilters.h
+ getMagn(); //IMUDataAndFilters.h
+ updateAngles(); //IMUDataAndFilters.h
xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
xBee.printf("dist %f\theading %f\n", polarVector[0], polarVector[1]);
xBee.printf("\n\nstarting main loop\n");
- //PID control of left and right motors based on input from tilt compensated compass
- //Goal is to have the vehicle go straight
+ //set input constraints (heading difference)
headingPID.setInputLimits(-180, 180);
//set proportional output limits based on physical limits of actuator and mounting error
- float distFromCenter = calcEnds(CENTER_RATIO, MAX_RATIO, MIN_RATIO);
+ float distFromCenter = calcEnds(CENTER_RATIO, MAX_RATIO, MIN_RATIO); //navigation.h
+ //set output constraints (linear actuator max and min)
headingPID.setOutputLimits((CENTER_RATIO - distFromCenter), (CENTER_RATIO + distFromCenter));
//set mode to auto
headingPID.setMode(0);
- //We want the difference to be zero
+ //We want the difference between actual heading and the heading needed to be zero
headingPID.setSetPoint(0);
+ //start timers
loopTimer.start();
headingTime.start();
acc.start();
@@ -211,43 +231,62 @@
if(mode == 0)
{
- if(gps.getData())
- {
- //gps.parseData();
- //xBee.printf("lat %f\tlon %f\tHDOP %f\tfix %d\tsat %d\tspd %f\n", gps.degLat, gps.degLon, gps.HDOP, gps.fixtype, gps.satellites, gps.speed);
- //GPSTimer.reset();
- }
- //This moves actuator to the requested position
- //This is proportional feedback only
+ //checks to see if all three NEMA sentences from the GPS UART has been received
+ gps.getData();
+
+ //check timer
if(loopTimer.read() > RATE)
{
+ //TODO: put this in a function
+
+ //This moves actuator to the requested position
+ //This is proportional feedback ONLY
+
+ //read analog input from wiper on potentiometer on linear actuator
potVoltage = pot.read();
+ //read analog input from battery voltage
batVoltage = battery.read();
- //voltage = voltage * 3.3f;
+ //calculate ratio of the two (using a ratio prevents battery voltage fluctuation from affecting actual position)
voltRatio = potVoltage / batVoltage;
+ //calculate the absolute value of how far off from requested actuator position we are (saves a few processor cycles)
float absDiff = sqrt((prevSet - voltRatio) * (prevSet - voltRatio));
+ //are we off enough to care? if so, stop moving the actuator
if(absDiff <= RATIO_TOLERANCE)
{
turnStop(1.0f, 1.0f);
//xBee.printf("done\n");
}
+
+ //do we need to go further right?
else if((prevSet - voltRatio) >= 0)
{
turnRight(1.0f, 1.0f);
//xBee.printf("turning right\n");
}
+
+ //do we need to go further left?
else
{
turnLeft(1.0f, 1.0f);
//xBee.printf("turning left\n");
}
- xBee.printf("battery = %f\tpot = %f\tratio = %f\tset %f\tHDOP = %f\tfix = %f\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, prevSet, gps.HDOP, gps.fixtype);
+ xBee.printf("battery = %f\tpot = %f\tratio = %f\tset %f\tHDOP = %f\tfix = %d\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, prevSet, gps.HDOP, gps.fixtype);
+
+ //toggle lights
+ green = !green;
+ white = !white;
+
+ //reset timer to zero
loopTimer.reset();
}
+
//check to see if data is available on xBee
if(xBee.readable())
{
+
+ //TODO: put this in a function
+
char recChar = xBee.getc();
//change to autonomous mode
@@ -264,6 +303,15 @@
goStop();
mode = 3;
}
+ else if(recChar == '<')
+ {
+ xBee.printf("Power cycling GPS\nPlease wait\n");
+ goStop();
+ ldo = 0;
+ wait(0.5);
+ ldo = 1;
+ wait(0.5);
+ }
else if(recChar == '1')
{
xBee.printf("stop\n");
@@ -344,18 +392,22 @@
/*********************************************************************************************************************************************************************************************/
// autonomous mode
/*********************************************************************************************************************************************************************************************/
-
+ //default trolling motor state when entering autonomous mode is off (user must press "w" to go forward)
if(mode == 1)
{
//check xBee
if(xBee.readable())
{
+ //TODO: put this in a function
+
char recChar = xBee.getc();
+ //stop
if(recChar == '1')
{
xBee.printf("stop\n");
goStop();
}
+ //go forward
if(recChar == 'w')
{
xBee.printf("forward\n");
@@ -381,8 +433,11 @@
polarVector[1] = polarVector[1] - 1;
xBee.printf("reduced angle %f\n", polarVector[1]);
}
+
+ //increments settings based on adjust mode
else if(recChar == '+')
{
+ //adjust waypoint
if(adjustMode == 0)
{
if(wayPtNum != 9)
@@ -395,6 +450,7 @@
xBee.printf("maximum waypoint reached\n");
}
}
+ //increment proportional gain of heading PID
else if(adjustMode == 1)
{
float curKc = headingPID.getPParam();
@@ -404,6 +460,7 @@
headingPID.setTunings(curKc, curTi, curTd);
xBee.printf("Kc set to %f\n", curKc);
}
+ //increment integral gain of heading PID
else if(adjustMode == 2)
{
float curKc = headingPID.getPParam();
@@ -413,6 +470,7 @@
headingPID.setTunings(curKc, curTi, curTd);
xBee.printf("Ti set to %f\n", curTi);
}
+ //increment derivative gain of heading PID
else if(adjustMode == 3)
{
float curKc = headingPID.getPParam();
@@ -423,6 +481,7 @@
xBee.printf("Td set to %f\n", curTd);
}
}
+ //decrements setting based on adjust mode
else if(recChar == '-')
{
if(adjustMode == 0)
@@ -437,6 +496,7 @@
xBee.printf("minimum waypoint reached\n");
}
}
+ //decrement proportional gain of heading PID
else if(adjustMode == 1)
{
float curKc = headingPID.getPParam();
@@ -446,6 +506,7 @@
headingPID.setTunings(curKc, curTi, curTd);
xBee.printf("Kc set to %f\n", curKc);
}
+ //decrement integral gain of heading PID
else if(adjustMode == 2)
{
float curKc = headingPID.getPParam();
@@ -455,6 +516,7 @@
headingPID.setTunings(curKc, curTi, curTd);
xBee.printf("Ti set to %f\n", curTi);
}
+ //decrement derivative gain of heading PID
else if(adjustMode == 3)
{
float curKc = headingPID.getPParam();
@@ -465,7 +527,7 @@
xBee.printf("Td set to %f\n", curTd);
}
}
- //change current waypoint number
+ //change or reset current waypoint number
else if(recChar == 'r')
{
goStop();
@@ -475,64 +537,92 @@
while(!xBee.readable());
char tempWS[2];
tempWS[0] = xBee.getc();
+
+ //press "r" again to reset waypoint number to zero
if(tempWS[0] == 'r')
{
wayPtNum = 0;
}
+
+ //else enter the number of waypoint desired
else
{
sscanf(tempWS, "%d", &wayPtNum);
xBee.printf("waypoint is now %d\n", wayPtNum);
}
}
+ //change adjust mode
else if(recChar == 'p')
{
xBee.printf("To set adjust mode:\nEnter w to adjust waypoint number\nEnter c to adjust Kc\nEnter i to adjust Ti\nEnter d to adjust Td\nEnter z to exit\n");
while(!xBee.readable());
char recCharTemp = xBee.getc();
+
+ //set adjust to edit waypoints
if(recCharTemp == 'w')
{
adjustMode = 0;
}
+
+ //set adjust to edit proportional gain
else if(recCharTemp == 'c')
{
adjustMode = 1;
xBee.printf("Adjust mode set to Kc\tEnter + to increment and - to decrement Kc\n");
}
+
+ //set adjust to edit integral gain
else if(recCharTemp == 'i')
{
adjustMode = 2;
xBee.printf("Adjust mode set to Ti\tEnter + to increment and - to decrement Ti\n");
}
+
+ //set adjust to edit derivative gain
else if(recCharTemp == 'd')
{
adjustMode = 3;
xBee.printf("Adjust mode set to Td\tEnter + to increment and - to decrement Td\n");
}
+ //if any other key is pressed no change to adjust mode is made
else
{
xBee.printf("No changes made\n");
}
}
}
+ //if no xBee data is received
else
{
+
+ //TODO: put this in a function
+
+ //checks to see if all three NEMA sentences from the GPS UART has been received
if(gps.getData())
{
double tempPos[2] = {0,0};
+ //store most recent gps location in a temporary variable (using temporary variables because GPS data is accumulated in a low pass filter)
tempPos[0] = gps.degLat;
tempPos[1] = gps.degLon;
+
+ //calculate the magnitude of the vector
getDist(goalPos[wayPtNum][0],goalPos[wayPtNum][1], tempPos);
+
+ //calculate the angle of the vector
getAngle(goalPos[wayPtNum][0],goalPos[wayPtNum][1], tempPos, 0);
- //xBee.printf("dist %f\tMagDiff %f\tHDOP = %f\n", polarVector[0], magDiff, gps.HDOP);
+ //checks if the magnitude of distance from goal position is less than threshold for "arriving"
if(polarVector[0] <= ARRIVED)
{
xBee.printf("Goal Position %d reached!\n", wayPtNum);
wait(1);
+
+ //increment waypoint number
wayPtNum ++;
- if(wayPtNum >= 6)
+
+ //we only have ten waypoints so we mus stop at ten
+ if(wayPtNum >= 10)
{
xBee.printf("Final Position Reached!\nShutting down\n");
goStop();
@@ -543,27 +633,41 @@
{
//flush heading PID data since we have a new heading
headingPID.reset();
+
+ //calculate the angle of the vector
getAngle(goalPos[wayPtNum ][0],goalPos[wayPtNum][1], goalPos[wayPtNum - 1], 1);
+
xBee.printf("Moving to Goal Position %d\theading = %f\n", wayPtNum, polarVector[1]);
}
}
}
+ //time to read accelerometer?
if(acc.read() >= ACCEL_PERIOD)
{
+ //get accelerometer data
getAccel();
+
+ //reset timer to zero
acc.reset();
}
- //Heading PID
+
+ //time to read magnatometer and calculate heading PID?
if(magn.read() >= MAGN_PERIOD)
{
- getMagn();
- updateAngles();
- filtered = lowPass(yaw, filtered, 0);
- magDiff = whichWay(filtered, 0);
+ //get magnatometer data
+ getMagn(); //IMUDataAndFilters.h
+ updateAngles(); //IMUDataAndFilters.h
+ filtered = lowPass(yaw, filtered, 0); //IMUDataAndFilters.h
+ magDiff = whichWay(filtered, 0); //navigation.h
+
+ //give PID input
headingPID.setProcessValue(-magDiff);
+
+ //get output from PID
curSet = headingPID.compute();
- xBee.printf("ratio = %f\tcurset = %f\theading = %f\tdiff = %f\n", voltRatio, curSet, filtered, magDiff);
+
+ //reset timer to zero
magn.reset();
}
@@ -571,44 +675,68 @@
//This is proportional feedback only
if(loopTimer.read() > RATE)
{
+ //TODO: put this in a function
+
+ //This moves actuator to the requested position
+ //This is proportional feedback ONLY
+
+ //read analog input from wiper on potentiometer on linear actuator
potVoltage = pot.read();
+ //read analog input from battery voltage
batVoltage = battery.read();
- //voltage = voltage * 3.3f;
+ //calculate ratio of the two (using a ratio prevents battery voltage fluctuation from affecting actual position)
voltRatio = potVoltage / batVoltage;
+ //calculate the absolute value of how far off from requested actuator position we are (saves a few processor cycles)
float absDiff = sqrt((curSet - voltRatio) * (curSet - voltRatio));
+
+ //are we off enough to care? if so, stop moving the actuator
if(absDiff <= RATIO_TOLERANCE)
{
turnStop(1.0f, 1.0f);
- xBee.printf("done\n");
+ //xBee.printf("done\n");
}
+ //do we need to turn right?
else if((curSet - voltRatio) >= 0)
{
if(voltRatio > MAX_RATIO)
{
- xBee.printf("Max Limit Reached\n");
+ //xBee.printf("Max Limit Reached\n");
turnStop(1.0f, 1.0f);
}
else
{
turnRight(1.0f, 1.0f);
- xBee.printf("turning Right\n");
+ //xBee.printf("turning Right\n");
}
}
+ //do we need to turn left?
else
{
if(voltRatio < MIN_RATIO)
{
- xBee.printf("Min Limit Reached\n");
+ //xBee.printf("Min Limit Reached\n");
turnStop(1.0f, 1.0f);
}
else
{
turnLeft(1.0f, 1.0f);
- xBee.printf("turning Left\n");
+ //xBee.printf("turning Left\n");
}
}
- //xBee.printf("battery = %f\tpot = %f\tratio = %f\tmotorSpeed = %f\tmoveSpeed %f\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, motorSpeed, moveSpeed);
+
+ //toggle light state
+ green = !green;
+ white = !white;
+
+ xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
+
+ //record data to SD card
+ data = fopen("/sd/data.txt", "a");
+ fprintf(data, "%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n", wayPtNum, (batVoltage * VOLT_MULT), voltRatio, curSet, filtered, magDiff, polarVector[0], gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
+ fclose(data);
+
+ //reset timer to zero
loopTimer.reset();
}
}
@@ -620,7 +748,9 @@
if(mode == 3)
{
+ //stop the trolling motor
goStop();
+
xBee.printf("\nPlease enter position number (0-9), or press y to return to manual mode\n");
while(!xBee.readable());
@@ -634,6 +764,8 @@
}
else
{
+ //TODO: put this in a function
+
xBee.printf("\nFinding most accurate GPS position\nThis will take a few seconds\n\n");
float lowestHDOP = 100;
@@ -654,6 +786,9 @@
}
xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
char tempChar = 'n';
+
+ //first lockup was here
+ //now pressing "1" will break out of while loop
while(!gps.getData() && !(tempChar == '1'))
{
if(xBee.readable())
@@ -667,79 +802,79 @@
{
goalPos[0][0] = curPos[0];
goalPos[0][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '1')
{
goalPos[1][0] = curPos[0];
goalPos[1][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '2')
{
goalPos[2][0] = curPos[0];
goalPos[2][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '3')
{
goalPos[3][0] = curPos[0];
goalPos[3][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '4')
{
goalPos[4][0] = curPos[0];
goalPos[4][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '5')
{
goalPos[5][0] = curPos[0];
goalPos[5][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '6')
{
@@ -750,40 +885,40 @@
{
goalPos[7][0] = curPos[0];
goalPos[7][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '8')
{
goalPos[8][0] = curPos[0];
goalPos[8][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
else if(recChar == '9')
{
goalPos[9][0] = curPos[0];
goalPos[9][1] = curPos[1];
+
//write new coords to SD card
- fr = fopen("/sd/GPS_CORDS.txt", "w+");
-
+ way = fopen("/sd/GPS_CORDS.txt", "w+");
for(int x = 0; x<=9; x++)
{
- fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+ fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
}
- fclose(fr);
+ fclose(way);
}
xBee.printf("position %c updated\t", recChar);
}
@@ -830,7 +965,8 @@
arcLength[1] = EARTHRADIUS * ((goalPos[0] - curPos[0]) * DEGREETORAD);
//X
arcLength[0] = EARTHRADIUS * ((goalPos[1] - curPos[1]) * DEGREETORAD);
-
+
+ //get rid of previous low passed angle data
if(flush)
{
//Use arcTan(x/y) b/c we want our heading to be in respect to North (North = 0 degrees, East = 90 deg, etc.)
@@ -838,6 +974,8 @@
//make negative angles positive
if(polarVector[1] < 0) polarVector[1] = polarVector[1] + 360;
}
+
+ //lowpass filter the angle
else
{
