From d8434c15aaae84ead791107ab6c4ebd72442fd5d Mon Sep 17 00:00:00 2001 From: Jesse Mapel <jam826@nau.edu> Date: Thu, 18 Apr 2019 13:58:08 -0700 Subject: [PATCH] Made framer inherit from settable ellipsoid (#228) * Made framer inherit from settable ellipsoid * Added radii tests --- include/usgscsm/UsgsAstroFrameSensorModel.h | 13 ++++++++++++- src/UsgsAstroFrameSensorModel.cpp | 15 +++++++++++++++ tests/FrameCameraTests.cpp | 14 ++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/usgscsm/UsgsAstroFrameSensorModel.h b/include/usgscsm/UsgsAstroFrameSensorModel.h index c07d317..10c4e6c 100644 --- a/include/usgscsm/UsgsAstroFrameSensorModel.h +++ b/include/usgscsm/UsgsAstroFrameSensorModel.h @@ -6,6 +6,7 @@ #include <iostream> #include <vector> #include "RasterGM.h" +#include <SettableEllipsoid.h> #include "CorrelationModel.h" #include "Distortion.h" #include "Utilities.h" @@ -18,7 +19,7 @@ using json = nlohmann::json; -class UsgsAstroFrameSensorModel : public csm::RasterGM { +class UsgsAstroFrameSensorModel : public csm::RasterGM, virtual public csm::SettableEllipsoid { // UsgsAstroFramePlugin needs to access private members friend class UsgsAstroFramePlugin; @@ -288,6 +289,16 @@ class UsgsAstroFrameSensorModel : public csm::RasterGM { // If the argument state string is empty, the model remains unchanged. //< + // Implement methods from the SettableEllipsoid class + + virtual csm::Ellipsoid getEllipsoid() const; + //> This method returns the planetary ellipsoid. + //< + + virtual void setEllipsoid(const csm::Ellipsoid &ellipsoid); + //> This method sets the planetary ellipsoid. + //< + // IMPLEMENT GEOMETRICMODEL PURE VIRTUALS // See GeometricModel.h for documentation virtual csm::EcefCoord getReferencePoint() const; diff --git a/src/UsgsAstroFrameSensorModel.cpp b/src/UsgsAstroFrameSensorModel.cpp index dc27565..86562d2 100644 --- a/src/UsgsAstroFrameSensorModel.cpp +++ b/src/UsgsAstroFrameSensorModel.cpp @@ -1170,6 +1170,21 @@ std::vector<double> UsgsAstroFrameSensorModel::getCrossCovarianceMatrix( } +csm::Ellipsoid UsgsAstroFrameSensorModel::getEllipsoid() const { + MESSAGE_LOG(this->m_logger, "Accessing ellipsoid radii {} {}", + m_majorAxis, m_minorAxis); + return csm::Ellipsoid(m_majorAxis, m_minorAxis); +} + + +void UsgsAstroFrameSensorModel::setEllipsoid(const csm::Ellipsoid &ellipsoid) { + MESSAGE_LOG(this->m_logger, "Setting ellipsoid radii {} {}", + ellipsoid.getSemiMajorRadius(), ellipsoid.getSemiMinorRadius()); + m_majorAxis = ellipsoid.getSemiMajorRadius(); + m_minorAxis = ellipsoid.getSemiMinorRadius(); +} + + void UsgsAstroFrameSensorModel::calcRotationMatrix( double m[3][3]) const { MESSAGE_LOG(this->m_logger, "Calculating rotation matrix"); diff --git a/tests/FrameCameraTests.cpp b/tests/FrameCameraTests.cpp index 31fd953..3b49b67 100644 --- a/tests/FrameCameraTests.cpp +++ b/tests/FrameCameraTests.cpp @@ -95,6 +95,20 @@ TEST_F(OrbitalFrameSensorModel, Center) { EXPECT_DOUBLE_EQ(groundPt.z, 0); } +TEST_F(FrameSensorModel, Radii) { + csm::Ellipsoid ellipsoid = sensorModel->getEllipsoid(); + EXPECT_DOUBLE_EQ(ellipsoid.getSemiMajorRadius(), 10); + EXPECT_DOUBLE_EQ(ellipsoid.getSemiMinorRadius(), 10); +} + +TEST_F(FrameSensorModel, SetRadii) { + csm::Ellipsoid ellipsoid1(1000, 1500); + sensorModel->setEllipsoid(ellipsoid1); + csm::Ellipsoid ellipsoid2 = sensorModel->getEllipsoid(); + EXPECT_DOUBLE_EQ(ellipsoid2.getSemiMajorRadius(), 1000); + EXPECT_DOUBLE_EQ(ellipsoid2.getSemiMinorRadius(), 1500); +} + TEST_F(OrbitalFrameSensorModel, GroundPartials) { csm::EcefCoord groundPt(1000000.0, 0.0, 0.0); std::vector<double> partials = sensorModel->computeGroundPartials(groundPt); -- GitLab