protected LandingTrajectory horizontal_correction(LandingTrajectory old, LandingTrajectory best, ref Vector3d NodeDeltaV, double start_offset) { var StartUT = VSL.Physics.UT+start_offset; if(old != null) { if(Math.Abs(old.DeltaR) > Math.Abs(old.DeltaFi)) NodeDeltaV += new Vector3d(0, 0, old.DeltaR * Utils.ClampH(old.Orbit.period/16/old.TimeToSurface, 1)); else NodeDeltaV += PlaneCorrection(old); } return new LandingTrajectory(VSL, Node2OrbitDeltaV(NodeDeltaV, StartUT), StartUT, CFG.Target, old == null? TargetAltitude : old.TargetAltitude); }
public void DeorbitCallback(Multiplexer.Command cmd) { switch(cmd) { case Multiplexer.Command.Resume: // Utils.Log("Resuming: stage {}, landing_stage {}, landing {}", stage, landing_stage, landing);//debug if(!check_patched_conics()) return; NeedRadarWhenMooving(); if(stage == Stage.None && !landing) goto case Multiplexer.Command.On; else if(VSL.HasManeuverNode) CFG.AP1.OnIfNot(Autopilot1.Maneuver); break; case Multiplexer.Command.On: reset(); if(!check_patched_conics()) return; if(!setup()) { CFG.AP2.Off(); return; } if(VesselOrbit.PeR < Body.Radius) { Status("red", "Already deorbiting. Trying to correct course and land."); fine_tune_approach(); } else { // Log("Calculating initial orbit eccentricity...");//debug var tPos = CFG.Target.RelOrbPos(Body); var UT = VSL.Physics.UT + AngleDelta(VesselOrbit, tPos, VSL.Physics.UT)/360*VesselOrbit.period; var vPos = VesselOrbit.getRelativePositionAtUT(UT); var dir = Vector3d.Exclude(vPos, tPos-vPos); var ini_orb = CircularOrbit(dir, UT); var ini_dV = ini_orb.getOrbitalVelocityAtUT(UT)-VesselOrbit.getOrbitalVelocityAtUT(UT) + dV4Pe(ini_orb, Body.Radius*0.9, UT); var trj = new LandingTrajectory(VSL, ini_dV, UT, CFG.Target, TargetAltitude); var dV = 10.0; dir = -dir.normalized; while(trj.Orbit.eccentricity < DEO.StartEcc) { // Log("\ndV: {}m/s\nini trj:\n{}", dV, trj);//debug if(trj.DeltaR > 0) break; trj = new LandingTrajectory(VSL, ini_dV+dir*dV, UT, CFG.Target, trj.TargetAltitude); dV += 10; } if(trj.Orbit.eccentricity > DEO.StartEcc) { currentEcc = DEO.StartEcc; if(Body.atmosphere) currentEcc = Utils.ClampH(currentEcc*(2.1-Utils.ClampH(VSL.Torque.MaxPossible.AngularDragResistance/Body.atmDensityASL*DEO.AngularDragF, 1)), DEO.MaxEcc); } else currentEcc = Utils.ClampL(trj.Orbit.eccentricity - DEO.dEcc, DEO.dEcc); // Log("currentEcc: {}, dEcc {}", currentEcc, DEO.dEcc);//debug if(Globals.Instance.AutosaveBeforeLanding) Utils.SaveGame(VSL.vessel.vesselName.Replace(" ", "_")+"-before_landing"); compute_landing_trajectory(); } goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom<Radar>(); reset(); break; } }
protected LandingTrajectory fixed_Ecc_orbit(LandingTrajectory old, LandingTrajectory best, ref Vector3d NodeDeltaV, double ecc) { double StartUT; double targetAlt; if(old != null) { targetAlt = old.TargetAltitude; StartUT = AngleDelta2StartUT(old, Math.Abs(VesselOrbit.inclination) <= 45 ? old.DeltaLon : old.DeltaLat, TRJ.ManeuverOffset, VesselOrbit.period, VesselOrbit.period); NodeDeltaV += PlaneCorrection(old); if(old.BrakeEndDeltaAlt < LTRJ.FlyOverAlt) //correct fly-over altitude NodeDeltaV += new Vector3d((LTRJ.FlyOverAlt-old.BrakeEndDeltaAlt)/100, 0, 0); } else { StartUT = VSL.Physics.UT+TRJ.ManeuverOffset; targetAlt = TargetAltitude; } return new LandingTrajectory(VSL, dV4Ecc(VesselOrbit, ecc, StartUT, Body.Radius*0.9)+ Node2OrbitDeltaV(NodeDeltaV, StartUT), StartUT, CFG.Target, targetAlt); }