-
Notifications
You must be signed in to change notification settings - Fork 0
/
offset_steering.ks
83 lines (75 loc) · 2.99 KB
/
offset_steering.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
function offsetSteering
{
parameter dirtosteer. // The direction you want the ship to steer to
local newdirtosteer is dirtosteer. // Return value. Defaults to original direction.
local oss is lexicon(). // Used to store all persistent data
local trueacc is 0. // Used to store ship acceleration vector
if exists("oss.json")
{ // Looks for saved data
set oss to readjson("oss.json").
if (oss["Ship_Name"] <> ship:name:tostring) set oss to initoss().
}
else set oss to initoss().
local dt is time:seconds - oss["t0"].
if (dt > oss["Average_Interval"])
{
// This section takes the average of the offset, resets the average counters and resets the timer.
set oss["t0"] to TIME:SECONDS.
if (oss["Average_samples"] > 0)
{
// Pitch
set oss["pitch_angle"] to oss["pitch_sum"] / oss["Average_samples"].
set oss["pitch_sum"] to oss["pitch_angle"].
// Yaw
set oss["yaw_angle"] to oss["yaw_sum"] / oss["Average_samples"].
set oss["yaw_sum"] to oss["yaw_angle"].
// Sample count
set oss["Average_samples"] to 1.
// Increases the Average interval to try to keep the adjusts more smooth.
if (oss["Average_Interval"] < oss["Average_Interval_Max"]) {
set oss["Average_Interval"] to max(oss["Average_Interval_Max"], oss["Average_Interval"]+dt) .
}
}
}
else
{
// Accumulate the thrust offset error to be averaged by the section above
// exclude the left/right vector to leave only forwards and up/down
set trueacc to ship:sensors:acc - ship:sensors:grav.
local pitch_error_vec is vxcl(facing:starvector, trueacc).
local pitch_error_ang is vang(facing:vector, pitch_error_vec).
// exclude the up/down vector to leave only forwards and left/right
local yaw_error_vec is vxcl(facing:topvector, trueacc).
local yaw_error_ang is vang(facing:vector, yaw_error_vec).
set oss["pitch_sum"] to oss["pitch_sum"] + pitch_error_ang.
set oss["yaw_sum"] to oss["yaw_sum"] + yaw_error_ang.
set oss["Average_samples"] to oss["Average_samples"] + 1.
}
// Set the return value to original direction combined with the thrust offset
set newdirtosteer to dirtoSTEER * r(0-oss["pitch_angle"],oss["yaw_angle"],0).
// Saves the persistent values to a file.
writejson(oss,"oss.json").
return newdirtosteer.
}
function initoss
{
// Initialize persistent data.
local oss is lexicon().
oss:add("t0", time:seconds).
oss:add("pitch_angle", 0).
oss:add("pitch_sum", 0).
oss:add("yaw_angle", 0).
oss:add("yaw_sum", 0).
oss:add("Average_samples", 0).
oss:add("Average_Interval", 1).
oss:add("Average_Interval_Max", 10).
oss:add("Ship_Name",ship:name:tostring).
return oss.
}
function resetOSS
{
if exists("oss.json")
{
deletepath("oss.json").
}
}