58 lines
1.7 KiB
Plaintext
58 lines
1.7 KiB
Plaintext
// Provides stabilization functions, including Hover.
|
|
//
|
|
// Must define a global variable 'done', which can be set to true to cancel
|
|
// control functions.
|
|
//
|
|
// Do not include both this and stabilize_rocket.ks in one program.
|
|
|
|
// Helicopter-style point stability control.
|
|
// Hover, ascend, or descend at a fixed rate.
|
|
// Adjusts the throttle to control ascent or descent.
|
|
// Adjusts pitch and roll to maintain zero lateral velocity.
|
|
function Hover {
|
|
parameter vertSpeed is 0.0.
|
|
|
|
set done to false.
|
|
SAS off.
|
|
|
|
// set up PID controllers
|
|
local pitchPID is PIDLoop(5, 0.1, 0.01, -45, 45).
|
|
set pitchPID:SETPOINT to 0.
|
|
|
|
local rollPID is PIDLoop(5, 0.1, 0.01, -70, 70).
|
|
set rollPID:SETPOINT to 0.
|
|
|
|
local collectivePID is PIDLoop(0.1, 0.1, 0.001, 0, 1).
|
|
set collectivePID:SETPOINT to vertSpeed.
|
|
|
|
// keep the craft facing a single direction so vectoring is consistent
|
|
local yaw is mod(360 - SHIP:BEARING, 360).
|
|
|
|
// TOPVECTOR (y) is forward
|
|
// FOREVECTOR (z) is up
|
|
// RIGHTVECTOR (x) is left
|
|
lock axes to lookdirup(SHIP:UP:VECTOR, SHIP:FACING:VECTOR).
|
|
|
|
until done {
|
|
local newPitch is pitchPID:Update(TIME:SECONDS, SHIP:VELOCITY:SURFACE * axes:TOPVECTOR).
|
|
local newRoll is rollPID:Update(TIME:SECONDS, SHIP:VELOCITY:SURFACE * axes:RIGHTVECTOR).
|
|
local newThrot is collectivePID:Update(TIME:SECONDS, SHIP:VERTICALSPEED).
|
|
|
|
print "Forward speed: " + SHIP:VELOCITY:SURFACE * axes:TOPVECTOR.
|
|
print "Lateral speed: " + SHIP:VELOCITY:SURFACE * axes:RIGHTVECTOR.
|
|
|
|
set SHIP:CONTROL:PILOTMAINTHROTTLE to newThrot.
|
|
lock STEERING to Heading(
|
|
yaw,
|
|
-newPitch,
|
|
newRoll
|
|
).
|
|
wait 0.001.
|
|
}
|
|
|
|
unlock STEERING.
|
|
SAS on.
|
|
set done to false.
|
|
print "Stabilized operation ended. Returning control to pilot.".
|
|
}
|