Skip to content
Snippets Groups Projects
Select Git revision
  • f354993ea9630d77678aef45ab407d3a7be5081d
  • main default protected
  • hpc_school
  • energy
  • openacc
  • mpi_bugfix
6 results

Makefile

Blame
  • SarTests.cpp 5.67 KiB
    #define _USE_MATH_DEFINES
    
    #include "UsgsAstroSarSensorModel.h"
    
    #include "Fixtures.h"
    #include "Warning.h"
    
    #include <gtest/gtest.h>
    #include <nlohmann/json.hpp>
    
    #include <math.h>
    #include <fstream>
    #include <iostream>
    #include <string>
    
    using json = nlohmann::json;
    
    TEST_F(SarSensorModel, stateFromIsd) {
      std::ifstream isdFile("data/orbitalSar.json");
      json isdJson;
      isdFile >> isdJson;
      std::string isdString = isdJson.dump();
      csm::WarningList warnings;
      std::string stateString;
      try {
        stateString = sensorModel->constructStateFromIsd(isdString, &warnings);
      } catch (...) {
        for (auto &warn : warnings) {
          std::cerr << "Warning in " << warn.getFunction() << std::endl;
          std::cerr << "  " << warn.getMessage() << std::endl;
        }
        FAIL() << "constructStateFromIsd errored";
      }
      EXPECT_TRUE(warnings.empty());
    }
    
    TEST_F(SarSensorModel, State) {
      std::string modelState = sensorModel->getModelState();
      EXPECT_NO_THROW(sensorModel->replaceModelState(modelState));
      EXPECT_EQ(sensorModel->getModelState(), modelState);
    }
    
    TEST_F(SarSensorModel, Center) {
      csm::ImageCoord imagePt(500.0, 500.0);
      csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 0.0);
      EXPECT_NEAR(groundPt.x, 1737387.8671710272, 1e-3);
      EXPECT_NEAR(groundPt.y, -5300.6282306119301, 1e-3);
      EXPECT_NEAR(groundPt.z, -3749.9796183814506, 1e-3);
    }
    
    TEST_F(SarSensorModel, GroundToImage) {
      csm::EcefCoord groundPt(1737387.8671710272, -5300.6282306119301, -3749.9796358514604);
      csm::ImageCoord imagePt = sensorModel->groundToImage(groundPt, 0.001);
      EXPECT_NEAR(imagePt.line, 500.0, 1e-3);
      EXPECT_NEAR(imagePt.samp, 500.0, 1e-3);
    }
    
    TEST_F(SarSensorModel, spacecraftPosition) {
      csm::EcefVector position = sensorModel->getSpacecraftPosition(-0.0025);
      EXPECT_NEAR(position.x, 3.73740000e+06, 1e-8);
      EXPECT_NEAR(position.y, 0.00000000e+00, 1e-8);
      EXPECT_NEAR(position.z, 0.00000000e+00, 1e-8);
    }
    
    TEST_F(SarSensorModel, spacecraftVelocity) {
      csm::EcefVector velocity = sensorModel->getSensorVelocity(-0.0025);
      EXPECT_NEAR(velocity.x, 0.00000000e+00, 1e-8);
      EXPECT_NEAR(velocity.y, 0.00000000e+00, 1e-8);
      EXPECT_NEAR(velocity.z, -3.73740000e+06, 1e-8);
    }
    
    TEST_F(SarSensorModel, getRangeCoefficients) {
      std::vector<double> coeffs = sensorModel->getRangeCoefficients(-0.0025);
      EXPECT_NEAR(coeffs[0], 2000000.0, 1e-8);
      EXPECT_NEAR(coeffs[1], 0.0040333608396661775, 1e-8);
      EXPECT_NEAR(coeffs[2], 0.0, 1e-8);
      EXPECT_NEAR(coeffs[3], 0.0, 1e-8);
    }
    
    TEST_F(SarSensorModel, computeGroundPartials) {
      csm::EcefCoord groundPt(1737400.0, 0.0, 0.0);
      std::vector<double> partials = sensorModel->computeGroundPartials(groundPt);
      ASSERT_EQ(partials.size(), 6);
      EXPECT_NEAR(partials[0], 6.5128150576280552e-09, 1e-8);
      EXPECT_NEAR(partials[1], -5.1810407815840636e-15, 1e-8);
      EXPECT_NEAR(partials[2], -0.13333333443071135, 1e-8);
      EXPECT_NEAR(partials[3], -33.057625791698072, 1e-8);
      EXPECT_NEAR(partials[4], 6.1985123841926308e-05, 1e-8);
      EXPECT_NEAR(partials[5], 0.0077565105243007169, 1e-8);
    }
    
    TEST_F(SarSensorModel, imageToProximateImagingLocus) {
      double precision;
      csm::WarningList warnings;
      csm::EcefLocus locus = sensorModel->imageToProximateImagingLocus(
          csm::ImageCoord(500.0, 500.0),
          csm::EcefCoord(1737287.8590770673, -5403.280537826621,
                         -3849.9796183814506),
          0.001,
          &precision,
          &warnings);
      EXPECT_NEAR(locus.point.x, 1737388.1411342232, 1e-2);
      EXPECT_NEAR(locus.point.y, -5403.0102509726485, 1e-2);
      EXPECT_NEAR(locus.point.z, -3749.9801945280433, 1e-2);
      EXPECT_NEAR(locus.direction.x, 0.002701478402694769, 1e-5);
      EXPECT_NEAR(locus.direction.y, -0.9999963509835628, 1e-5);
      EXPECT_NEAR(locus.direction.z, -5.830873570731962e-06, 1e-5);
      EXPECT_LT(precision, 0.001);
      EXPECT_TRUE(warnings.empty());
    }
    
    TEST_F(SarSensorModel, imageToRemoteImagingLocus) {
      double precision;
      csm::WarningList warnings;
      csm::ImageCoord imagePt(500.0, 500.0);
      csm::EcefLocus locus = sensorModel->imageToRemoteImagingLocus(
          imagePt,
          0.001,
          &precision,
          &warnings);
    
      csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 0.0);
      csm::EcefCoord sensorPt = sensorModel->getSensorPosition(imagePt);
    
      double lookX = groundPt.x - sensorPt.x;
      double lookY = groundPt.y - sensorPt.y;
      double lookZ = groundPt.z - sensorPt.z;
      double lookMag = sqrt(lookX * lookX + lookY * lookY + lookZ * lookZ);
      lookX /= lookMag;
      lookY /= lookMag;
      lookZ /= lookMag;
    
      EXPECT_NEAR(locus.direction.x, lookX, 1e-10);
      EXPECT_NEAR(locus.direction.y, lookY, 1e-10);
      EXPECT_NEAR(locus.direction.z, lookZ, 1e-10);
    
      EXPECT_LT(precision, 0.001);
      EXPECT_TRUE(warnings.empty());
    }
    
    TEST_F(SarSensorModel, adjustedPositionVelocity) {
      std::vector<double> adjustments = {1000000.0, 0.2, -10.0,
                                         -20.0,     0.5, 2000000.0};
      csm::EcefCoord sensorPosition = sensorModel->getSensorPosition(0.0);
      csm::EcefVector sensorVelocity = sensorModel->getSensorVelocity(0.0);
      csm::EcefCoord adjPosition =
          sensorModel->getAdjustedSensorPosition(0.0, adjustments);
      csm::EcefVector adjVelocity =
          sensorModel->getAdjustedSensorVelocity(0.0, adjustments);
    
      EXPECT_NEAR(adjPosition.x, sensorPosition.x + adjustments[0], 1e-2);
      EXPECT_NEAR(adjPosition.y, sensorPosition.y + adjustments[1], 1e-2);
      EXPECT_NEAR(adjPosition.z, sensorPosition.z + adjustments[2], 1e-2);
      EXPECT_NEAR(adjVelocity.x, sensorVelocity.x + adjustments[3], 1e-8);
      EXPECT_NEAR(adjVelocity.y, sensorVelocity.y + adjustments[4], 1e-8);
      EXPECT_NEAR(adjVelocity.z, sensorVelocity.z + adjustments[5], 1e-2);
    }
    
    TEST_F(SarSensorModel, ReferenceDateTime) {
      std::string date = sensorModel->getReferenceDateAndTime();
      EXPECT_EQ(date, "2000-01-01T00:00:04Z");
    }