diff --git a/gtsam/navigation/tests/testGeographicLib.cpp b/gtsam/navigation/tests/testGeographicLib.cpp index c8b18f013..44964c569 100644 --- a/gtsam/navigation/tests/testGeographicLib.cpp +++ b/gtsam/navigation/tests/testGeographicLib.cpp @@ -17,6 +17,8 @@ #include #include +#include + #include #include @@ -26,7 +28,7 @@ using namespace std; using namespace GeographicLib; // Dekalb-Peachtree Airport runway 2L -double lat = 33.87071, lon = -84.30482000000001, h = 274; +const double lat = 33.87071, lon = -84.30482, h = 274; //************************************************************************** TEST( GeographicLib, Geocentric) { @@ -63,6 +65,36 @@ TEST( GeographicLib, UTM) { EXPECT_DOUBLES_EQUAL(3751090.08, y, 1e-2); } +//************************************************************************** +TEST( GeographicLib, ENU) { + + const Geocentric& earth = Geocentric::WGS84; + + // ENU Origin is where the plane was in hold next to runway + const double lat0 = 33.86998, lon0 = -84.30626, h0 = 274; + LocalCartesian enu(lat0, lon0, h0, earth); + + // From lat-lon to geocentric + double E, N, U; + enu.Forward(lat0, lon0, h0, E, N, U); + EXPECT_DOUBLES_EQUAL(0, E, 1e-2); + EXPECT_DOUBLES_EQUAL(0, N, 1e-2); + EXPECT_DOUBLES_EQUAL(0, U, 1e-2); + + // From lat-lon to geocentric + enu.Forward(lat, lon, h, E, N, U); + EXPECT_DOUBLES_EQUAL(133.24, E, 1e-2); + EXPECT_DOUBLES_EQUAL(80.98, N, 1e-2); + EXPECT_DOUBLES_EQUAL(0, U, 1e-2); + + // From geocentric to lat-lon + double lat_, lon_, h_; + enu.Reverse(E, N, U, lat_, lon_, h_); + EXPECT_DOUBLES_EQUAL(lat, lat_, 1e-5); + EXPECT_DOUBLES_EQUAL(lon, lon_, 1e-5); + EXPECT_DOUBLES_EQUAL(h, h_, 1e-5); +} + //************************************************************************** int main() { TestResult tr;