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

Commit 8ece4b6

Browse files
Fix/maneuver (#109)
* Fix UTC window in spacecraft propagator * TLE propagator works now with TDB only * Update Nuget version
1 parent e31c095 commit 8ece4b6

5 files changed

Lines changed: 63 additions & 9 deletions

File tree

IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<FileVersion>0.0.1</FileVersion>
1010
<PackAsTool>true</PackAsTool>
1111
<ToolCommandName>astro</ToolCommandName>
12-
<Version>0.1.12</Version>
12+
<Version>0.1.13</Version>
1313
<Title>Astrodynamics command line interface</Title>
1414
<Authors>Sylvain Guillet</Authors>
1515
<Description>This CLI allows end user to exploit IO.Astrodynamics framework </Description>

IO.Astrodynamics.Tests/Mission/ScenarioTests.cs

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,60 @@ public async Task PropagateSpacecraft()
194194
Assert.Equal(2281.6927232547719, summary.SpacecraftSummaries.First().FuelConsumption, 3);
195195
}
196196

197+
[Fact]
198+
public async Task PropagateSpacecraftWithAttitudeOnly()
199+
{
200+
DateTime start = new DateTime(2024, 7, 30, 13, 48, 30, DateTimeKind.Utc);
201+
DateTime end = new DateTime(2024, 7, 31, 13, 48, 33, DateTimeKind.Utc);
202+
203+
Astrodynamics.Mission.Mission mission = new Astrodynamics.Mission.Mission("mission02");
204+
Scenario scenario = new Scenario("scn1", mission, new Window(start, end));
205+
scenario.AddCelestialItem(TestHelpers.EarthAtJ2000);
206+
207+
//Define parking orbit
208+
StateVector parkingOrbit = new StateVector(
209+
new Vector3(6800000.0, 0.0, 0.0),
210+
new Vector3(0.0, 8000.0, 0.0), TestHelpers.EarthAtJ2000,
211+
start, Frames.Frame.ICRF);
212+
213+
//Create and configure spacecraft
214+
Clock clock = new Clock("clk1", 65536);
215+
Spacecraft spacecraft = new Spacecraft(-1783, "DRAGONFLY3", 1000.0, 10000.0, clock, parkingOrbit);
216+
217+
FuelTank fuelTank = new FuelTank("ft1", "model1", "sn1", 9000.0, 9000.0);
218+
Engine engine = new Engine("engine1", "model1", "sn1", 450.0, 50.0, fuelTank);
219+
spacecraft.AddFuelTank(fuelTank);
220+
spacecraft.AddEngine(engine);
221+
222+
var progradeAttitude = new ProgradeAttitude(TestHelpers.EarthAtJ2000, DateTime.MinValue, TimeSpan.Zero, engine);
223+
spacecraft.SetStandbyManeuver(progradeAttitude);
224+
225+
scenario.AddSpacecraft(spacecraft);
226+
227+
var summary = await scenario.SimulateAsync(Constants.OutputPath, false, false, TimeSpan.FromSeconds(1.0));
228+
229+
// Read maneuver results
230+
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.StartDate.ToFormattedString());
231+
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.EndDate.ToFormattedString());
232+
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.StartDate.ToFormattedString());
233+
Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.EndDate.ToFormattedString());
234+
Assert.Equal(0.0, progradeAttitude.ThrustWindow.Value.Length.TotalSeconds, 3);
235+
236+
Assert.Equal(0.0, progradeAttitude.FuelBurned, 0);
237+
238+
239+
Assert.Equal(scenario.Window, summary.Window);
240+
Assert.Single(summary.SpacecraftSummaries);
241+
var maneuverWindow = summary.SpacecraftSummaries.First().ManeuverWindow;
242+
if (maneuverWindow != null)
243+
{
244+
Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.StartDate, TimeSpan.FromMilliseconds(1));
245+
Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.EndDate, TimeSpan.FromMilliseconds(1));
246+
}
247+
248+
Assert.Equal(0.0, summary.SpacecraftSummaries.First().FuelConsumption, 3);
249+
}
250+
197251
[Fact]
198252
public async Task PropagateSpacecraftFromTLE()
199253
{
@@ -221,10 +275,10 @@ public async Task PropagateSpacecraftFromTLE()
221275

222276
Assert.Equal(
223277
new StateVector(new Vector3(-2194696.277452762, 6520464.634645089, -8851312.715000605), new Vector3(-4855.389207947987, 5010.690350306962, 2785.4343115066577),
224-
site, start, Frames.Frame.ICRF), initialSV);
278+
site, start, Frames.Frame.ICRF), initialSV.ToStateVector(), TestHelpers.StateVectorComparer);
225279
Assert.Equal(
226-
new StateVector(new Vector3(-8877878.268430736, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271),
227-
site, end, Frames.Frame.ICRF), endSV);
280+
new StateVector(new Vector3(-8877878.268430738, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271),
281+
site, end, Frames.Frame.ICRF), endSV.ToStateVector(), TestHelpers.StateVectorComparer);
228282
}
229283

230284
[Fact]

IO.Astrodynamics/IO.Astrodynamics.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<id>IO.Astrodynamics</id>
55
<authors>Sylvain Guillet</authors>
66
<copyright>Sylvain Guillet</copyright>
7-
<version>3.2.2</version>
7+
<version>3.2.3</version>
88
<title>Astrodynamics framework</title>
99
<icon>images\dragonfly-dark-trans.png</icon>
1010
<readme>docs\README.md</readme>

IO.Astrodynamics/Propagator/SpacecraftPropagator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ public class SpacecraftPropagator : IPropagator
4141
/// <param name="includeSolarRadiationPressure"></param>
4242
/// <param name="deltaT">Simulation step size</param>
4343
/// <exception cref="ArgumentNullException"></exception>
44-
public SpacecraftPropagator(Window window, Spacecraft spacecraft, IEnumerable<CelestialItem> additionalCelestialBodies, bool includeAtmosphericDrag,
44+
public SpacecraftPropagator(in Window window, Spacecraft spacecraft, IEnumerable<CelestialItem> additionalCelestialBodies, bool includeAtmosphericDrag,
4545
bool includeSolarRadiationPressure, TimeSpan deltaT)
4646
{
4747
var ssb = new Barycenter(Barycenters.SOLAR_SYSTEM_BARYCENTER.NaifId);
4848
_originalObserver = spacecraft.InitialOrbitalParameters.Observer as CelestialItem;
4949
Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft));
50-
Window = window;
50+
Window = new Window(window.StartDate.ToTDB(),window.EndDate.ToTDB());
5151
CelestialItems = additionalCelestialBodies ?? Array.Empty<CelestialItem>();
5252
IncludeAtmosphericDrag = includeAtmosphericDrag;
5353
IncludeSolarRadiationPressure = includeSolarRadiationPressure;
@@ -97,7 +97,7 @@ private List<ForceBase> InitializeForces(bool includeAtmosphericDrag, bool inclu
9797
/// <returns></returns>
9898
public (IEnumerable<StateVector>stateVectors, IEnumerable<StateOrientation>stateOrientations) Propagate()
9999
{
100-
_stateOrientation[Window.StartDate] = new StateOrientation(Quaternion.Zero, Vector3.Zero, Window.StartDate, Spacecraft.InitialOrbitalParameters.Frame);
100+
_stateOrientation[_svCache.First().Epoch] = new StateOrientation(Quaternion.Zero, Vector3.Zero, _svCache.First().Epoch, Spacecraft.InitialOrbitalParameters.Frame);
101101
for (int i = 0; i < _svCacheSize - 1; i++)
102102
{
103103
var prvSv = _svCache[i];

IO.Astrodynamics/Propagator/TLEPropagator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class TLEPropagator : IPropagator
1818

1919
public TLEPropagator(Window window, Spacecraft spacecraft, TimeSpan deltaT)
2020
{
21-
Window = window;
21+
Window = new Window(window.StartDate.ToTDB(), window.EndDate.ToTDB());
2222
Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft));
2323
if (Spacecraft.InitialOrbitalParameters is not TLE)
2424
{

0 commit comments

Comments
 (0)