Skip to content
Snippets Groups Projects
Commit f47e15a1 authored by Kristin's avatar Kristin Committed by GitHub
Browse files

Add code to States to not interpolate if an exact solution exists (#374)

* Update format of range conversion coefficients isd output to include a separate list for times. Also update driver, test data, and remove unneeded semicolons

* Fix documentaion error

* fix other documentation error

* Add code to states to not interpolate if there is already an exact value for a time (solves divide by 0 error in interpolation code.)

* Updated to be more efficient

* lower_bound can also return the last elt. don't do that

* Added test for when no interpolation is needed for getState
parent 64181b20
No related branches found
No related tags found
No related merge requests found
...@@ -111,6 +111,16 @@ namespace ale { ...@@ -111,6 +111,16 @@ namespace ale {
State States::getState(double time, PositionInterpolation interp) const { State States::getState(double time, PositionInterpolation interp) const {
// If time is in times, don't need to interpolate!
auto candidate_time = std::lower_bound(m_ephemTimes.begin(), m_ephemTimes.end(), time);
if ( (candidate_time != m_ephemTimes.end()) && (*candidate_time == time) ) {
int index = std::distance(m_ephemTimes.begin(), candidate_time);
return m_states[index];
}
if (m_ephemTimes.size() > 1) { if (m_ephemTimes.size() > 1) {
int lowerBound = interpolationIndex(m_ephemTimes, time); int lowerBound = interpolationIndex(m_ephemTimes, time);
// try to copy the surrounding 8 points as that's the most possibly needed // try to copy the surrounding 8 points as that's the most possibly needed
...@@ -132,7 +142,6 @@ namespace ale { ...@@ -132,7 +142,6 @@ namespace ale {
} }
Vec3d position, velocity; Vec3d position, velocity;
if ( interp == LINEAR || (interp == SPLINE && !hasVelocity())) { if ( interp == LINEAR || (interp == SPLINE && !hasVelocity())) {
position = {interpolate(xs, interpTimes, time, interp, 0), position = {interpolate(xs, interpTimes, time, interp, 0),
interpolate(ys, interpTimes, time, interp, 0), interpolate(ys, interpTimes, time, interp, 0),
...@@ -145,7 +154,6 @@ namespace ale { ...@@ -145,7 +154,6 @@ namespace ale {
else if (interp == SPLINE && hasVelocity()){ else if (interp == SPLINE && hasVelocity()){
// Do hermite spline if velocities are available // Do hermite spline if velocities are available
double baseTime = (interpTimes.front() + interpTimes.back()) / 2; double baseTime = (interpTimes.front() + interpTimes.back()) / 2;
std::vector<double> scaledEphemTimes; std::vector<double> scaledEphemTimes;
for(unsigned int i = 0; i < interpTimes.size(); i++) { for(unsigned int i = 0; i < interpTimes.size(); i++) {
scaledEphemTimes.push_back(interpTimes[i] - baseTime); scaledEphemTimes.push_back(interpTimes[i] - baseTime);
...@@ -169,7 +177,7 @@ namespace ale { ...@@ -169,7 +177,7 @@ namespace ale {
return State(position, velocity); return State(position, velocity);
} }
else { // Here we have: only 1 time and 1 state, so just return the only state. else { // Here we have: only 1 time and 1 state, so just return the only state.
return State(m_states[0]); return m_states[0];
} }
} }
......
...@@ -347,6 +347,31 @@ TEST(StatesTest, OneStateWithVelocity) { ...@@ -347,6 +347,31 @@ TEST(StatesTest, OneStateWithVelocity) {
EXPECT_NEAR(result.velocity.z, -1.0, 1e-6); EXPECT_NEAR(result.velocity.z, -1.0, 1e-6);
} }
TEST(StatesTest, NoInterpNeeded) {
std::vector<double> ephemTimes = {0.0, 1.0, 2.0};
std::vector<Vec3d> positions = {
Vec3d(5.0, 3.0, 0.0),
Vec3d(6.5, 4.0, 1.0),
Vec3d(15.0, 4.0, 5.0)};
std::vector<Vec3d> velocities = {
Vec3d(5.0, 3.0, 0.0),
Vec3d(7.0, 6.0, 1.0),
Vec3d(15.0, 4.0, 5.0)};
States testState(ephemTimes, positions, velocities);
State result = testState.getState(1.0);
EXPECT_NEAR(result.position.x, 6.5, 1e-5);
EXPECT_NEAR(result.position.y, 4.0, 1e-4);
EXPECT_NEAR(result.position.z, 1.0, 1e-5);
EXPECT_NEAR(result.velocity.x, 7.0, 1e-6);
EXPECT_NEAR(result.velocity.y, 6.0, 1e-6);
EXPECT_NEAR(result.velocity.z, 1.0, 1e-6);
}
// This test checks to see if the minimized cache looks identical to ISIS's minimized cache for // This test checks to see if the minimized cache looks identical to ISIS's minimized cache for
// a Dawn IR image VIR_IR_1A_1_362681634_1 (located in dawnvir2isis's IR app test.) // a Dawn IR image VIR_IR_1A_1_362681634_1 (located in dawnvir2isis's IR app test.)
// Values were obtained by adding strategic couts to SpicePosition.cpp, running spiceinit, and // Values were obtained by adding strategic couts to SpicePosition.cpp, running spiceinit, and
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment