function [params] = genRdnAccelParams(fsRange, typBiasX, typBiasY, typBiasZ, typSFcalibErrPerc, typNonOrthogAngleDeg, typMisalignAngleDeg, distribution)
%GENRDNACCELPARAMS Generates random bias, scale factor, nonorthogonality
%and misalignment parameters for the accelerometer calibration model.

if distribution == "uniform"
    % Biases
    params.b_x = -typBiasX + (2 * typBiasX)*rand; % uniform distribution from the typical bias values
    params.b_y = -typBiasY + (2 * typBiasY)*rand;
    params.b_z = -typBiasZ + (2 * typBiasZ)*rand;

    % Scale factors
    SFdev = (fsRange / 9.81) * (typSFcalibErrPerc / 100);
    params.s_xx = 1 + (-SFdev + (2 * SFdev)*rand);
    params.s_yy = 1 + (-SFdev + (2 * SFdev)*rand);
    params.s_zz = 1 + (-SFdev + (2 * SFdev)*rand);

    % Nonorthogonality
    params.alpha = deg2rad(-typNonOrthogAngleDeg + 2*typNonOrthogAngleDeg*rand); % in rad
    params.beta = deg2rad(-typNonOrthogAngleDeg + 2*typNonOrthogAngleDeg*rand);
    params.gamma = deg2rad(-typNonOrthogAngleDeg + 2*typNonOrthogAngleDeg*rand);

    % Misalignment
    params.r = -typMisalignAngleDeg + 2*typMisalignAngleDeg*rand; % in deg
    params.p = -typMisalignAngleDeg + 2*typMisalignAngleDeg*rand;
    params.y = -typMisalignAngleDeg + 2*typMisalignAngleDeg*rand;

    T_est = makeTmatrix(params.alpha, params.beta, params.gamma); % [T] (nonorthogonality matrix as in Syed et al., 2007)

    params.Misalignment = rotx(params.r) * roty(params.p) * rotz(params.y); % [M] (misalignment angles in degrees) XYZ order!

    params.AxesMisalignment = ([params.s_xx 0 0;0 params.s_yy 0; 0 0 params.s_zz] * T_est * params.Misalignment);

elseif distribution == "normal"
    % Biases
    params.b_x = normrnd(0, typBiasX);
    params.b_y = normrnd(0, typBiasY);
    params.b_z = normrnd(0, typBiasZ);

    % Scale factors
    SFdev = (fsRange / 9.81) * (typSFcalibErrPerc / 100); % * 2 because is as a % of FS
    params.s_xx = normrnd(1, SFdev);
    params.s_yy = normrnd(1, SFdev);
    params.s_zz = normrnd(1, SFdev);

    % Nonorthogonality
    params.alpha = deg2rad(normrnd(0, typNonOrthogAngleDeg)); % in rad
    params.beta = deg2rad(normrnd(0, typNonOrthogAngleDeg));
    params.gamma = deg2rad(normrnd(0, typNonOrthogAngleDeg));

    % Misalignment
    params.r = normrnd(0, typMisalignAngleDeg); % in deg
    params.p = normrnd(0, typMisalignAngleDeg);
    params.y = normrnd(0, typMisalignAngleDeg);

    T_est = makeTmatrix(params.alpha, params.beta, params.gamma); % [T] (nonorthogonality matrix as in Syed et al., 2007)

    params.Misalignment = rotx(params.r) * roty(params.p) * rotz(params.y); % [M] (misalignment angles in degrees) XYZ order!

    params.AxesMisalignment = ([params.s_xx 0 0;0 params.s_yy 0; 0 0 params.s_zz] * T_est * params.Misalignment);

elseif distribution == "constant"
    % Biases
    params.b_x = 0.12;
    params.b_y = -0.1;
    params.b_z = 0.2;

    % Scale factors
    params.s_xx = 1.005;
    params.s_yy = 0.998;
    params.s_zz = 1.008;

    % Nonorthogonality
    params.alpha = deg2rad(0.2); % in rad
    params.beta = deg2rad(0.3);
    params.gamma = deg2rad(-0.1);

    % Misalignment
    params.r = 0.1; % in deg
    params.p = -0.2;
    params.y = 0.2;

    T_est = makeTmatrix(params.alpha, params.beta, params.gamma); % [T] (nonorthogonality matrix as in Syed et al., 2007)

    params.Misalignment = rotx(params.r) * roty(params.p) * rotz(params.y); % [M] (misalignment angles in degrees) XYZ order!

    params.AxesMisalignment = ([params.s_xx 0 0;0 params.s_yy 0; 0 0 params.s_zz] * T_est * params.Misalignment);

else

    error('Specify a valid IMU error parameter error distribution.');
    
end