function [estParams] = syed_2007(trajData, accel_MPU, initCalibParams, maxIter)
%SYED_2007 Uses nonlinear least squares solver (least squares adjustment)
%as per Syed et al. 2007.
addpath('syed_2007\');

% rng default % for reproductability

%% Get accelerations for each position
av_acc = computeAvAccels(trajData, accel_MPU);
%% Optimisation
% Initialise parameters:
initCalibParams = [initCalibParams.alpha initCalibParams.beta initCalibParams.gamma initCalibParams.s_xx initCalibParams.s_yy initCalibParams.s_zz, ...
                   initCalibParams.b_x initCalibParams.b_y initCalibParams.b_z]; % supply in vector form for the optimisation algorithm

calibParams = least_squares_adjustment(av_acc, initCalibParams, maxIter, 1e-6);

T_est = makeTmatrix(calibParams(1), calibParams(2), calibParams(3));

S_est = [calibParams(4) 0 0; 0 calibParams(5) 0; 0 0 calibParams(6)] * T_est; % axis sensitivites matrix

b_est = [calibParams(7) calibParams(8) calibParams(9)];

% Return the estimated parameters
estParams.Bias = b_est; estParams.AxesMisalignment = S_est;

% Return individual calibration components:
estParams.ScaleFactors = [calibParams(4) calibParams(5) calibParams(6)]; estParams.NonorthogAngles = [calibParams(1) calibParams(2) calibParams(3)];
end