-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib_skeep.ks
More file actions
92 lines (80 loc) · 2.31 KB
/
lib_skeep.ks
File metadata and controls
92 lines (80 loc) · 2.31 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
@LAZYGLOBAL OFF. // #include init
FOR f IN LIST(
"lib_orbit.ks", // #include lib_orbit
"lib_burn.ks" // #include lib_burn
) { runScript(f,debug()). }
GLOBAL SKEEP_VESSELS IS LIST().
GLOBAL SKEEP_FACTOR IS 1.
FUNCTION listNearbyVessels {
PARAMETER u_time.
SKEEP_VESSELS:CLEAR.
LOCAL all_vessels IS LIST().
LIST TARGETS IN all_vessels.
FOR c IN all_vessels {
IF ORBITAT(c,u_time):BODY = ORBITAT(SHIP,u_time):BODY AND
NOT LIST("LANDED","SPLASHED","PRELAUNCH"):CONTAINS(c:STATUS) AND
(posAt(c,u_time)-posAt(SHIP,u_time)):MAG < 2500 { SKEEP_VESSELS:ADD(c). }
}
RETURN SKEEP_VESSELS:LENGTH.
}
FUNCTION sepTime {
LOCAL start_time IS TIME:SECONDS + 1.
LOCAL u_time IS start_time.
UNTIL listNearbyVessels(u_time) = 0 {
SET u_time TO u_time + 60.
IF u_time - start_time > SHIP:OBT:PERIOD { RETURN 0. }
}
RETURN u_time.
}
FUNCTION minSepAngle {
PARAMETER d.
IF d <= 100 { RETURN 45. }
ELSE IF d <= 500 { RETURN 30. }
RETURN 15.
}
FUNCTION sepBurnOK {
PARAMETER burn_vec, burn_dv, u_time.
FOR c IN SKEEP_VESSELS {
LOCAL c_pos IS posAt(c,u_time)-posAt(SHIP,u_time).
LOCAL v_vec IS velAt(SHIP,u_time)-velAt(c,u_time).
LOCAL v_diff IS (burn_dv * burn_vec) + v_vec.
IF VANG(c_pos,v_diff) < minSepAngle(c_pos:MAG) { RETURN FALSE. }
}
RETURN TRUE.
}
FUNCTION sepBurn {
LOCAL u_time IS bufferTime().
listNearbyVessels(u_time).
LOCAL s_vel IS velAt(SHIP,u_time).
LOCAL dv IS SKEEP_FACTOR * SQRT(s_vel:MAG) / 5.
LOCAL dv_r IS SQRT(2) * dv / 2.
LOCAL pro_vec IS s_vel:NORMALIZED.
LOCAL norm_vec IS VCRS(s_vel,posAt(SHIP,u_time)):NORMALIZED.
LOCAL n IS NODE(u_time, 0, 0, 0).
IF sepBurnOK(norm_vec,dv,u_time) {
SET n:NORMAL TO dv.
} ELSE IF sepBurnOK(pro_vec+norm_vec,dv,u_time) {
SET n:PROGRADE TO dv_r.
SET n:NORMAL TO dv_r.
} ELSE IF sepBurnOK(pro_vec-norm_vec,dv,u_time) {
SET n:PROGRADE TO dv_r.
SET n:NORMAL TO -dv_r.
}
IF nodeDV(n) > dv_r {
addNode(n).
RETURN execNode(FALSE).
}
pOut("Could not plot separation burn.").
RETURN FALSE.
}
FUNCTION doSeparation {
LOCAL ok IS TRUE.
LOCAL sep_time IS sepTime().
IF sep_time = 0 {
SET ok TO sepBurn().
IF ok { SET sep_time TO sepTime(). }
}
IF sep_time > 0 AND ok { doWarp(sep_time). RETURN ok. }
pOut("ERROR: did not achieve separation.").
RETURN FALSE.
}