Desktop version

Home arrow Engineering arrow Small Unmanned Fixed-Wing Aircraft Design. A Practical Approach

Source

Combined Constraint Diagram

With all of the key constraints computed, we can now superimpose them to reveal what remains of the design space.

In [64]: figCOMP = plt.figure(figsize = (10,10))

PlotSetUp(0, WSmax_kgm2, 0, TWmax, '$W/S,[,kg/m'"'2]$'

, '$T/W,[,,]$')

axCOMP = figCOMP.add_subplot(111)

ConstVeloTurnPoly = ConstraintPoly(WSlistCVT_kgm2

,TWlistCVT,'magenta',0.1)

axCOMP.add_patch(ConstVeloTurnPoly)

RateOfClimbPoly = ConstraintPoly(WSlistROC_kgm2

,TWlistROC,'blue',0.1)

axCOMP.add_patch(RateOfClimbPoly)

TORunPoly = ConstraintPoly(WSlistGR_kgm2,TWlistGR,'green',0.1) axCOMP.add_patch(TORunPoly)

CruisePoly = ConstraintPoly(WSlistCR_kgm2,TWlistCR,'red',0.1) axCOMP.add_patch(CruisePoly)

AppStallPoly = ConstraintPoly(WSlistAPP_kgm2,TWlistAPP

,'grey',0.1)

axCOMP.add_patch(AppStallPoly)

axCOMP.legend(['Turn','Climb','T/O run','Cruise'

, 'App Stall'])

textstr = ' The feasible aeroplane

lives in this white space'

axCOMP.text(0.05, 0.95, textstr, transform=axCOMP.transAxes

, fontsize=14, verticalalignment='top')

Out[64]:

Since propeller and piston engine driven aircraft are normally designed in terms of engine power rather than thrust, we next convert the constraint diagram from thrust to weight ratio into an installed power requirement by specifying a propulsive efficiency q = 0.6 (note that un-supercharged piston engine power varies with altitude so we also allow for this in the conversion using the Gagg and Ferrar model (see Gudmundsson [15]) with PowerSL = Power/(1.132a - 0.132) where a is the air density ratio):

In [65]: PropEff = 0.6

In [66]: WSlistCVT_Pa = np.linspace(Start_Pa,8500,Resolution)

PlistCVT_kW = []

i = 0

for WS in WSlistCVT_Pa:

TW = q_cruise_Pa*(CDmin/WSlistCVT_Pa[i]

+ WSlistCVT_Pa[i]*k*(n_cvt_/q_cruise_Pa)**2)

P_kW = 9.81 * TW * DesignGrossWeight_kg

* CruisingSpeed_mpsTAS / PropEff

/ (1.132*CruisingAltDens_kgm3/SeaLevelDens_kgm3-0.132)/1000 PlistCVT_kW.append(P_kW) i = i + 1

WSlistCVT_kgm2 = [x*0.101971621 for x in WSlistCVT_Pa]

In [67]: WSlistROC_Pa = np.linspace(Start_Pa,8500,Resolution)

PlistROC_kW = []

i=0

for WS in WSlistROC_Pa:

TW = RateOfClimb_mps/ClimbSpeed_mpsCAS

+ CDmin*q_climb_Pa/WSlistROC_Pa[i]

+ k*WSlistROC_Pa[i]/q_climb_Pa

P_kW = 9.81 * TW * DesignGrossWeight_kg

* ClimbSpeed_mpsCAS / PropEff

/ (1.132*ClimbAltDens_kgm3/SeaLevelDens_kgm3-0.132)/1000

PlistROC_kW.append(P_kW)

i=i+1

WSlistROC_kgm2 = [x*0.101971621 for x in WSlistROC_Pa]

In [68]: WSlistGR_Pa = np.linspace(Start_Pa,8500,Resolution)

PlistGR_kW = []

i=0

for WS in WSlistGR_Pa:

TW =(TakeOffSpeed_mpsCAS**2)/(2*9.81*GroundRun_m) + q_TO_Pa*CDTO/WSlistGR_Pa[i]

+ muTO*(1-q_TO_Pa*CLTO/WSlistGR_Pa[i])

P_kW = 9.81 * TW * DesignGrossWeight_kg

* TakeOffSpeed_mpsCAS / PropEff

/ (1.132*TakeOffDens_kgm3/SeaLevelDens_kgm3-0.132)/1000

PlistGR_kW.append(P_kW)

i=i+1

WSlistGR_kgm2 = [x*0.101971621 for x in WSlistGR_Pa]

In [69]: WSlistCR_Pa = np.linspace(Start_Pa,8500,Resolution)

PlistCR_kW = []

i=0

for WS in WSlistCR_Pa:

TW = q_cruise_Pa*CDmin*(1.0/WSlistCR_Pa[i])

+ k*(1/q_cruise_Pa)*WSlistCR_Pa[i]

P_kW = 9.81 * TW * DesignGrossWeight_kg

* CruisingSpeed_mpsTAS / PropEff

/ (1.132*CruisingAltDens_kgm3/SeaLevelDens_kgm3-0.132)/1000

PlistCR_kW.append(P_kW)

i=i+1

WSlistCR_kgm2 = [x*0.101971621 for x in WSlistCR_Pa]

In [70]: WSlistAPP_kgm2 = [WS_APP_kgm2, WSmax_kgm2, WSmax_kgm2

, WS_APP_kgm2, WS_APP_kgm2 ]

PlistAPP_kW = [0, 0, Pmax_kW, Pmax_kW, 0 ]

In [71]: figCOMP = plt.figure(figsize = (10,10))

PlotSetUp(0, WSmax_kgm2, 0, Pmax_kW, '$W/S,[,kg/mA2]$'

, '$P,[,kW]$')

axCOMP = figCOMP.add_subplot(111)

ConstVeloTurnPoly = ConstraintPoly(WSlistCVT_kgm2,PlistCVT_kW

,'magenta',0.1)

axCOMP.add_patch(ConstVeloTurnPoly)

RateOfClimbPoly = ConstraintPoly(WSlistROC_kgm2,PlistROC_kW

,'blue',0.1)

axCOMP.add_patch(RateOfClimbPoly)

TORunPoly = ConstraintPoly(WSlistGR_kgm2,PlistGR_kW,'green',0.1) axCOMP.add_patch(TORunPoly)

CruisePoly = ConstraintPoly(WSlistCR_kgm2,PlistCR_kW,'red',0.1) axCOMP.add_patch(CruisePoly)

AppStallPoly = ConstraintPoly(WSlistAPP_kgm2,PlistAPP_kW,'grey',0.1) axCOMP.add_patch(AppStallPoly)

axCOMP.legend(['Turn','Climb','T/O run','Cruise', 'App Stall'])

textstr = ' The feasible aeroplane

lives in this white space'

axCOMP.text(0.05, 0.95, textstr, transform=axCOMP.transAxes

, fontsize=14, verticalalignment='top')

Out[71]:

The resulting combined constraint diagram is shown in Figure 10.6. The code used to carry out this analysis can also be downloaded from https://aircraftgeometrycodes.wordpress.com/ uavbook/.

 
Source
Found a mistake? Please highlight the word and press Shift + Enter  
< Prev   CONTENTS   Next >

Related topics