Skip to content

Commit f3d464d

Browse files
committed
fix: profile inertial frame use and target velocity computation
1 parent e6f1964 commit f3d464d

File tree

1 file changed

+37
-26
lines changed

1 file changed

+37
-26
lines changed

src/OpenSpaceToolkit/Astrodynamics/Flight/Profile.cpp

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ using DynamicProvider = ostk::physics::coordinate::frame::provider::Dynamic;
3131

3232
using TransformModel = ostk::astrodynamics::flight::profile::model::Transform;
3333

34+
static Shared<const Frame> DEFAULT_ECI_FRAME = Frame::GCRF();
35+
static Shared<const Frame> DEFAULT_ECEF_FRAME = Frame::ITRF();
36+
3437
Profile::Target::Target(const TargetType& aType, const Axis& anAxis, const bool& isAntiDirection)
3538
: type(aType),
3639
axis(anAxis),
@@ -284,21 +287,21 @@ Profile Profile::CustomPointing(
284287
// Copy the orbit and orientation generator to avoid dangling references.
285288
auto dynamicProviderGenerator = [anOrbit, anOrientationGenerator](const Instant& anInstant) -> Transform
286289
{
287-
const State state = anOrbit.getStateAt(anInstant);
290+
const State state = anOrbit.getStateAt(anInstant).inFrame(DEFAULT_ECI_FRAME);
288291

289-
const Position position_GCRF = state.getPosition();
290-
const Velocity velocity_GCRF = state.getVelocity();
292+
const Position position = state.getPosition();
293+
const Velocity velocity = state.getVelocity();
291294

292295
return Transform::Active(
293296
anInstant,
294-
-position_GCRF.accessCoordinates(),
295-
-velocity_GCRF.accessCoordinates(),
297+
-position.accessCoordinates(),
298+
-velocity.accessCoordinates(),
296299
anOrientationGenerator(state),
297300
Vector3d(0.0, 0.0, 0.0) // TBM: Artificially set to 0 for now.
298301
);
299302
};
300303

301-
return Profile(TransformModel(DynamicProvider(dynamicProviderGenerator), Frame::GCRF()));
304+
return Profile(TransformModel(DynamicProvider(dynamicProviderGenerator), DEFAULT_ECI_FRAME));
302305
}
303306

304307
std::function<Quaternion(const State&)> Profile::AlignAndConstrain(
@@ -440,15 +443,17 @@ Profile::Profile()
440443

441444
Vector3d Profile::ComputeGeocentricNadirDirectionVector(const State& aState)
442445
{
443-
return -aState.getPosition().accessCoordinates().normalized();
446+
return -aState.inFrame(DEFAULT_ECI_FRAME).getPosition().accessCoordinates().normalized();
444447
}
445448

446449
Vector3d Profile::ComputeGeodeticNadirDirectionVector(const State& aState)
447450
{
448-
const Transform ITRF_GCRF_transform = Frame::ITRF()->getTransformTo(Frame::GCRF(), aState.accessInstant());
451+
const Transform ITRF_GCRF_transform = DEFAULT_ECEF_FRAME->getTransformTo(DEFAULT_ECI_FRAME, aState.accessInstant());
449452

450453
const LLA lla = LLA::Cartesian(
451-
ITRF_GCRF_transform.getInverse().applyToPosition(aState.getPosition().accessCoordinates()),
454+
ITRF_GCRF_transform.getInverse().applyToPosition(
455+
aState.inFrame(DEFAULT_ECI_FRAME).getPosition().accessCoordinates()
456+
),
452457
EarthGravitationalModel::EGM2008.equatorialRadius_,
453458
EarthGravitationalModel::EGM2008.flattening_
454459
);
@@ -465,46 +470,51 @@ Vector3d Profile::ComputeGeodeticNadirDirectionVector(const State& aState)
465470
Vector3d Profile::ComputeTargetDirectionVector(const State& aState, const ostk::astrodynamics::Trajectory& aTrajectory)
466471
{
467472
const Vector3d targetPositionCoordinates =
468-
aTrajectory.getStateAt(aState.accessInstant()).inFrame(Frame::GCRF()).getPosition().accessCoordinates();
469-
const Vector3d satellitePositionCoordinates = aState.getPosition().accessCoordinates();
473+
aTrajectory.getStateAt(aState.accessInstant()).inFrame(DEFAULT_ECI_FRAME).getPosition().accessCoordinates();
474+
const Vector3d satellitePositionCoordinates = aState.inFrame(DEFAULT_ECI_FRAME).getPosition().accessCoordinates();
470475

471476
return (targetPositionCoordinates - satellitePositionCoordinates).normalized();
472477
}
473478

474479
Vector3d Profile::ComputeTargetVelocityVector(const State& aState, const ostk::astrodynamics::Trajectory& aTrajectory)
475480
{
476-
const Transform ITRF_GCRF_transform = Frame::ITRF()->getTransformTo(Frame::GCRF(), aState.accessInstant());
481+
const Instant& instant = aState.accessInstant();
482+
483+
const Vector3d slidingTargetGroundVelocityCoordinates =
484+
aTrajectory.getStateAt(instant).inFrame(DEFAULT_ECEF_FRAME).getVelocity().accessCoordinates();
477485

478-
const State slidingTargetState_GCRF = aTrajectory.getStateAt(aState.accessInstant());
479-
const State slidingTargetState_ITRF = slidingTargetState_GCRF.inFrame(Frame::ITRF());
486+
if (slidingTargetGroundVelocityCoordinates.isZero())
487+
{
488+
throw ostk::core::error::RuntimeError(
489+
"Cannot compute a Target Velocity Vector if the target's sliding velocity is zero."
490+
);
491+
}
480492

481-
const Vector3d relativePositionDirection =
482-
(slidingTargetState_GCRF.getPosition().getCoordinates() - aState.getPosition().getCoordinates()).normalized();
483-
const Vector3d relativeVelocityDirection =
484-
ITRF_GCRF_transform.applyToVector(slidingTargetState_ITRF.getVelocity().getCoordinates()).normalized();
493+
const Transform ITRF_GCRF_transform = DEFAULT_ECEF_FRAME->getTransformTo(DEFAULT_ECI_FRAME, instant);
485494

486-
const Vector3d relativeNormalDirection = relativePositionDirection.cross(relativeVelocityDirection).normalized();
495+
const Vector3d slidingTargetGroundVelocityCoordinatesRotated =
496+
ITRF_GCRF_transform.applyToVector(slidingTargetGroundVelocityCoordinates);
487497

488-
return relativeNormalDirection.cross(relativePositionDirection);
498+
return slidingTargetGroundVelocityCoordinatesRotated.normalized();
489499
}
490500

491501
Vector3d Profile::ComputeCelestialDirectionVector(const State& aState, const Celestial& aCelestial)
492502
{
493503
const Vector3d celestialPositionCoordinates =
494-
aCelestial.getPositionIn(Frame::GCRF(), aState.getInstant()).accessCoordinates();
495-
const Vector3d satellitePositionCoordinates = aState.getPosition().accessCoordinates();
504+
aCelestial.getPositionIn(DEFAULT_ECI_FRAME, aState.getInstant()).accessCoordinates();
505+
const Vector3d satellitePositionCoordinates = aState.inFrame(DEFAULT_ECI_FRAME).getPosition().accessCoordinates();
496506

497507
return (celestialPositionCoordinates - satellitePositionCoordinates).normalized();
498508
}
499509

500510
Vector3d Profile::ComputeVelocityDirectionVector_ECI(const State& aState)
501511
{
502-
return aState.getVelocity().accessCoordinates().normalized();
512+
return aState.inFrame(DEFAULT_ECI_FRAME).getVelocity().accessCoordinates().normalized();
503513
}
504514

505515
Vector3d Profile::ComputeVelocityDirectionVector_ECEF(const State& aState)
506516
{
507-
return aState.inFrame(Frame::ITRF()).getVelocity().accessCoordinates().normalized();
517+
return aState.inFrame(DEFAULT_ECEF_FRAME).getVelocity().accessCoordinates().normalized();
508518
}
509519

510520
Vector3d Profile::ComputeClockingAxisVector(const Vector3d& anAlignmentAxisVector, const Vector3d& aClockingVector)
@@ -514,8 +524,9 @@ Vector3d Profile::ComputeClockingAxisVector(const Vector3d& anAlignmentAxisVecto
514524

515525
Vector3d Profile::ComputeOrbitalMomentumDirectionVector(const State& aState)
516526
{
517-
const Vector3d positionDirection = aState.getPosition().getCoordinates().normalized();
518-
const Vector3d velocityDirection = aState.getVelocity().getCoordinates().normalized();
527+
const State state = aState.inFrame(DEFAULT_ECI_FRAME);
528+
const Vector3d positionDirection = state.getPosition().getCoordinates().normalized();
529+
const Vector3d velocityDirection = state.getVelocity().getCoordinates().normalized();
519530

520531
return positionDirection.cross(velocityDirection).normalized();
521532
}

0 commit comments

Comments
 (0)