-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib_launch_common.ks
More file actions
342 lines (300 loc) · 9.37 KB
/
lib_launch_common.ks
File metadata and controls
342 lines (300 loc) · 9.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
@LAZYGLOBAL OFF. // #include init
FOR f IN LIST(
"lib_burn.ks", // #include lib_burn
"lib_steer.ks", // #include lib_steer
"lib_orbit.ks", // #include lib_orbit
"lib_orbit_tools.ks", // #include lib_orbit_tools
"lib_ant.ks", // #include lib_ant
"lib_panels.ks", // #include lib_panels
"lib_runmode.ks" // #include lib_runmode
) { runScript(f,debug()). }
GLOBAL OPT_TWR IS 2.0.
GLOBAL MIN_TWR IS 0.1.
GLOBAL MIN_THR IS 0.05.
GLOBAL MIN_ETA_APOAPSIS IS 45.
GLOBAL LCH_MAXQ IS 35000.
GLOBAL LCH_MAXQ_MIN IS LCH_MAXQ * 0.5.
GLOBAL LCH_MAXQ_THR IS TRUE.
GLOBAL LCH_PITCH_SPEED IS 100.
GLOBAL LCH_MAX_THRUST IS 0.
GLOBAL LCH_MAX_AGL IS 15.
GLOBAL LCH_ORBIT_VEL IS 0.
GLOBAL LCH_ORBIT_SLOW IS TRUE.
GLOBAL LCH_VEC IS UP:VECTOR.
GLOBAL LCH_I IS 0.
GLOBAL LCH_AN IS TRUE.
GLOBAL LCH_THR_CONTROL IS TRUE.
GLOBAL LCH_AP IS 80000.
GLOBAL LCH_NOATMO IS 8000.
GLOBAL LCH_FAIRING_PRES_K IS 200.
GLOBAL LCH_PITCH_ALT_K IS 0.05/70.
GLOBAL LCH_CURVE_ALT_K IS 60/70.
GLOBAL LCH_MAX_STEER_K IS 40/70.
GLOBAL LCH_FAIRING_ALT_K IS 60/70.
GLOBAL LCH_MODULES_ALT_K IS 70/70.
GLOBAL LCH_PITCH_ALT IS MAX(BODY:ATM:HEIGHT * LCH_PITCH_ALT_K, 500).
GLOBAL LCH_CURVE_ALT IS MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_CURVE_ALT_K.
GLOBAL LCH_MAX_STEER IS MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_MAX_STEER_K.
GLOBAL LCH_FAIRING_ALT IS MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_FAIRING_ALT_K.
GLOBAL LCH_MODULES_ALT IS MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_MODULES_ALT_K.
GLOBAL LCH_HAS_LES IS FALSE.
GLOBAL LCH_HAS_FAIRING IS FALSE.
GLOBAL LCH_FAIRING_LIST IS LIST().
GLOBAL LCH_HAS_CLAMP IS FALSE.
GLOBAL LCH_CLAMP_LIST IS LIST().
GLOBAL LCH_HAS_MODULES IS TRUE.
FUNCTION pTWR {
IF LCH_THR_CONTROL {
LOCAL heregrav IS BODY:MU/((ALTITUDE + BODY:RADIUS)^2).
LOCAL twr IS SHIP:AVAILABLETHRUST / (heregrav * SHIP:MASS).
pOut("Available TWR is " + twr).
pOut("Target TWR is " + OPT_TWR).
} ELSE {
pOut("Throttle not controlled").
}
}
FUNCTION setTWR {
PARAMETER twr IS 2.0.
SET OPT_TWR TO MAX(twr, MIN_TWR).
pTWR().
}
FUNCTION setThrControl {
PARAMETER ctrlS IS TRUE.
SET LCH_THR_CONTROL TO ctrlS.
}
FUNCTION setMaxQControl {
PARAMETER maxqS IS TRUE.
SET LCH_MAXQ_THR TO maxqS.
}
FUNCTION setOrbitSlow {
PARAMETER olS IS TRUE.
SET LCH_ORBIT_SLOW TO olS.
}
FUNCTION launchQ {
RETURN SHIP:Q * CONSTANT:AtmToKPa * 1000.
}
FUNCTION getThrottle {
PARAMETER twr IS OPT_TWR.
IF NOT LCH_THR_CONTROL { RETURN 1. }
IF ALT:RADAR < LCH_PITCH_ALT { RETURN 1. }
IF MAXTHRUST > 0 {
LOCAL heregrav IS BODY:MU/((ALTITUDE + BODY:RADIUS)^2).
LOCAL maxtwr IS MAXTHRUST / (heregrav * SHIP:MASS).
LOCAL sQ IS launchQ().
PRINT " " AT (0,0).
PRINT " " AT (0,1).
PRINT " " + sQ + " " AT (0,2).
PRINT " " + ETA:APOAPSIS + " " AT (0,3).
PRINT " " AT (0,4).
PRINT " " AT (0,5).
IF sQ > LCH_MAXQ_MIN AND LCH_MAXQ_THR {
IF sQ < LCH_MAXQ {
SET twr TO twr * ((LCH_MAXQ - sQ) / (LCH_MAXQ - LCH_MAXQ_MIN))^2.
} ELSE {
SET twr TO 0.
}
}
IF ALTITUDE > LCH_MAX_STEER AND LCH_ORBIT_SLOW {
SET twr TO twr * ((LCH_AP - ALTITUDE) / (LCH_AP - LCH_MAX_STEER))^2.
IF ETA:APOAPSIS < MIN_ETA_APOAPSIS {
SET twr TO twr + (MIN_ETA_APOAPSIS - ETA:APOAPSIS) / 4.
}
}
LOCAL LCH_THR IS MAX(MIN(MAX(twr, MIN_TWR), maxtwr) / maxtwr, MIN_THR).
RETURN LCH_THR.
}
RETURN 0.
}
FUNCTION mThrust {
PARAMETER mt IS -1.
IF mt >= 0 { SET LCH_MAX_THRUST TO mt. }
RETURN LCH_MAX_THRUST.
}
FUNCTION hasFairing {
RETURN LCH_HAS_FAIRING.
}
FUNCTION hasLES {
RETURN LCH_HAS_LES.
}
FUNCTION hasClamp {
RETURN LCH_HAS_CLAMP.
}
FUNCTION hasModules {
RETURN LCH_HAS_MODULES.
}
FUNCTION disableLES {
SET LCH_HAS_LES TO FALSE.
}
FUNCTION checkFairing {
SET LCH_HAS_FAIRING TO FALSE.
LCH_FAIRING_LIST:CLEAR.
SET LCH_FAIRING_LIST TO partListByName("fairing").
SET LCH_HAS_FAIRING TO (SHIP:PARTSTAGGED("LaunchFairing"):LENGTH > 0 OR LCH_FAIRING_LIST:LENGTH > 0) AND CAREER():CANDOACTIONS.
IF LCH_HAS_FAIRING { pOut("Fairing found"). }
}
FUNCTION checkClamp {
SET LCH_HAS_CLAMP TO FALSE.
LCH_CLAMP_LIST:CLEAR.
SET LCH_CLAMP_LIST TO partListByName("clamp").
SET LCH_HAS_CLAMP TO (SHIP:PARTSTAGGED("LaunchClamp"):LENGTH > 0 OR LCH_CLAMP_LIST:LENGTH > 0) AND CAREER():CANDOACTIONS.
IF LCH_HAS_CLAMP { pOut("Clamp found"). }
}
FUNCTION checkLES {
SET LCH_HAS_LES TO FALSE.
SET LCH_HAS_LES TO (SHIP:PARTSTAGGED("LaunchEscapeSystem"):LENGTH > 0 AND CAREER():CANDOACTIONS).
}
FUNCTION launchInit {
PARAMETER ap,az,i.
SET LCH_AP TO MAX(ap, MAX(BODY:ATM:HEIGHT * 1.06, LCH_NOATMO)).
SET LCH_ORBIT_VEL TO SQRT(BODY:MU/(BODY:RADIUS + LCH_AP)).
SET LCH_I TO i.
SET LCH_AN TO (az < 90 OR az > 270 OR ((az = 90 OR az = 270) AND LATITUDE < 0)).
SET LCH_PITCH_ALT TO MAX(BODY:ATM:HEIGHT * LCH_PITCH_ALT_K, ALT:RADAR + 200).
SET LCH_CURVE_ALT TO MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_CURVE_ALT_K.
SET LCH_MAX_STEER TO MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_MAX_STEER_K.
SET LCH_FAIRING_ALT TO MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_FAIRING_ALT_K.
SET LCH_MODULES_ALT TO MAX(BODY:ATM:HEIGHT, LCH_NOATMO) * LCH_MODULES_ALT_K.
checkFairing().
checkClamp().
checkLES().
mThrust(0).
IF runMode() < 0 {
hudMsg("Prepare for launch...").
pOut("Launch to apoasis: " + LCH_AP).
runMode(1).
}
}
FUNCTION launchStaging {
LOCAL mt IS SHIP:MAXTHRUSTAT(0).
LOCAL prev_mt IS mThrust().
IF mt = 0 OR mt < prev_mt {
IF STAGE:READY AND stageTime() > 0.2 {
mThrust(0).
// rcsOn().
// SET SHIP:CONTROL:FORE TO 1.0.
// steerTo(). WAIT 0.25.
doStage().
// WAIT 0.25. SET SHIP:CONTROL:FORE TO 0.0.
// rcsOff().
// steerLaunch().
}
} ELSE IF prev_mt = 0 AND mt > 0 AND stageTime() > 0.2 {
pTWR().
mThrust(mt).
IF hasFairing() { checkFairing(). }
IF hasLES() { checkLES(). }
}
}
FUNCTION launchFairing {
IF ((ALTITUDE > LCH_FAIRING_ALT OR (LCH_FAIRING_PRES_K > launchQ() AND SHIP:AIRSPEED > 200 )) AND hasFairing()) {
steerTo().
LOCAL e IS "сбросить".
LOCAL mn IS "ModuleProceduralFairing".
partEventByTag(e,mn,"LaunchFairing").
FOR p IN LCH_FAIRING_LIST { partEvent(e,mn,p). }
SET e TO "jettison fairing".
SET mn TO "ProceduralFairingDecoupler".
FOR p IN LCH_FAIRING_LIST { partEvent(e,mn,p). }
SET LCH_HAS_FAIRING TO FALSE.
WAIT UNTIL STAGE:READY AND stageTime() > 0.2.
steerLaunch().
}
}
FUNCTION launchModules {
IF ALTITUDE > LCH_MODULES_ALT AND hasModules() {
doPanels(TRUE,"Launch").
doAnt(TRUE,"Launch").
SET LCH_HAS_MODULES TO FALSE.
}
}
FUNCTION sepLauncher {
IF SHIP:PARTSTAGGED("LAUNCHER"):LENGTH > 0 {
steerOrbit().
WAIT UNTIL steerOk().
UNTIL SHIP:PARTSTAGGED("LAUNCHER"):LENGTH = 0 {
WAIT UNTIL STAGE:READY AND stageTime() > 0.5.
doStage().
WAIT 0.
}
WAIT 0.2.
dampSteering().
}
}
FUNCTION launchClamp {
IF LCH_HAS_CLAMP {
UNTIL SHIP:PARTSTAGGED("LaunchClamp"):LENGTH = 0 AND LCH_CLAMP_LIST:LENGTH = 0 {
WAIT UNTIL STAGE:READY AND stageTime() > 0.5.
doStage().
checkClamp().
WAIT 0.
}
}
SET LCH_HAS_CLAMP TO FALSE.
}
FUNCTION launchCirc {
PARAMETER h IS APOAPSIS.
IF NOT HASNODE {
IF h > APOAPSIS { SET h TO APOAPSIS. }
ADD(nodeAlterOrbit(timeHeigth(h), h)).
// LOCAL m_time IS TIME:SECONDS + ETA:APOAPSIS.
// LOCAL v0 IS VELOCITYAT(SHIP,m_time):ORBIT:MAG.
// LOCAL v1 IS SQRT(BODY:MU/(BODY:RADIUS + APOAPSIS)).
// LOCAL n IS NODE(m_time, 0, 0, v1 - v0).
// addNode(n).
}
IF HASNODE { execNode(TRUE). }
}
FUNCTION launchBearing {
LOCAL lat IS SHIP:LATITUDE.
LOCAL vo IS SHIP:VELOCITY:ORBIT.
IF (LCH_I > 0 AND ABS(lat) < 90 AND MIN(LCH_I,180 - LCH_I) >= ABS(lat)) {
LOCAL az IS ARCSIN( COS(LCH_I) / COS(lat) ).
IF NOT LCH_AN { SET az TO mAngle(180 - az). }
IF vo:MAG >= LCH_ORBIT_VEL { RETURN az. }
LOCAL x IS (LCH_ORBIT_VEL * SIN(az)) - VDOT(vo,HEADING(90,0):VECTOR).
LOCAL y IS (LCH_ORBIT_VEL * COS(az)) - VDOT(vo,HEADING(0,0):VECTOR).
RETURN mAngle(90 - ARCTAN2(y, x)).
} ELSE {
IF LCH_I < 90 { RETURN 90. }
ELSE { RETURN 270. }
}
}
FUNCTION launchPitch {
RETURN MIN(90, MAX(0, MAX(90 * (1 - SQRT(ALTITUDE / LCH_CURVE_ALT)), LCH_PITCH_SPEED - VERTICALSPEED))).
}
FUNCTION launchMaxSteer {
LOCAL max_ang IS LCH_MAX_AGL.
LOCAL sQ IS launchQ().
IF sQ > LCH_MAXQ_MIN {
IF sQ < LCH_MAXQ {
SET max_ang TO max_ang * ((LCH_MAXQ - sQ) / (LCH_MAXQ - LCH_MAXQ_MIN))^2.
} ELSE {
SET max_ang TO 3.
}
}
IF ALTITUDE < LCH_MAX_STEER {
SET max_ang TO max_ang * (1 - (LCH_MAX_STEER - ALTITUDE) / LCH_MAX_STEER)^2.
}
RETURN MAX(max_ang, 3).
}
FUNCTION launchSteerUpdate {
IF ALT:RADAR <= LCH_PITCH_ALT {
SET LCH_VEC TO HEADING(launchBearing(),90):VECTOR.
} ELSE {
LOCAL cur_v IS SHIP:VELOCITY:SURFACE.
LOCAL new_v IS HEADING(launchBearing(),launchPitch()):VECTOR.
LOCAL max_ang IS launchMaxSteer().
IF VANG(cur_v,new_v) > max_ang { SET new_v TO ANGLEAXIS(max_ang,VCRS(cur_v,new_v)) * cur_v. }
SET LCH_VEC TO new_v.
}
}
FUNCTION steerLaunch {
steerTo({ RETURN LCH_VEC. }).
}
FUNCTION countdown {
// FROM {LOCAL i IS 10.} UNTIL i = 0 STEP {SET i TO i - 1.} DO {
// PRINT i.
// WAIT 1.
// }
PRINT "start".
}