This is the measured error (board was stationary) versus the best prediction of it. I took pretty long measurements in each position so I don't think that was the limitation. I should perform the 6 point calibration on the accels before doing this to minimize their error but the amount this changes things would make it negligible.
The original average error (measured as the variance of all the measurements after bias correcting) was 0.01 deg/s and after calibration was 0.0088.
% Put in the values output to the debug panel
gyro =[ -0.981886 , 2.29815 , 1.39624 ; ...
-0.952496 , 2.2322 , 1.3745 ; ...
-0.874834 , 2.1702 , 1.3744 ; ...
-0.803864 , 2.11648 , 1.29214 ; ...
-0.796333 , 2.00924 , 1.24306 ; ...
-0.797362 , 1.88595 , 1.21317];
% This should really be the accels _after_ applying the
% six point calibration. Not done yet.
accel = [ -2.42437 , -3.43474 , -9.03572 ; ...
-1.06826 , 8.457 , -4.2369 ; ...
2.39934 , 2.09681 , 9.3421 ; ...
-0.046631 , -9.39648 , -3.70327 ; ...
9.1307 , -2.36368 , -3.64294 ; ...
-8.73273 , -1.45274 , -3.93295];
accel_bias = [0.220775 -0.311232 -0.0199542];
accel = bsxfun(@minus, accel, accel_bias);
% Remove any measurable bias
error = bsxfun(@minus, gyro, mean(gyro,1));
% Use least squares to model the (bias corrected) error from the accels
H = accel \ error
% Show what this model _predicts_ the error to be
ep = accel * H;
% Plot our best prediction of the error
plot(error, ep, '.', 'MarkerSize',17)
xlabel('Measured error');
ylabel('Predicted error');
I'm mostly waiting to hear any reports it makes a tangible difference in leveling.