-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMun1.ks
executable file
·280 lines (238 loc) · 8.73 KB
/
Mun1.ks
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
Wait 1.
print "3".
Wait 1.
print "2".
Wait 1.
print "1".
Wait 1.
print ">>>POEHALI<<<".
//первая ступень отрабатывает тангаж от 90 до 30 градусов по мере расхода топлива.
//Апоапсис в результате получится около 75 км. Это чисто опытная подгонка (да, нубство, хехе)
STAGE.
LOCK Throttle to 1.
LOCK Steering to Heading(90, 90).
WAIT UNTIL Ship:Altitude>10000.
SET MaxFuel to STAGE:OXIDIZER.
LOCK Steering to Heading(90,90-80*(1-STAGE:OXIDIZER/MaxFuel)).
WAIT UNTIL STAGE:OXIDIZER<1.
LOCK Steering to PROGRADE.
LOCK Throttle to 0.
WAIT 1.
STAGE.
//Ждем апоапсиса
UNTIL ETA:Apoapsis<1
{
clearscreen.
print "ETA:Apo: " + ETA:Apoapsis.
}
//Начинаем циркуляризацию
STAGE.
LOCK Throttle to 1.
set StopBurn to false.
until StopBurn
{
Set CirkData to ApoBurn. //Достаем данные по тангажу и прочее из функции ApoBurn
if CirkData[4]<0
set StopBurn to true. //Если достигли 1й космической, то стоп.
else if CirkData[4]<100 //Если дельта до 1й космической менее 100м/с, то начинаем плавно снижать тягу.
LOCK Throttle to Max(CirkData[4]/100, 0.01).
LOCK Steering to Heading(90, CirkData[0]). //Угол тагажа выставляем по данным, возвращенным функцией.
// Чего возвращает ApoBurn
// 0 1 2 3 4 5
// RETURN LIST(Fi, Vh, Vz, Vorb, dVh, DeltaA).
clearscreen.
print "Fi: "+CirkData[0].
print "Vh: "+CirkData[1].
print "Vz: "+CirkData[2].
print "Vorb: "+CirkData[3].
print "dVh: "+CirkData[4].
print "DeltaA: "+CirkData[5].
}
//Мы на орбите, выключаем тягу.
LOCK Throttle to 0.
Set SHIP:CONTROL:PILOTMAINTHROTTLE to 0.
unlock steering.
WAIT 1.
clearscreen.
print "WE'RE ON ORBIT!".
WAIT 5.
print "Apoapsis: " + Ship:Orbit:Apoapsis.
WAIT 1.
print "Periapsis: " + Ship:Orbit:Periapsis.
WAIT 1.
print "Eccentricity: " + Ship:Orbit:Eccentricity.
WAIT 5.
print "Time to patch Orbit.".
WAIT 5.
PatchOrbit(true).
clearscreen.
clearvecdraws().
WAIT 1.
print "Apoapsis: " + Ship:Orbit:Apoapsis.
WAIT 1.
print "Periapsis: " + Ship:Orbit:Periapsis.
WAIT 1.
print "Eccentricity: " + Ship:Orbit:Eccentricity.
WAIT 5.
LOCK Steering TO PROGRADE.
print "Calculating munar angle...".
WAIT 10.
UNTIL CheckMunAngle
{
WAIT 1.
clearscreen.
}
print "Transfer start!".
SET Man_point TO PROGRADE.
LOCK Steering TO Man_point.
WAIT 10.
set the_mun to body("Mun").
UNTIL ORBIT:Apoapsis>the_mun:Altitude
{
if (orbit:Apoapsis/the_mun:Altitude<0.9)
{
Lock Throttle to 1.
}
else{
Lock Throttle to 0.1.
}
}
set SHIP:CONTROL:PILOTMAINTHROTTLE to 0.
set Throttle to 0. WAIT 1.
print "Transfer burn complete, We're on the way to Mun!".
UNTIL (Ship:Body=the_mun) and (Ship:Altitude<1000000)
{
WAIT 10.
}
print "Deploy antenna".
TOGGLE LIGHTS.
WAIT 10.
print "Lets farm science from Mun high orbit".
ScienceExp("Goo1", TRUE).
ScienceExp("Therm1", TRUE).
ScienceExp("Bar1", TRUE).
ScienceExp("SC1", TRUE).
UNTIL (Ship:Body=the_mun) and (Ship:Altitude<12000)
{
WAIT 10.
}
print "Lets farm science from Mun low orbit".
ScienceExp("Goo2", TRUE).
ScienceExp("Therm2", TRUE).
ScienceExp("Bar2", TRUE).
print "FAREWELL..".
function CalculateMunAngle
{
SET A1 to (2*body("Kerbin"):radius + body("Mun"):altitude + ship:altitude)/2.
SET A2 to body("Kerbin"):radius+body("Mun"):altitude.
return 180*(1 - (A1/A2)^1.5).
}
FUNCTION CheckMunAngle
{
set VecS to Ship:position-body("Kerbin"):position.
set VecM to body("Mun"):position-body("Kerbin"):position.
set VecHV to VXCL(ship:up:vector, ship:velocity:orbit).
set VecSM to body("Mun"):position-Ship:position.
set m_angle to CalculateMunAngle.
set cur_angle to VANG(VecM,VecS).
if VANG(VecHV,VecSM)>90
set cur_angle to -cur_angle.
print "Munar angle: " + m_angle.
print "Current angle: " + cur_angle.
return ABS(cur_angle - m_angle) < 3.
}
//Считает угол к горизонту в апоцентре при циркуляризации.
FUNCTION ApoBurn
{
set Vh to VXCL(Ship:UP:vector, ship:velocity:orbit):mag. //Считаем горизонтальную скорость
set Vz to ship:verticalspeed. // это вертикальная скорость
set Rad to ship:body:radius+ship:altitude. // Радиус орбиты.
set Vorb to sqrt(ship:body:Mu/Rad). //Это 1я косм. на данной высоте.
set g_orb to ship:body:Mu/Rad^2. //Ускорение своб. падения на этой высоте.
set ThrIsp to EngThrustIsp. //EngThrustIsp возвращает суммарную тягу и средний Isp по всем активным двигателям.
set AThr to ThrIsp[0]*Throttle/(ship:mass). //Ускорение, которое сообщают ракете активные двигатели при тек. массе.
set ACentr to Vh^2/Rad. //Центростремительное ускорение.
set DeltaA to g_orb-ACentr-Max(Min(Vz,2),-2). //Уск своб падения минус центр. ускорение с поправкой на гашение вертикальной скорости.
set Fi to arcsin(DeltaA/AThr). // Считаем угол к горизонту так, чтобы держать вертикальную скорость = 0.
set dVh to Vorb-Vh. //Дельта до первой косм.
RETURN LIST(Fi, Vh, Vz, Vorb, dVh, DeltaA). //Возвращаем лист с данными.
}
//EngThrustIsp возвращает суммарную тягу и средний Isp по всем активным двигателям.
FUNCTION EngThrustIsp
{
//создаем пустой лист ens
set ens to list().
ens:clear.
set ens_thrust to 0.
set ens_isp to 0.
//запихиваем все движки в лист myengines
list engines in myengines.
//забираем все активные движки из myengines в ens.
for en in myengines {
if en:ignition = true and en:flameout = false {
ens:add(en).
}
}
//собираем суммарную тягу и Isp по всем активным движкам
for en in ens {
set ens_thrust to ens_thrust + en:availablethrust.
set ens_isp to ens_isp + en:isp.
}
//Тягу возвращаем суммарную, а Isp средний.
RETURN LIST(ens_thrust, ens_isp/ens:length).
}
// Эта функция активирует науч модуль с указанным именем
FUNCTION ScienceExp
{
PARAMETER SciBlockName. // Принимаем имя термометра
PARAMETER Transmit. //Транслировать или сохранить данные эксперимента.
set SciBlock to ship:partsTagged(SciBlockName)[0]. // Находим соотв. деталь корабля и помещаем в переменную gradusnik
set ScienceModule to SciBlock:GetModule("ModuleScienceExperiment"). // Находим внутри этой части модуль, отвечающий за "науку".
ScienceModule:DEPLOY. // Активируем его.
IF Transmit {
WAIT UNTIL ScienceModule:HASDATA.
if ADDONS:RT:HASCONNECTION(SHIP){
ScienceModule:TRANSMIT.
PRINT "Science data from " + SciBlockName + " transmitted to KSC".}
else {
PRINT "!!! NO CONNECTION !!!".
}
}
ELSE PRINT "Science data stored in " + SciBlockName.
}
FUNCTION PatchOrbit
{
DECLARE PARAMETER DoPatch IS FALSE.
set StopBurn to false.
UNTIL StopBurn
{
set ThrIsp to EngThrustIsp. //EngThrustIsp возвращает суммарную тягу и средний Isp по всем активным двигателям.
set AThr to ThrIsp[0]/(ship:mass). //Ускорение, которое сообщают ракете активные двигатели при тек. массе.
set V1 to ship:velocity:orbit.
set V2 to VXCL(Ship:UP:vector, ship:velocity:orbit):NORMALIZED*sqrt(ship:body:Mu/(ship:body:radius+ship:altitude)).
set vecCorrection to V2-V1.
clearscreen.
print "Correction: " + vecCorrection:MAG.
SET CV TO VECDRAWARGS(V(0,0,0), vecCorrection:NORMALIZED*10, RGB(1,0,0), "Delta: "+vecCorrection:MAG + " m/s" , 1.0, TRUE, 0.2).
if DoPatch
{
if SAS TOGGLE SAS.
LOCK Steering to vecCorrection.
if VANG(vecCorrection, ship:facing:forevector)<1
if AThr>0
LOCK Throttle to min(max(vecCorrection:MAG/(AThr*5), 0.0001),1).
else
LOCK Throttle to 0.
}
print "Apoapsis: " + Ship:Orbit:Apoapsis.
print "Periapsis: " + Ship:Orbit:Periapsis.
print "Eccentricity: " + Ship:Orbit:Eccentricity.
if (vecCorrection:MAG<0.001) OR (NOT DoPatch)
{
set StopBurn to true.
}
}
LOCK Throttle to 0.
Set SHIP:CONTROL:PILOTMAINTHROTTLE to 0.
UNLOCK Steering.
}