-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib_lander_common.ks
More file actions
91 lines (74 loc) · 2.21 KB
/
lib_lander_common.ks
File metadata and controls
91 lines (74 loc) · 2.21 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
@LAZYGLOBAL OFF. // #include init
GLOBAL LND_G_ACC IS 0.
GLOBAL LND_MIN_VS IS 0.
setTime("LND").
GLOBAL landerHeartBeat IS diffTime@:BIND("LND").
SET landerHeartBeat TO landerHeartBeat().
GLOBAL landerResetTimer IS setTime@:BIND("LND").
FUNCTION landerSetMinVSpeed {
PARAMETER s.
IF s <> LND_MIN_VS {
SET LND_MIN_VS TO s.
pOut("LND_MIN_VS now: " + ROUND(s,1) + "m/s").
}
}
FUNCTION landerMinVSpeed {
RETURN LND_MIN_VS.
}
FUNCTION gravAcc {
RETURN LND_G_ACC.
}
FUNCTION landerPitch {
LOCAL p_ang IS 90.
IF SHIP:AVAILABLETHRUST > 0 {
LOCAL v_x2 IS VXCL(UP:VECTOR,VELOCITY:ORBIT):SQRMAGNITUDE.
LOCAL cent_acc IS v_x2 / (BODY:RADIUS + ALTITUDE).
LOCAL ship_acc IS LND_G_ACC - cent_acc + (LND_MIN_VS - SHIP:VERTICALSPEED).
LOCAL acc_ratio IS ship_acc * MASS / SHIP:AVAILABLETHRUST.
IF acc_ratio < 0 { SET p_ang TO 0. }
ELSE IF acc_ratio < 1 { SET p_ang TO ARCSIN(acc_ratio). }
}
RETURN p_ang.
}
FUNCTION terrainAltAtTime {
PARAMETER u_time.
LOCAL eta1 IS u_time - TIME:SECONDS.
LOCAL spot IS BODY:GEOPOSITIONOF(POSITIONAT(SHIP,u_time)).
LOCAL new_lng IS mAngle(spot:LNG + (eta1 * 360 / BODY:ROTATIONPERIOD)).
RETURN LATLNG(spot:LAT,new_lng):TERRAINHEIGHT.
}
FUNCTION stepTerrainVS {
PARAMETER init_min_vs.
PARAMETER start_time, look_ahead, step.
LOCAL min_vs IS init_min_vs.
LOCAL s_count IS 1 / step.
// LOCAL p IS BODY:ROTATIONPERIOD.
UNTIL s_count > (look_ahead / step) {
LOCAL u_time IS start_time + (s_count * step).
LOCAL time_ahead IS u_time - TIME:SECONDS.
IF time_ahead > 0 {
LOCAL terrain_alt IS terrainAltAtTime(u_time).
LOCAL imp_vs IS (50 + terrain_alt - ALTITUDE) / time_ahead.
SET min_vs TO MAX(min_vs, imp_vs+(2*LND_G_ACC)).
}
SET s_count TO s_count + 1.
}
RETURN min_vs.
}
FUNCTION findMinVSpeed {
PARAMETER init_min_vs.
PARAMETER look_ahead, step.
LOCAL u_time IS TIME:SECONDS.
LOCAL min_vs IS stepTerrainVS(init_min_vs,u_time,15,0.5).
SET min_vs TO stepTerrainVS(min_vs,u_time,look_ahead,step).
landerSetMinVSpeed(min_vs).
}
FUNCTION initLanderValues {
LOCK LND_G_ACC TO BODY:MU / (BODY:RADIUS+ALTITUDE)^2.
landerResetTimer().
WAIT 0.
}
FUNCTION stopLanderValues {
UNLOCK LND_G_ACC.
WAIT 0.
}