function data = full_calibration_data(noise_mult) % Synthetic data to use with full\_calibration.m % pose of the laser data.true_laser = [0.2; 0.02; deg2rad(5)]; data.true_laser = [0; 0; -deg2rad(0.5)]; % radius data.true_r_l = 0.02; data.true_r_r = 0.0205; % distance between wheels data.true_d = 0.09; % noise: scan matching error data.true_std_laser = noise_mult * diag([0.01 0.01 deg2rad(1)]); % noise: axis measurement error data.true_std_phi = noise_mult * 0.01; % noise: unmodeled slip data.true_std_unmodeled = noise_mult * diag([0.002 0.002 deg2rad(0.2)]); % generate measurements data.n = 700; data.true_phi_r =0.3*( 1 + rand(1, data.n)); data.true_phi_l =0.3*( -1 + rand(1, data.n)); for i=1:data.n if i < data.n * 0.5 data.true_phi_r(i) = - data.true_phi_r(i); data.true_phi_l(i) = - data.true_phi_l(i); else end end data.phi_r = data.true_phi_r + data.true_std_phi * randn(1, data.n); data.phi_l = data.true_phi_l + data.true_std_phi * randn(1, data.n); data.T = repmat(1,1,data.n) + 0.1 * randn(1, data.n); data.true_v0 = (0.5*data.true_r_l) * data.true_phi_l + ... (0.5*data.true_r_r) * data.true_phi_r; data.true_w0 = (data.true_r_l/data.true_d) * data.true_phi_l + ... (-data.true_r_r/data.true_d) * data.true_phi_r; for k=1:data.n v0 = data.true_v0(k); w0 = data.true_w0(k); T = data.T(k); if abs(w0 * T) > 1e-7 o(1,1) = (v0 * T) * ( sin(w0*T) / (w0*T) ); o(2,1) = (v0 * T) * (1-cos(w0*T))/ (w0*T); else o(1,1) = (v0 * T); o(2,1) = 0; end o(3,1) = w0 * T; % the true displacement takes into account an unmodeled slip data.true_spost(:,k) = o; data.true_od(:,k) = o + data.true_std_unmodeled * randn(3,1); data.true_sm(:,k) = oplus( ... oplus( ... ominus( data.true_laser), ... data.true_od(:,k) ... ), ... data.true_laser); data.sm(:,k) = data.true_sm(:,k) + data.true_std_laser * randn(3,1); end data.true_params = [data.true_d;data.true_r_l;data.true_r_r;data.true_laser];