void dgnss_init_known_baseline2(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]) { double ref_ecef[3]; ref_ecef[0] = receiver_ecef[0] + 0.5 * b[0]; ref_ecef[1] = receiver_ecef[1] + 0.5 * b[1]; ref_ecef[2] = receiver_ecef[2] + 0.5 * b[2]; sdiff_t corrected_sdiffs[num_sats]; u8 old_prns[MAX_CHANNELS]; memcpy(old_prns, sats_management.prns, sats_management.num_sats * sizeof(u8)); //rebase globals to a new reference sat (permutes corrected_sdiffs accordingly) dgnss_rebase_ref(num_sats, sdiffs, ref_ecef, old_prns, corrected_sdiffs); double dds[2*(num_sats-1)]; make_measurements(num_sats-1, corrected_sdiffs, dds); double DE[(num_sats-1)*3]; s32 N[num_sats-1]; assign_de_mtx(num_sats, corrected_sdiffs, ref_ecef, DE); amb_from_baseline(num_sats, DE, dds, b, N); printf("Known Base: ["); for (u8 i=0; i<num_sats-1; i++) printf("%d, ", N[i]); printf("]\n"); /* Construct fake state means. */ double state_mean[num_sats-1+6]; memcpy(&state_mean[0], b, 3 * sizeof(double)); memset(&state_mean[3], 0, 3 * sizeof(double)); for (u8 i=0; i<num_sats-1; i++) { state_mean[i+6] = N[i]; } /* Construct fake covariance U factor (just identity). */ double state_cov_U[(num_sats-1+6)*(num_sats-1+6)]; eye(num_sats-1+6, state_cov_U); double state_cov_D[num_sats-1+6]; memset(state_cov_D, 0, 6 * sizeof(double)); for (u32 i=0; i<num_sats-1; i++) { state_cov_D[i+6] = 1.0 / 64.0; } dgnss_reset_iar(); update_ambiguity_test(ref_ecef, dgnss_settings.phase_var_test, dgnss_settings.code_var_test, &ambiguity_test, num_sats-1+6, &sats_management, corrected_sdiffs, state_mean, state_cov_U, state_cov_D); }
void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]) { double ref_ecef[3]; ref_ecef[0] = receiver_ecef[0] + 0.5 * b[0]; ref_ecef[1] = receiver_ecef[1] + 0.5 * b[1]; ref_ecef[2] = receiver_ecef[2] + 0.5 * b[2]; sdiff_t corrected_sdiffs[num_sats]; u8 old_prns[MAX_CHANNELS]; memcpy(old_prns, sats_management.prns, sats_management.num_sats * sizeof(u8)); //rebase globals to a new reference sat (permutes corrected_sdiffs accordingly) dgnss_rebase_ref(num_sats, sdiffs, ref_ecef, old_prns, corrected_sdiffs); double dds[2*(num_sats-1)]; make_measurements(num_sats-1, corrected_sdiffs, dds); double DE[(num_sats-1)*3]; assign_de_mtx(num_sats, corrected_sdiffs, ref_ecef, DE); dgnss_reset_iar(); memcpy(&ambiguity_test.sats, &sats_management, sizeof(sats_management)); hypothesis_t *hyp = (hypothesis_t *)memory_pool_add(ambiguity_test.pool); hyp->ll = 0; amb_from_baseline(num_sats, DE, dds, b, hyp->N); double obs_cov[(num_sats-1) * (num_sats-1) * 4]; memset(obs_cov, 0, (num_sats-1) * (num_sats-1) * 4 * sizeof(double)); u8 num_dds = num_sats-1; for (u8 i=0; i<num_dds; i++) { for (u8 j=0; j<num_dds; j++) { u8 i_ = i+num_dds; u8 j_ = j+num_dds; if (i==j) { obs_cov[i*2*num_dds + j] = dgnss_settings.phase_var_test * 2; obs_cov[i_*2*num_dds + j_] = dgnss_settings.code_var_test * 2; } else { obs_cov[i*2*num_dds + j] = dgnss_settings.phase_var_test; obs_cov[i_*2*num_dds + j_] = dgnss_settings.code_var_test; } } } init_residual_matrices(&ambiguity_test.res_mtxs, num_sats-1, DE, obs_cov); /*printf("Known Base: [");*/ /*for (u8 i=0; i<num_sats-1; i++)*/ /*printf("%d, ", hyp->N[i]);*/ /*printf("]\n");*/ }
END_TEST START_TEST(test_amb_from_baseline) { double N_true[] = {22, 23, 34, -123}; u8 num_dds = sizeof(N_true)/sizeof(N_true[0]); s32 N[num_dds]; double DE[] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1}; double b[3] = {1, 1, 1}; double dd_obs[num_dds]; predict_carrier_obs(num_dds, N_true, DE, b, dd_obs); amb_from_baseline(num_dds, DE, dd_obs, b, N); for (u8 i=0; i<num_dds; i++) { fail_unless(fabs(N_true[i] - N[i]) < TOL, "Ambiguity mismatch: %ld vs %lf", N[i], N_true[i]); } }