diff --git a/tests/Fixtures.h b/tests/Fixtures.h index e372b123409522db1c5615d6a43febbb33a7d82d..fdba2fc54e50406cf1e3a32e1c2b9dd36ea88cbc 100644 --- a/tests/Fixtures.h +++ b/tests/Fixtures.h @@ -200,6 +200,33 @@ class ConstAngularVelocityLineScanSensorModel : public ::testing::Test { } }; +class OrbitalLineScanSensorModel : public ::testing::Test { + protected: + csm::Isd isd; + UsgsAstroLsSensorModel *sensorModel; + + void SetUp() override { + sensorModel = NULL; + + isd.setFilename("data/orbitalLineScan.img"); + UsgsAstroPlugin cameraPlugin; + + csm::Model *model = cameraPlugin.constructModelFromISD( + isd, + "USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL"); + sensorModel = dynamic_cast<UsgsAstroLsSensorModel *>(model); + + ASSERT_NE(sensorModel, nullptr); + } + + void TearDown() override { + if (sensorModel) { + delete sensorModel; + sensorModel = NULL; + } + } +}; + #endif diff --git a/tests/LineScanCameraTests.cpp b/tests/LineScanCameraTests.cpp index e5d2876d344cca18acf49a71e9011c549a6c9867..f365d9673a513dcbd2d107968ef7373a4a74c357 100644 --- a/tests/LineScanCameraTests.cpp +++ b/tests/LineScanCameraTests.cpp @@ -121,3 +121,60 @@ TEST_F(ConstVelocityLineScanSensorModel, calculateAttitudeCorrection) { EXPECT_NEAR(attCorr[7], 0, 1e-8); EXPECT_NEAR(attCorr[8], 0, 1e-8); } + +TEST_F(OrbitalLineScanSensorModel, Center) { + csm::ImageCoord imagePt(8.5, 8.0); + csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 0.0); + EXPECT_DOUBLE_EQ(groundPt.x, 999999.680000017); + EXPECT_DOUBLE_EQ(groundPt.y, 0.0); + EXPECT_DOUBLE_EQ(groundPt.z, -799.99991466668735); +} + +TEST_F(OrbitalLineScanSensorModel, Inversion) { + for (double line = 0.5; line < 16; line++) { + csm::ImageCoord imagePt(line, 8); + csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 0.0); + csm::ImageCoord imageReprojPt = sensorModel->groundToImage(groundPt); + + // groundToImage has a default precision of 0.001m and each pixel is 100m + // so we should be within 0.1 pixels + EXPECT_NEAR(imagePt.line, imageReprojPt.line, 0.1); + EXPECT_NEAR(imagePt.samp, imageReprojPt.samp, 0.1); + } +} + +TEST_F(OrbitalLineScanSensorModel, ImageToGroundHeight) { + csm::ImageCoord imagePt(8.5, 8); + csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 100.0); + double height = sqrt(groundPt.x*groundPt.x + + groundPt.y*groundPt.y + + groundPt.z*groundPt.z); + + EXPECT_DOUBLE_EQ(height, 1000100); +} + +TEST_F(OrbitalLineScanSensorModel, InversionHeight) { + for (double line = 0.5; line < 16; line++) { + csm::ImageCoord imagePt(line, 8); + csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 100.0); + csm::ImageCoord imageReprojPt = sensorModel->groundToImage(groundPt); + + // groundToImage has a default precision of 0.001m and each pixel is 100m + // so we should be within 0.1 pixels + EXPECT_NEAR(imagePt.line, imageReprojPt.line, 0.1); + EXPECT_NEAR(imagePt.samp, imageReprojPt.samp, 0.1); + } +} + +TEST_F(OrbitalLineScanSensorModel, InversionReallyHigh) { + for (double line = 0.5; line < 16; line++) { + csm::ImageCoord imagePt(line, 8); + csm::EcefCoord groundPt = sensorModel->imageToGround(imagePt, 49000.0); + csm::ImageCoord imageReprojPt = sensorModel->groundToImage(groundPt); + + // groundToImage has a default precision of 0.001m and each pixel is 2m + // so we should be within 0.002 pixels + EXPECT_NEAR(imagePt.line, imageReprojPt.line, 0.002); + EXPECT_NEAR(imagePt.samp, imageReprojPt.samp, 0.002); + } +} diff --git a/tests/data/orbitalLineScan.json b/tests/data/orbitalLineScan.json new file mode 100644 index 0000000000000000000000000000000000000000..c51d32147dc350c1b2ccf738e83a03d7653b5399 --- /dev/null +++ b/tests/data/orbitalLineScan.json @@ -0,0 +1,113 @@ +{ + "name_model" : "USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL", + "name_platform" : "TEST_PLATFORM", + "name_sensor" : "TEST_SENSOR", + "center_ephemeris_time": 1000.0, + "starting_ephemeris_time": 999.2, + "line_scan_rate": [ + [0.5, -0.8, 0.1] + ], + "detector_sample_summing": 1, + "detector_line_summing": 1, + "t0_ephemeris": -0.8, + "dt_ephemeris": 0.1, + "t0_quaternion": -0.8, + "dt_quaternion": 0.1, + "focal2pixel_lines": [0.0, 10.0, 0.0], + "focal2pixel_samples": [0.0, 0.0, 10.0], + "focal_length_model": { + "focal_length": 50 + }, + "image_lines": 16, + "image_samples": 16, + "detector_center" : { + "line" : 0.5, + "sample" : 8.0 + }, + "interpolation_method": "lagrange", + "optical_distortion": { + "radial": { + "coefficients": [0.0, 0.0, 0.0] + } + }, + "radii": { + "semimajor": 1000, + "semiminor": 1000, + "unit":"km" + }, + "reference_height": { + "maxheight": 1000, + "minheight": -1000, + "unit": "m" + }, + "sensor_position": { + "unit": "km", + "positions": [ + [1050.0, 0.0, 0.0], + [1049.99999475, 0.0, -0.104999999825], + [1049.9999790000002, 0.0, -0.2099999986], + [1049.9999527500004, 0.0, -0.3149999952750001], + [1049.9999160000013, 0.0, -0.4199999888000002], + [1049.9998687500029, 0.0, -0.5249999781250003], + [1049.9998110000056, 0.0, -0.6299999622000008], + [1049.9997427500105, 0.0, -0.7349999399750016], + [1049.999664000018, 0.0, -0.839999910400003], + [1049.9995747500286, 0.0, -0.9449998724250054], + [1049.999475000044, 0.0, -1.049999825000009], + [1049.999364750064, 0.0, -1.1549997670750143], + [1049.9992440000908, 0.0, -1.259999697600022], + [1049.9991127501248, 0.0, -1.3649996155250328], + [1049.9989710001682, 0.0, -1.4699995198000473], + [1049.9988187502213, 0.0, -1.5749994093750666] + ], + "velocities": [ + [ 0.0, 0.0, -1.0], + [-0.0000999999998333, 0.0, -0.999999995], + [-0.0001999999986667, 0.0, -0.9999999800000001], + [-0.0002999999955, 0.0, -0.9999999550000004], + [-0.0003999999893333, 0.0, -0.9999999200000013], + [-0.0004999999791667, 0.0, -0.9999998750000026], + [-0.000599999964, 0.0, -0.9999998200000054], + [-0.0006999999428333, 0.0, -0.9999997550000099], + [-0.0007999999146667, 0.0, -0.999999680000017], + [-0.0008999998785, 0.0, -0.9999995950000273], + [-0.0009999998333333, 0.0, -0.9999995000000418], + [-0.0010999997781667, 0.0, -0.999999395000061], + [-0.001199999712, 0.0, -0.9999992800000864], + [-0.0012999996338334, 0.0, -0.9999991550001189], + [-0.0013999995426667, 0.0, -0.9999990200001602], + [-0.0014999994375001, 0.0, -0.9999988750002108] + ] + }, + "sensor_orientation": { + "quaternions": [ + [0.0, 0.707106781186547, 0, 0.707106781186547], + [0.0, 0.70707142496362, 0, -0.707142135641709], + [0.0, 0.707036066973013, 0, -0.707177488329014], + [0.0, 0.707000707214816, 0, -0.707212839248377], + [0.0, 0.706965345689117, 0, -0.707248188399706], + [0.0, 0.706929982396005, 0, -0.707283535782916], + [0.0, 0.706894617335569, 0, -0.707318881397917], + [0.0, 0.706859250507895, 0, -0.70735422524462], + [0.0, 0.706823881913074, 0, -0.707389567322938], + [0.0, 0.706788511551192, 0, -0.707424907632782], + [0.0, 0.70675313942234, 0, -0.707460246174064], + [0.0, 0.706717765526604, 0, -0.707495582946695], + [0.0, 0.706682389864075, 0, -0.707530917950587], + [0.0, 0.706647012434839, 0, -0.707566251185652], + [0.0, 0.706611633238985, 0, -0.707601582651801], + [0.0, 0.706576252276603, 0, -0.707636912348946] + ] + }, + "starting_detector_line": 0, + "starting_detector_sample": 0, + "sun_position": { + "positions": [ + [100.0, 100.0, 0.0] + ], + "velocities": [ + [0.0, 0.0, 0.0] + ], + "unit": "m" + } +}