pyrtc.corrector_splitter
Drive several wavefront correctors from one loop (woofer/tweeter, tip-tilt offload).
The loop controls one modal vector. A CorrectorSplitter in the
loop’s wfc section owns that stream. It is the concatenation of each
corrector’s modes, in the order they are listed, and the splitter writes
each corrector its slice every frame. The interaction matrix therefore
calibrates every corrector’s modes, because each poke reaches the right
device, and the loop needs no changes.
Offloading moves content from one corrector (the source, e.g. a tweeter)
to another (the target, e.g. a woofer or a tip-tilt stage) without changing
the wavefront. The coupling matrix C (source modes x target modes) gives
the source-mode equivalent of one unit of each target mode.
CorrectorSplitter.set_coupling_from_im() estimates it from the loop’s
IM as pinv(IM_source) @ IM_target. Each frame, with offload gain g:
source_out = source_loop - C @ offload target_out = target_loop + offload offload += g * pinv(C) @ source_out
The target takes over, at rate g, the part of the source command it can
represent, and the source is left with the rest. A configured gain
takes effect once the coupling is set, so calibrate the IM first (its pokes
must reach the correctors unchanged), then call set_coupling_from_im.
Config (wfc section):
wfc:
class_name: pyrtc.corrector_splitter.CorrectorSplitter
correctors:
- {name: woofer, stream: woofer_wfc, modes: 20}
- {name: tweeter, stream: tweeter_wfc, modes: 60}
offload: {source: tweeter, target: woofer, gain: 0.02} # optional
functions: [split]
Each corrector is an ordinary wavefront-corrector section whose wfc
input stream is the listed stream.
Classes
|
Split the loop's modal command across several correctors, with offloading. |