C++ ELFO Propagation and Frame ConversionΒΆ

This example propagates a spacecraft in a lunar elliptical frozen orbit (ELFO). The initial state is defined with classical orbital elements in the Moon orbital plane frame, converted to the Moon-centered inertial frame for dynamics, and then converted to the Moon principal-axes frame for inspection.

#include <iostream>

#include "lupnt/lupnt.h"

using namespace lupnt;

int main() {
  const Real t0_tdb =
      ConvertTime(GregorianToTime(2030, 1, 1, 12, 0, 0), Time::UTC, Time::TDB);

  Vec6 coe_op;
  coe_op << 6541.4e3, 0.60, 65.5 * RAD, 0.0 * RAD, 90.0 * RAD, 0.0 * RAD;

  const Vec6 rv0_op = ClassicalToCart(coe_op, GM_MOON);
  const Vec6 rv0_ci = ConvertFrame(t0_tdb, rv0_op, Frame::MOON_OP, Frame::MOON_CI);

  NBodyDynamics dynamics;
  dynamics.SetFrame(Frame::MOON_CI);
  dynamics.AddBody(Body::Moon(20, 20));
  dynamics.AddBody(Body::Earth());
  dynamics.AddBody(Body::Sun());

  const VecX tspan = Arange(t0_tdb, t0_tdb + 7.0 * SECS_DAY, SECS_HOUR);
  const MatX rv_ci = dynamics.Propagate(rv0_ci, tspan);
  const MatX rv_pa = ConvertFrame(tspan, rv_ci, Frame::MOON_CI, Frame::MOON_PA);

  std::cout << "Initial Moon-CI state [m, m/s]:\n" << rv0_ci.transpose() << "\n\n";
  std::cout << "Final Moon-PA state [m, m/s]:\n" << rv_pa.row(rv_pa.rows() - 1) << "\n";

  return 0;
}

To compile this as a standalone example, include the LuPNT headers and link against the lupnt library target from the CMake build.