コード例 #1
0
 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);
 }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
 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);
 }