2017-02-03 5 views
1

現在、gpsモジュールから読み込みを行い、これらを使って測定値と固定ウェイポイントの距離を計算する必要があるプロジェクトに参加しています。 Gpsは動作し、LAT - 54.9289とLON - -1.368の値を与えます。これは約3200メートルの距離を与えます。しかし、それは約6105を与える。私はまた、6105はハハにkmであるという気持ちがある。私は、負の数を正しく取っていないかどうか、または私はコードにいくつかの変数の競合があるかどうか疑問に思っています。これに光を当てると、すばらしいことになります、ありがとう。Haversine公式エラー - 間違った距離 - Arduino

#include <TinyGPS.h> 
#include <SoftwareSerial.h> 
#include <rgb_lcd.h> 
#include <Wire.h> 

//Sets TX And RX Pins 
SoftwareSerial GPS(2,3); 
TinyGPS gps; 
void gpsdump(TinyGPS &gps); 
bool feedgps(); 
void CheckGPS(); 
void GetCoords(); 
long lat, lon; 
float LAT, LON; // Latitude is gained from GPS and stored in another variable to avoid errors - Should change with changing GPS value - Which would alter distance to waypoint. 
float LAT1,LON1; 
rgb_lcd lcd; 


void setup() 
{ 
// Sets Baud Rate 
    GPS.begin(9600); 
    Serial.begin(115200); 
} 
// Determines The Distance Between Current Location And Waypoint 

void GetDistance() 
{ 
    // Calculating Distance Between Waypoints 

    double Distance_Lat; // Distance between Lattitude values 
    double Distance_Lon; // Distance between Lonitude values 
    double Distance_Total = 0;// Total Distance 
    double val,val2; // Subsidary variable for holding numbers. - No actual value represented. 
    double fLAT1,fLAT2; 
    double LAT2 = 54.900000; // Waypoint Latitude 
    double LON2 = -1.368072; // Waypoint Longitude 

// Initialising Calculation 
    Distance_Lat = radians(LAT2-LAT1); // Must be done in radians 
    fLAT1 = radians(LAT1); 
    fLAT2 = radians(LAT2); 
    Distance_Lon = radians((LON2)-(LON1)); 

    // Calculating Distance - Using Haversines Formulae 
    Distance_Total = (sin(Distance_Lat/2.0)*sin(Distance_Lat/2.0)); 
    val = cos(fLAT1); 
    val = val*(cos(fLAT2)); 
    val = val*(sin(Distance_Lon/2.0)); 
    val = val*(sin(Distance_Lon/2.0)); 
    Distance_Total = Distance_Total + val; 

    Distance_Total = 2*atan2(sqrt(Distance_Total),sqrt(1.0-Distance_Total)); 
    Distance_Total = Distance_Total*6371.0000; // Converting to meters. 
Serial.println("Distance: "); 
Serial.println(Distance_Total); 

    //--------------------------------------------------------------------------------- 
} 

// Returns Latitude And Longitude As Decimal Degrees (DD). 
void GetCoords() 
{ 
long lat, lon; 
    CheckGPS(); 
    Serial.print("Latitude : "); 
    Serial.print(LAT/1000000,7); 
    Serial.print(" :: Longitude : "); 
    Serial.println(LON/1000000,7); 

} 

void CheckGPS() 

    { 
    bool newdata = false; 
    unsigned long start = millis(); 
// Every 1 seconds, Print an update 
    while (millis() - start < 1000) 
    { 
    if (feedgps()) 
    newdata = true; 
    if (newdata) 
    gpsdump(gps); 
    } 
    } 

// Checks If The GPS Has Any Data To Transmit 
    bool feedgps() 
    { 
    while (GPS.available()) 
    if (gps.encode(GPS.read())) 
     return true; 
    else 
     return false; 
    } 

// Transmits GPS Data And Gets Latitude And Longitude Positions. 
    void gpsdump(TinyGPS &gps) 

{ gps.get_position(&lat, &lon); 
    LAT = lat; 
    LON = lon; 
    //Keeps The GPS Fed To Avoid Checksum Errors. 
    feedgps(); 

} 

void loop() 
{ 
// Function That Returns The GPS Coordinates In DD. 
    GetCoords(); 
    GetDistance(); 
} 

答えて

1

私は今ではウィキペディア上で探しています半正矢式、https://en.wikipedia.org/wiki/Haversine_formulaは、アークサインがある(SQRT(DISTANCE_TOTAL))あなたはatan2を持っています。

+0

ありがとうございました、私は今、3052.94の値を受け取っているので、これは問題であったと思います。 – user7511905

関連する問題