diff --git a/include/usgscsm/UsgsAstroFrameSensorModel.h b/include/usgscsm/UsgsAstroFrameSensorModel.h index c07d317a3e85afdc366cd76c30153c8b745bdba3..10c4e6c3953dbf7c5f9ec44b15914d71f7ffb608 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 dc27565c7b76d4cb6aec3c9fb4a887ce3ff44eda..86562d2d1e269af57eb57e09730a92acda977e75 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 31fd953646f4f77d240218d3c5b22ee31011f267..3b49b67dbda2a51259708811b8d35f13e6dbf8c7 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);