With apologies to ML:
iteration :: setpoint -> system-state -> system-state
iteration sp sys = let
control-output = control (sp, sys.control-state, sys.dynamic-state)
control-state' = fst control-output
control-signal = snd control-output
dynamic-state' = plant (control-signal, sys.dynamic-state) in
(control-state', dynamic-state')
control :: (setpoint, control-state, dynamic-state) -> (control-state, control-signal)
control = <the controller>
plant :: (control-signal, dynamic-state) -> dynamic-state
plant = <the physics simulator>
type system-state =
(control-state, dynamic-state)
setpoint
is more or less a bunch of constants.control-state
is accumulated controller integrals etcdynamic-state
is positions, velocities, forces, orientation, angular velocities, torques, etccontrol-signal
is all the effector outputs