From 2b67411d2c8098aeff1c81c576c67647cb17c9b6 Mon Sep 17 00:00:00 2001 From: Jesse Mapel <jmapel@usgs.gov> Date: Mon, 15 Apr 2019 12:02:17 -0700 Subject: [PATCH] Recompute pixel size each time partials are computed --- include/usgscsm/UsgsAstroFrameSensorModel.h | 1 - src/UsgsAstroFrameSensorModel.cpp | 32 ++++++++++----------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/include/usgscsm/UsgsAstroFrameSensorModel.h b/include/usgscsm/UsgsAstroFrameSensorModel.h index c140d1e..c07d317 100644 --- a/include/usgscsm/UsgsAstroFrameSensorModel.h +++ b/include/usgscsm/UsgsAstroFrameSensorModel.h @@ -363,7 +363,6 @@ class UsgsAstroFrameSensorModel : public csm::RasterGM { int m_nParameters; csm::EcefCoord m_referencePointXyz; - double m_pixelGroundSize; std::string m_logFile; std::shared_ptr<spdlog::logger> m_logger; diff --git a/src/UsgsAstroFrameSensorModel.cpp b/src/UsgsAstroFrameSensorModel.cpp index 477361f..8db8884 100644 --- a/src/UsgsAstroFrameSensorModel.cpp +++ b/src/UsgsAstroFrameSensorModel.cpp @@ -77,7 +77,6 @@ void UsgsAstroFrameSensorModel::reset() { m_referencePointXyz.x = 0; m_referencePointXyz.y = 0; m_referencePointXyz.z = 0; - m_pixelGroundSize = 1.0; m_logFile = ""; m_logger.reset(); } @@ -563,17 +562,23 @@ std::vector<double> UsgsAstroFrameSensorModel::computeGroundPartials(const csm:: double z = groundPt.z; csm::ImageCoord ipB = groundToImage(groundPt); - csm::ImageCoord ipX = groundToImage(csm::EcefCoord(x + m_pixelGroundSize, y, z)); - csm::ImageCoord ipY = groundToImage(csm::EcefCoord(x, y + m_pixelGroundSize, z)); - csm::ImageCoord ipZ = groundToImage(csm::EcefCoord(x, y, z + m_pixelGroundSize)); + csm::EcefCoord nextPoint = imageToGround(csm::ImageCoord(ipB.line + 1, ipB.samp + 1)); + double dx = nextPoint.x - x; + double dy = nextPoint.y - y; + double dz = nextPoint.z - z; + double pixelGroundSize = sqrt((dx*dx + dy*dy + dz*dz) / 2.0); + + csm::ImageCoord ipX = groundToImage(csm::EcefCoord(x + pixelGroundSize, y, z)); + csm::ImageCoord ipY = groundToImage(csm::EcefCoord(x, y + pixelGroundSize, z)); + csm::ImageCoord ipZ = groundToImage(csm::EcefCoord(x, y, z + pixelGroundSize)); std::vector<double> partials(6, 0.0); - partials[0] = (ipX.line - ipB.line) / m_pixelGroundSize; - partials[3] = (ipX.samp - ipB.samp) / m_pixelGroundSize; - partials[1] = (ipY.line - ipB.line) / m_pixelGroundSize; - partials[4] = (ipY.samp - ipB.samp) / m_pixelGroundSize; - partials[2] = (ipZ.line - ipB.line) / m_pixelGroundSize; - partials[5] = (ipZ.samp - ipB.samp) / m_pixelGroundSize; + partials[0] = (ipX.line - ipB.line) / pixelGroundSize; + partials[3] = (ipX.samp - ipB.samp) / pixelGroundSize; + partials[1] = (ipY.line - ipB.line) / pixelGroundSize; + partials[4] = (ipY.samp - ipB.samp) / pixelGroundSize; + partials[2] = (ipZ.line - ipB.line) / pixelGroundSize; + partials[5] = (ipZ.samp - ipB.samp) / pixelGroundSize; MESSAGE_LOG(this->m_logger, "Computing ground partials results:\nLine: {}, {}, {}\nSample: {}, {}, {}", partials[0], partials[1], partials[2], partials[3], partials[4], partials[5]); @@ -716,7 +721,6 @@ std::string UsgsAstroFrameSensorModel::getModelState() const { {"m_referencePointXyz", {m_referencePointXyz.x, m_referencePointXyz.y, m_referencePointXyz.z}}, - {"m_pixelGroundSize", m_pixelGroundSize}, {"m_currentParameterCovariance", m_currentParameterCovariance}, {"m_logFile", m_logFile} }; @@ -831,12 +835,6 @@ void UsgsAstroFrameSensorModel::replaceModelState(const std::string& stringState m_collectionIdentifier = state.at("m_collectionIdentifier").get<std::string>(); // Set reference point to the center of the image m_referencePointXyz = imageToGround(csm::ImageCoord(m_nLines/2.0, m_nSamples/2.0)); - // Compute the pixel ground size at the reference point - csm::EcefCoord nextRefPoint = imageToGround(csm::ImageCoord(m_nLines/2.0 + 1, m_nSamples/2.0 + 1)); - double dx = nextRefPoint.x - m_referencePointXyz.x; - double dy = nextRefPoint.y - m_referencePointXyz.y; - double dz = nextRefPoint.z - m_referencePointXyz.z; - m_pixelGroundSize = sqrt((dx*dx + dy*dy + dz*dz) / 2.0); m_currentParameterCovariance = state.at("m_currentParameterCovariance").get<std::vector<double>>(); m_logFile = state.at("m_logFile").get<std::string>(); if (m_logFile.empty()) { -- GitLab