Project MTS Shuttle System

Update:

Dev work moves slowly forward.
For now launch autopilot is more like aerobatic AP and performs strange manuevers like inverted loop with ~ 1800 ton stack.
 
I'm fixing the Autopilot slowly, honest :shifty:
MTS13.jpg
 
Update:

Dev work moves slowly forward.
For now launch autopilot is more like aerobatic AP and performs strange manuevers like inverted loop with ~ 1800 ton stack.

Do you need some keywords for an interesting NASA publication that might be helpful for you? "Unified Powered Flight Guidance" ;)

Its essentially the ideal that was never implemented for the Space shuttle because of reality, but it is really great for learning making great autopilots for Orbiter. The real autopilots contain more exception code and optimizations. something that you don't need to worry about. ;)
 
MTS launcher can be used also to lift some unmanned payloads:

mts-cargo.jpg


Up to 40 tons into GTO
 
What about letting the payload fairing already start at the beginning of the payload adapter, where the kick stage has still full diameter - this removes this sharp change in cross section (which produces a lot of drag at supersonic speed)
 
Sure - that's not a problem but currently I"m moving Shadow Destroyer's verticles. :P

Little update - with no changes in engine/propellant setting this thing can lift 80 tons to LEO
 
Sure - that's not a problem but currently I"m moving Shadow Destroyer's verticles. :P

Little update - with no changes in engine/propellant setting this thing can lift 80 tons to LEO

Yeah, couldn't really surprise me. You have very light stage masses in the default config. Your first stage has only 4% construction mass ratio. Your SRBs and Kick stage are better in that context, with 10% and 5%. Also that you use a nearly reaction-free RCS for attitude control currently also saves you a lot of DV for hauling payload (usually a bit of fuel would be burned for keeping attitude).

Do you also want to have your SRBs and Core stage be affected by ambient atmosphere pressure (less thrust/specific impulse at low altitude)?
 
Maybe something like this fairing would be better? it's not the best model ever but you should be able to get the idea :P
MTSFairing1_2.jpg

edit: I just added a quick texture to the thing and smoothed it out some more
 
Last edited:
Yeah, couldn't really surprise me. You have very light stage masses in the default config. Your first stage has only 4% construction mass ratio. Your SRBs and Kick stage are better in that context, with 10% and 5%. Also that you use a nearly reaction-free RCS for attitude control currently also saves you a lot of DV for hauling payload (usually a bit of fuel would be burned for keeping attitude).

Do you also want to have your SRBs and Core stage be affected by ambient atmosphere pressure (less thrust/specific impulse at low altitude)?

As for mass specs they're in separate file and can be tuned.

Also ISP ambient pressure dependency is good idea - it will behave in more realistic fasion. Unfortunatelly I started this project as sc3/multistage where those values weren't supported IIRC:P
 
As for mass specs they're in separate file and can be tuned.

Also ISP ambient pressure dependency is good idea - it will behave in more realistic fasion. Unfortunatelly I started this project as sc3/multistage where those values weren't supported IIRC:P

I know... I already moved this part into a Singleton pattern, so it is accessible in any source file. :lol:


Code:
#pragma once
#include <OrbiterAPI.h>

/**
 * Encapsulate global parameters to ensure they remain read-only, 
 * use singleton pattern to simplify having only one object for multiple 
 * vessels.
 */
class CoreConfig
{    /**
     * Empty core vessel mass in kg. (21023 kg)
     */
    double Core_Mass; 
    /**
     * The propellant mass of the core in kg.
     */
    double Core_Fuelmass;
    /** 
     * The specific impulse of the core engines in m/s.
     */
    double Core_ISP;
    /**
     * The vacuum thrust of the core engine in N.
     */
    double Core_TH;
    /**
     * The Z-coordinate of the three touch down points
     * of the core stage.
     */
    double Core_TouchdownZ;
    /**
     * SRB empty mass in kg. (21023 kg)
     */
    double SRB_Mass;
    /**
     * The propellant mass of the SRB in kg.
     */
    double SRB_Fuelmass;
    /** 
     * The fuel-specific impulse of a SRB in Ns/kg
     */
    double SRB_ISP;
    /**
     * The vacuum thrust of one SRB in N.
     */    
    double SRB_TH;
    
    /**
     * The empty mass of the kick stage in kg.
     */
    double KS_Mass;
    /**
     * The propellant mass of the kick stage in kg.
     */
    double KS_Fuelmass;
    /** 
     * The vacuum thrust of the kick stage in N.
     */
    double KS_TH;
    /**
     * The fuel-specific impulse of the kick stage in Ns/kg
     */
    double KS_ISP;
    /**
     * The thrust of a single RCS thruster in N.
     */
    double RCS_TH;
    /**
     * The specific impulse of an RCS thruster in Ns/kg.
     */
    double RCS_ISP; 

    double RCS_Fuelmass;

    static CoreConfig* m_instance;
    CoreConfig();
    ~CoreConfig();
    void ReadCfg();
public:
    static CoreConfig* Instance();
    static void Free();
    
    inline double CoreEmptyMass() const {return Core_Mass;}; 
    inline double CoreISP() const {return Core_ISP;};
    inline double CorePropMass() const {return Core_Fuelmass;};
    inline double CoreThrust() const {return Core_TH;};
    inline double CoreTouchdownZ() const {return Core_TouchdownZ;};

    inline double KSEmptyMass() const {return KS_Mass;}; 
    inline double KSISP() const {return KS_ISP;};
    inline double KSPropMass() const {return KS_Fuelmass;};
    inline double KSThrust() const {return KS_TH;};
    inline double RCSISP() const {return RCS_ISP;};
    inline double RCSThrust() const {return RCS_TH;};
    inline double RCSPropMass() const {return RCS_Fuelmass;};
    inline double SRBEmptyMass() const {return SRB_Mass;}; 
    inline double SRBISP() const {return SRB_ISP;};
    inline double SRBPropMass() const {return SRB_Fuelmass;};
    inline double SRBThrust() const {return SRB_TH;};
    
};
Code:
#include "CoreConfig.h"

CoreConfig* CoreConfig::m_instance = NULL;

CoreConfig::CoreConfig()
{
    // Burntime of 340 seconds
    /*
    Core:
    EmptyMass=21023
    FuelMass=500000.0
    Thrust=4500000.0
    BurnTime=340.
    */
    Core_Mass = 21023; // empty core vessel mass in KG
    Core_Fuelmass = 50e4; // the mass of the core's fuel tanks
    Core_ISP = 3060; // fuel-specific impulse [m/s]
    Core_TH = 45e5;
    Core_TouchdownZ = -20.0;
    ///////
    //SRB//
    ///////
    // Burntime of 126.7 seconds
    /*
    SRB:
    EmptyMass=54543
    FuelMass=502126
    Thrust=14739770.25
    BurnTime=124.
    */

    SRB_Mass = 54543; // empty core vessel mass in KG
    SRB_Fuelmass = 502126; // the mass of the core's fuel tanks
    SRB_ISP = 3720; // fuel-specific impulse [m/s]
    SRB_TH = 14739770;

    //////////////
    //Kick Stage//
    //////////////

    //<Loru>BurnTime=200.
    // 360 = 229
    // 2600 = 195
    KS_Mass = 3000;
    KS_Fuelmass = 6e4;
    KS_TH = 8e5;
    KS_ISP = 2665;

    ///////
    //RCS//
    ///////
    RCS_Fuelmass = 10.0;
    RCS_TH = 2e5;
    RCS_ISP = 1e100; // makes that 10kg of RCS fuel last a lonnnnnnnnnnnnnng time 


    ReadCfg();
}

CoreConfig::~CoreConfig()
{
}

void CoreConfig::Free()
{
    if(m_instance) delete m_instance;
    m_instance = NULL;
}

CoreConfig* CoreConfig::Instance()
{
    if(m_instance == NULL)
        m_instance = new CoreConfig();
    
    return m_instance;
}

void CoreConfig::ReadCfg()
{
    // Read the current parameter value from file
    FILEHANDLE hFile = oapiOpenFile ("MTS_Launcher_Preferences.cfg", 
        FILE_IN, CONFIG);

    if(hFile == NULL)
    {
        oapiWriteLog("(MTS_Launcher) ERROR: Failed to open 'MTS_Launcher_Preferences.cfg'.");
        //Abort function
        return;
    }
    
    ////////
    //CORE//
    ////////
    
    // loads the core stage's mass from the config file.
    if(!oapiReadItem_float(hFile,"Core mass",Core_Mass)) 
        Core_Mass = 61023;
    
    // loads the core stage's fuel mass from the config file.
    if(!oapiReadItem_float(hFile,"Core Fuel mass",Core_Fuelmass)) 
        Core_Fuelmass = 55e4;
    
    // loads the core's ISP from the config file.
    if(!oapiReadItem_float(hFile,"Core ISP",Core_ISP)) 
        Core_ISP = 4260;
    
    // loads the core's thrust from the config file.
    if(!oapiReadItem_float(hFile,"Core Thrust",Core_TH)) 
        Core_TH = 63e5;

    ///////
    //SRB//
    ///////

    // loads the SRB's mass from the config file.
    if(!oapiReadItem_float(hFile,"SRB mass",SRB_Mass)) 
        SRB_Mass = 148000;
    
    // loads the SRBs fuel mass from the config file.
    if(!oapiReadItem_float(hFile,"SRB Fuel mass",SRB_Fuelmass)) 
        SRB_Fuelmass = 1146e3;
    
    // loads the SRB's ISP from the config file.
    if(!oapiReadItem_float(hFile,"SRB ISP",SRB_ISP)) 
        SRB_ISP = 2629;
    
    // loads the SRB's thrust from the config file.
    if(!oapiReadItem_float(hFile,"SRB Thrust",SRB_TH)) 
        SRB_TH = 12800000;

    ///////////////
    //Stage 2(KS)//
    ///////////////
    
    // loads the KS's mass from the config file.
    if(!oapiReadItem_float(hFile,"KS mass",KS_Mass)) 
        KS_Mass = 6500;
    
    // loads the KS's fuel mass from the config file.
    if(!oapiReadItem_float(hFile,"KS Fuel mass",KS_Fuelmass)) 
        SRB_Fuelmass = 60000;
    
    // loads the KS's ISP from the config file.
    if(!oapiReadItem_float(hFile,"KS ISP",KS_ISP)) 
        KS_ISP = 2665;
    
    // loads the KS's thrust from the config file.
    if(!oapiReadItem_float(hFile,"KS Thrust",KS_TH)) 
        KS_TH = 800000;

    // loads the Touchdown point from the config file.
    if(!oapiReadItem_float(hFile,"LPad hight",Core_TouchdownZ)) 
        Core_TouchdownZ = -20;
    oapiCloseFile (hFile, FILE_IN);
}
 
quick update:

panel deactivated
v-panel-off.jpg



all lights on
v-panel-on.jpg


---------- Post added at 08:05 PM ---------- Previous post was at 07:58 PM ----------

Strange - these are specs I use in in my current config:

Core mass = 61023
Core Fuel mass = 550000
Core ISP = 4260
Core Thrust = 6300000

I think it's more than 4% :P

Probably just old value hardcoded in cpp file
 
The cpp should have the newer values in :huh: unless you changed them since I last changed them in the code, I'll just blame Urwumpe :P
 
Re: reentry AP. Have you considered asking Hielor for permission to integrate his yaw (aka zero-sideslip) AP into the package?

EDIT: three buttons are needed for independently toggling three control channels (AoA, bank and yaw/zero-sideslip).
 
Last edited:
Loru: Just make a display/keyboard into the panel in which you can enter a few lines of numeric data by a keyboard, and I can also give you a autopilot that can perform orbital maneuvers for the MTS Shuttle. Or let you watch the status of the launch autopilot. ;)
 
I prefer displaying launcher AP status on HUD.

Also more complicated manuevers like randez vouz or docking can be done manually or with MFDs.

There is no point of turning that craft into weaker DG-IV with altered mesh and bigger payload bay.

Maybe MK-2 version someday.
 
Hehe, an incentive for Urwumpe to put the UPFG code into an MFD of his own :)
 
Back
Top