- Joined
- Mar 28, 2008
- Messages
- 666
- Reaction score
- 20
- Points
- 33
Hi,
I am not an expert in aerodynamic.
i wan't to create a vessel for my missile add on witch can be fly stable with speeds near 1400 m/s near see level. At this time my vessel begin to shake around at speeds more than 1000m/s.
My question is what respect by using "CreateAirfoil3" and inside the "VLiftCoeff" / "HLiftCoeff" function to get a "near realistic flight model"?
reg.
Topper
My modified vessel code from the shuttlePB (i know i have cheated a bit...):
I am not an expert in aerodynamic.
i wan't to create a vessel for my missile add on witch can be fly stable with speeds near 1400 m/s near see level. At this time my vessel begin to shake around at speeds more than 1000m/s.
My question is what respect by using "CreateAirfoil3" and inside the "VLiftCoeff" / "HLiftCoeff" function to get a "near realistic flight model"?
reg.
Topper
My modified vessel code from the shuttlePB (i know i have cheated a bit...):
Code:
// ==============================================================
// ORBITER MODULE: ShuttlePB
// Part of the ORBITER SDK
// Copyright (C) 2002-2004 Martin Schweiger
// All rights reserved
//
// ShuttlePB.cpp
// Control module for ShuttlePB vessel class
//
// Notes:
// This is an example for a "minimal" vessel implementation which
// only overloads the clbkSetClassCaps method to define vessel
// capabilities and otherwise uses the default VESSEL class
// behaviour.
// ==============================================================
//#define STRICT
#include "AAMissile.h"
#define ORBITER_MODULE
// ==============================================================
// Some vessel parameters
// ==============================================================
const double PB_FUELMASS = 125.0;
const double PB_ISP = 980;
const double PB_MAXMAINTH = 2.0e4;
//const double PB_MAXHOVERTH = 1.5e4;
const double PB_MAXRCSTH = 50;
// Calculate lift coefficient [Cl] as a function of aoa (angle of attack) over -Pi ... Pi
// Implemented here as a piecewise linear function
void VLiftCoeff (VESSEL *v, double aoa, double M, double Re, void *context, double *cl, double *cm, double *cd)
{
int i;
const int nabsc = 9;
static const double AOA[nabsc] = {-180*RAD,-60*RAD,-30*RAD, -2*RAD, 8*RAD,20*RAD,25*RAD,60*RAD,180*RAD};
static const double CL[nabsc] = { 0, 0, -0.4, 0, 0.04, 1, 0.8, 0, 0};
static const double CM[nabsc] = { 0, 0, 0.014, 0.0039, -0.006,-0.008,-0.010, 0, 0};
for (i = 0; i < nabsc-1 && AOA[i+1] < aoa; i++);
double f = (aoa-AOA[i]) / (AOA[i+1]-AOA[i]);
*cl = CL[i] + (CL[i+1]-CL[i]) * f; // aoa-dependent lift coefficient
*cm = CM[i] + (CM[i+1]-CM[i]) * f; // aoa-dependent moment coefficient
double saoa = sin(aoa);
double pd = 0.001 + 0.01*saoa*saoa; // profile drag
*cd = pd + (oapiGetInducedDrag (*cl, 1.1, 0.9) + oapiGetWaveDrag (M, 0.75, 1.0, 1.1, 0.04))/30;
// profile drag + (lift-)induced drag + transonic/supersonic wave (compressibility) drag
}
// 2. horizontal lift component (vertical stabilisers and body)
void HLiftCoeff (VESSEL *v, double beta, double M, double Re, void *context, double *cl, double *cm, double *cd)
{
int i;
const int nabsc = 8;
static const double BETA[nabsc] = {-180*RAD,-135*RAD,-90*RAD,-45*RAD,45*RAD,90*RAD,135*RAD,180*RAD};
static const double CL[nabsc] = { 0, +0.3, 0, -0.3, +0.3, 0, -0.3, 0};
for (i = 0; i < nabsc-1 && BETA[i+1] < beta; i++);
*cl = CL[i] + (CL[i+1]-CL[i]) * (beta-BETA[i]) / (BETA[i+1]-BETA[i]);
*cm = 0.0;
*cd = 0.001 + (oapiGetInducedDrag (*cl, 1.1, 0.9) + oapiGetWaveDrag (M, 0.75, 1.0, 1.1, 0.04))/30;
}
// ==============================================================
// Shuttle-PB class interface
// ==============================================================
// ==============================================================
// Overloaded callback functions
// ==============================================================
// --------------------------------------------------------------
// Set the capabilities of the vessel class
// --------------------------------------------------------------
void AIM120::clbkSetClassCaps (FILEHANDLE cfg)
{
anim_x = CreateAnimation (0);
THRUSTER_HANDLE th_main;
SetSize (10);
SetEmptyMass (35.0);
//make wings
CreateAirfoil3 (LIFT_VERTICAL, _V(0,0,-2.8), VLiftCoeff, 0, 1, 2.6, 1.2);
//CreateAirfoil3 (LIFT_VERTICAL, _V(0,0, 4), VLiftCoeff, 0, 1, 0.5, 1.6);
// wing and body lift+drag components
CreateAirfoil3 (LIFT_HORIZONTAL, _V(0,0,-2.8), HLiftCoeff, 0, 1, 2.6, 1.2);
//CreateAirfoil3 (LIFT_HORIZONTAL, _V(0,0, 4), HLiftCoeff, 0, 1, 0.5, 1.6);
// vertical stabiliser and body lift and drag components
CreateControlSurface (AIRCTRL_ELEVATOR, 0.4, 2.5, _V( 0,0,-7.2), AIRCTRL_AXIS_XPOS, anim_x);
CreateControlSurface (AIRCTRL_RUDDER, 0.4, 2.5, _V( 0,0,-7.2), AIRCTRL_AXIS_YPOS, anim_x);
CreateControlSurface2 (AIRCTRL_AILERON, 0.4, 2.5, _V( 7.5,0,-7.2), AIRCTRL_AXIS_XPOS, anim_x);
CreateControlSurface2 (AIRCTRL_AILERON, 0.4, 2.5, _V(-7.5,0,-7.2), AIRCTRL_AXIS_XNEG, anim_x);
CreateControlSurface (AIRCTRL_ELEVATORTRIM, 0.4, 2.5, _V( 0,0,-7.2), AIRCTRL_AXIS_XPOS, anim_x);
PROPELLANT_HANDLE hpr = CreatePropellantResource (PB_FUELMASS);
th_main = CreateThruster (_V(0,0,-4.35), _V(0,0,1), PB_MAXMAINTH, hpr, PB_ISP);
CreateThrusterGroup (&th_main, 1, THGROUP_MAIN);
// visual specs
/*
PARTICLESTREAMSPEC contrail_main = {
0, 5.0, 16, 200, 0.15, 1.0, 5, 3.0, PARTICLESTREAMSPEC::DIFFUSE,
PARTICLESTREAMSPEC::LVL_PSQRT, 0, 2,
PARTICLESTREAMSPEC::ATM_PLOG, 1e-4, 1
};
PARTICLESTREAMSPEC exhaust_main = {
0, 2.0, 20, 200, 0.05, 0.1, 8, 1.0, PARTICLESTREAMSPEC::EMISSIVE,
PARTICLESTREAMSPEC::LVL_SQRT, 0, 1,
PARTICLESTREAMSPEC::ATM_PLOG, 1e-5, 0.1
};
*/
AddExhaust (th_main, 5, 0.25, _V(0,0,-1.82), _V(0,0,-1));
//AddExhaustStream (th_main, _V(0,0.1,-10), &contrail_main);
//AddExhaustStream (th_main, _V(0,0.1,-5), &exhaust_main);
//SetTouchdownPoints (_V(0,-1.5,-2.6), _V(-0.2,1.5,-2.6), _V(0.2,0,-1.6));
//AG : SetTouchdownPoints (_V(0,-3.5,2), _V(-1,-1.0,-1.5), _V(1,-1.0,-1.5));
SetTouchdownPoints (_V(0,-1,2), _V(-1,-1.0,-1.5), _V(1,-1.0,-1.5));
AddMesh ("AAMissile");
SetReentryTexture(NULL);
}
// ==============================================================
// API callback interface
// ==============================================================
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
return new AIM120 (hvessel, flightmodel);
}
// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------
DLLCLBK void ovcExit (VESSEL *vessel)
{
if (vessel) delete (AIM120*)vessel;
}
void AIM120::clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC)
{
// draw the default HUD
VESSEL2::clbkDrawHUD (mode, hps, hDC);
int cx = hps->CX;
int cy = hps->CY;
int RADIUS = 500*(cx/cy);
int CenterX = cx;
int CenterY = cy;
Ellipse (hDC,
CenterX - RADIUS,
CenterY + RADIUS,
CenterX + RADIUS,
CenterY - RADIUS);
}
double AIM120::GetVesselDistance2(OBJHANDLE hVesselFrom, VESSEL* VesselTo)
{
VECTOR3 v3;
VesselTo->GetRelativePos(hVesselFrom,v3);
double TotalDistance = sqrt((v3.x * v3.x) + (v3.y * v3.y) + (v3.z * v3.z));
return TotalDistance;
}
void AIM120::clbkPostStep (double simt, double simdt, double mjd)
{
//walpha.wMain();
}