0. A 'brute force' methold of removing tip/tilt from the WFS signal. 1. summary of pr_servo_remove_tt // make modifed signal[s] - take out tilt-from using signal data. data.tt.model[a] = data.signal[s] * data.tt_inverse_model[a][s] signal[s] = data.tt_mat_model[s][a] * data.tt_model[a] signal[s] = data.signal[s] - signal[s]. // output primary out data.delta_drive[a] = pr_sign * data.inverse[a][s] * signal[s] data.primary_out[a] = data.delta_drive[a] * pr_gain 2. source code: /*------------------------------------------------------------------ ** pr_servo_remove_tt() - performs the primary loop. but first tries ** to remove the tt information from the sigal[s] data. **------------------------------------------------------------------ */ static int pr_servo_remove_tt( lp_shmem_t * lp ) { int a, s; double total, out; double signal[AO_NUM_SENSORS]; lp->status.lp_indicator = 0x02; /****************************************************************** ** remove tiptilt information from signal[s] data using modeled ** tt inverse and imats. ****************************************************************** */ /*--------------------------------------------------------------- ** tt.model[a] = signal[s] * tt_inverse_model[a][s] ** tt.model is model delta drive. */ for( a=0; adata.tt_inverse_model[a][s] * lp->data.signal[s]; lp->data.tt_model[a] = total; } /*--------------------------------------------------------------- ** signal[s] = tt_mat_model[s][a] * tt_model[a] ** signal contains _only_ the tt information. */ for (s=0; sdata.tt_imat_model[s][a] * lp->data.tt_model[a]; signal[s] = total; } /*--------------------------------------------------------------- ** signal[s] = data.signal[s] - signal[s]. ** signal[s] is data.signal[s] with all tiptilt information removed. */ for (s=0; sdata.signal[s] - signal[s]; } /****************************************************************** * perform primary loop using modified signal[s] ****************************************************************** */ /*-------------------------------------------------------- ** delta_drive[a] = pr_sign * inverse[a][s] * signal[s] ** Note: using modified signal[s] */ for (a=0; adata.inverse[a][s] * signal[s]; lp->data.delta_drive[a] = lp->parm.pr_sign * total; } /*-------------------------------------------- ** primary_out[a] = delta_drive[a] * pr_gain */ if( lp->parm.primary_servo ) { for( a=0; adata.primary_out[a] + (lp->data.delta_drive[a] * lp->parm.pr_gain); set_primary_out( lp, a, out ); } } return 0; }