Skip to content
This repository has been archived by the owner on Aug 5, 2024. It is now read-only.

Commit

Permalink
Fix/maneuver (#109)
Browse files Browse the repository at this point in the history
* Fix UTC window in spacecraft propagator

* TLE propagator works now with TDB only

* Update Nuget version
  • Loading branch information
sylvain-guillet authored Aug 1, 2024
1 parent e31c095 commit 8ece4b6
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 9 deletions.
2 changes: 1 addition & 1 deletion IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<FileVersion>0.0.1</FileVersion>
<PackAsTool>true</PackAsTool>
<ToolCommandName>astro</ToolCommandName>
<Version>0.1.12</Version>
<Version>0.1.13</Version>
<Title>Astrodynamics command line interface</Title>
<Authors>Sylvain Guillet</Authors>
<Description>This CLI allows end user to exploit IO.Astrodynamics framework </Description>
Expand Down
60 changes: 57 additions & 3 deletions IO.Astrodynamics.Tests/Mission/ScenarioTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,60 @@ public async Task PropagateSpacecraft()
Assert.Equal(2281.6927232547719, summary.SpacecraftSummaries.First().FuelConsumption, 3);
}

[Fact]
public async Task PropagateSpacecraftWithAttitudeOnly()
{
DateTime start = new DateTime(2024, 7, 30, 13, 48, 30, DateTimeKind.Utc);
DateTime end = new DateTime(2024, 7, 31, 13, 48, 33, DateTimeKind.Utc);

Astrodynamics.Mission.Mission mission = new Astrodynamics.Mission.Mission("mission02");
Scenario scenario = new Scenario("scn1", mission, new Window(start, end));
scenario.AddCelestialItem(TestHelpers.EarthAtJ2000);

//Define parking orbit
StateVector parkingOrbit = new StateVector(
new Vector3(6800000.0, 0.0, 0.0),
new Vector3(0.0, 8000.0, 0.0), TestHelpers.EarthAtJ2000,
start, Frames.Frame.ICRF);

//Create and configure spacecraft
Clock clock = new Clock("clk1", 65536);
Spacecraft spacecraft = new Spacecraft(-1783, "DRAGONFLY3", 1000.0, 10000.0, clock, parkingOrbit);

FuelTank fuelTank = new FuelTank("ft1", "model1", "sn1", 9000.0, 9000.0);
Engine engine = new Engine("engine1", "model1", "sn1", 450.0, 50.0, fuelTank);
spacecraft.AddFuelTank(fuelTank);
spacecraft.AddEngine(engine);

var progradeAttitude = new ProgradeAttitude(TestHelpers.EarthAtJ2000, DateTime.MinValue, TimeSpan.Zero, engine);
spacecraft.SetStandbyManeuver(progradeAttitude);

scenario.AddSpacecraft(spacecraft);

var summary = await scenario.SimulateAsync(Constants.OutputPath, false, false, TimeSpan.FromSeconds(1.0));

// Read maneuver results
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.StartDate.ToFormattedString());
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.EndDate.ToFormattedString());
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.StartDate.ToFormattedString());
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.EndDate.ToFormattedString());
Assert.Equal(0.0, progradeAttitude.ThrustWindow.Value.Length.TotalSeconds, 3);

Assert.Equal(0.0, progradeAttitude.FuelBurned, 0);


Assert.Equal(scenario.Window, summary.Window);
Assert.Single(summary.SpacecraftSummaries);
var maneuverWindow = summary.SpacecraftSummaries.First().ManeuverWindow;
if (maneuverWindow != null)
{
Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.StartDate, TimeSpan.FromMilliseconds(1));
Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.EndDate, TimeSpan.FromMilliseconds(1));
}

Assert.Equal(0.0, summary.SpacecraftSummaries.First().FuelConsumption, 3);
}

[Fact]
public async Task PropagateSpacecraftFromTLE()
{
Expand Down Expand Up @@ -221,10 +275,10 @@ public async Task PropagateSpacecraftFromTLE()

Assert.Equal(
new StateVector(new Vector3(-2194696.277452762, 6520464.634645089, -8851312.715000605), new Vector3(-4855.389207947987, 5010.690350306962, 2785.4343115066577),
site, start, Frames.Frame.ICRF), initialSV);
site, start, Frames.Frame.ICRF), initialSV.ToStateVector(), TestHelpers.StateVectorComparer);
Assert.Equal(
new StateVector(new Vector3(-8877878.268430736, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271),
site, end, Frames.Frame.ICRF), endSV);
new StateVector(new Vector3(-8877878.268430738, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271),
site, end, Frames.Frame.ICRF), endSV.ToStateVector(), TestHelpers.StateVectorComparer);
}

[Fact]
Expand Down
2 changes: 1 addition & 1 deletion IO.Astrodynamics/IO.Astrodynamics.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<id>IO.Astrodynamics</id>
<authors>Sylvain Guillet</authors>
<copyright>Sylvain Guillet</copyright>
<version>3.2.2</version>
<version>3.2.3</version>
<title>Astrodynamics framework</title>
<icon>images\dragonfly-dark-trans.png</icon>
<readme>docs\README.md</readme>
Expand Down
6 changes: 3 additions & 3 deletions IO.Astrodynamics/Propagator/SpacecraftPropagator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ public class SpacecraftPropagator : IPropagator
/// <param name="includeSolarRadiationPressure"></param>
/// <param name="deltaT">Simulation step size</param>
/// <exception cref="ArgumentNullException"></exception>
public SpacecraftPropagator(Window window, Spacecraft spacecraft, IEnumerable<CelestialItem> additionalCelestialBodies, bool includeAtmosphericDrag,
public SpacecraftPropagator(in Window window, Spacecraft spacecraft, IEnumerable<CelestialItem> additionalCelestialBodies, bool includeAtmosphericDrag,
bool includeSolarRadiationPressure, TimeSpan deltaT)
{
var ssb = new Barycenter(Barycenters.SOLAR_SYSTEM_BARYCENTER.NaifId);
_originalObserver = spacecraft.InitialOrbitalParameters.Observer as CelestialItem;
Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft));
Window = window;
Window = new Window(window.StartDate.ToTDB(),window.EndDate.ToTDB());
CelestialItems = additionalCelestialBodies ?? Array.Empty<CelestialItem>();
IncludeAtmosphericDrag = includeAtmosphericDrag;
IncludeSolarRadiationPressure = includeSolarRadiationPressure;
Expand Down Expand Up @@ -97,7 +97,7 @@ private List<ForceBase> InitializeForces(bool includeAtmosphericDrag, bool inclu
/// <returns></returns>
public (IEnumerable<StateVector>stateVectors, IEnumerable<StateOrientation>stateOrientations) Propagate()
{
_stateOrientation[Window.StartDate] = new StateOrientation(Quaternion.Zero, Vector3.Zero, Window.StartDate, Spacecraft.InitialOrbitalParameters.Frame);
_stateOrientation[_svCache.First().Epoch] = new StateOrientation(Quaternion.Zero, Vector3.Zero, _svCache.First().Epoch, Spacecraft.InitialOrbitalParameters.Frame);
for (int i = 0; i < _svCacheSize - 1; i++)
{
var prvSv = _svCache[i];
Expand Down
2 changes: 1 addition & 1 deletion IO.Astrodynamics/Propagator/TLEPropagator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class TLEPropagator : IPropagator

public TLEPropagator(Window window, Spacecraft spacecraft, TimeSpan deltaT)
{
Window = window;
Window = new Window(window.StartDate.ToTDB(), window.EndDate.ToTDB());
Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft));
if (Spacecraft.InitialOrbitalParameters is not TLE)
{
Expand Down

0 comments on commit 8ece4b6

Please sign in to comment.