Skip to content
Snippets Groups Projects
Unverified Commit b4be6e0d authored by Oleg Alexandrov's avatar Oleg Alexandrov Committed by GitHub
Browse files

SAR model: Fix an infinite loop issue (#382)

* SAR model: Fix an infinite loop issue

* Add note that convergence may not be in one step for a nonspherical datum
parent 41152a2b
No related branches found
No related tags found
No related merge requests found
...@@ -524,12 +524,16 @@ csm::EcefCoord UsgsAstroSarSensorModel::imageToGround( ...@@ -524,12 +524,16 @@ csm::EcefCoord UsgsAstroSarSensorModel::imageToGround(
// The cross-track unit vector is orthogonal to the position so we ignore it // The cross-track unit vector is orthogonal to the position so we ignore it
double nadirComp = dot(spacecraftPosition, tHat); double nadirComp = dot(spacecraftPosition, tHat);
// Iterate to find proper radius value // Iterate to find proper radius value. Limit the number of iterations
// because the desired precision may not drop beyond 1e-10 no matter
// how many iterations one does. As it was observed, this in fact
// converges at the first iteration; this is expected for a spherical
// datum and not for an ellipsoidal one.
double pointRadius = m_majorAxis + height; double pointRadius = m_majorAxis + height;
double radiusSqr; double radiusSqr;
double pointHeight; double pointHeight;
csm::EcefVector groundVec; csm::EcefVector groundVec;
do { for (int it = 0; it < 10; it++) {
radiusSqr = pointRadius * pointRadius; radiusSqr = pointRadius * pointRadius;
double alpha = double alpha =
(radiusSqr - slantRange * slantRange - positionMag * positionMag) / (radiusSqr - slantRange * slantRange - positionMag * positionMag) /
...@@ -542,7 +546,10 @@ csm::EcefCoord UsgsAstroSarSensorModel::imageToGround( ...@@ -542,7 +546,10 @@ csm::EcefCoord UsgsAstroSarSensorModel::imageToGround(
pointHeight = computeEllipsoidElevation( pointHeight = computeEllipsoidElevation(
groundVec.x, groundVec.y, groundVec.z, m_majorAxis, m_minorAxis); groundVec.x, groundVec.y, groundVec.z, m_majorAxis, m_minorAxis);
pointRadius -= (pointHeight - height); pointRadius -= (pointHeight - height);
} while (fabs(pointHeight - height) > desiredPrecision);
if (fabs(pointHeight - height) <= desiredPrecision)
break;
}
if (achievedPrecision) { if (achievedPrecision) {
*achievedPrecision = fabs(pointHeight - height); *achievedPrecision = fabs(pointHeight - height);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment