gps_pvt 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d2ab5f33d6ba6233e7a52b05ac2f89306e181240bb2510d6ffe697467278178
4
- data.tar.gz: d592b929d56554cb3a1e82e734d90366e32ac083eeacfc8535457a5518952075
3
+ metadata.gz: 14551de3c8e0eae8a584044249ff80a04e5c834929ec7968b39839aa611b3050
4
+ data.tar.gz: 0c82a31aec65f372d5221d5c6c7ef8e0fa72d6b5fa4d5d6f5d2174ad7a6cfa82
5
5
  SHA512:
6
- metadata.gz: 826e7a745be07aad5c86b075e5285d0e31212b6fe83cce8c7af67b500645a698e2c60bd67e6f0ecc6ccd114db2754286941c9e90a72deab7b3219132028cf242
7
- data.tar.gz: f11f9c72d8bd30f72e77969eb694ce5a5b7d25db5b251e275b2840511d1836275ba5d7adf1829cbeef691f423c7ddf3a5defbb8919f8bd93bc6cd532649bbd4b
6
+ metadata.gz: fb245345b2d07710c7df3419eefee79720b63dc9820776612d0d5e9270d1f2186f54abd4d92f8e6967457b54f8b3fc5ea2fa3448232780847c6e57b66b42a116
7
+ data.tar.gz: a3f6edf6a85ef786305f15788a4e4b28d32287ec9727d2b3f2885ac3653524c264b10f82c6dcd009ee32c8cab956c6e1dcc8c14025495027a80b3d10100e89f0
@@ -4171,6 +4171,19 @@ SWIGINTERN VALUE GPS_Solver_Sl_double_Sg__get_correction(GPS_Solver< double > co
4171
4171
  SWIGINTERN VALUE GPS_Solver_Sl_double_Sg__set_correction(GPS_Solver< double > *self,VALUE hash){
4172
4172
  return self->update_correction(true, hash);
4173
4173
  }
4174
+ SWIGINTERN GPS_Solver< double >::super_t::options_t GPS_Solver_Sl_double_Sg__get_options(GPS_Solver< double > const *self){
4175
+ return self->available_options();
4176
+ }
4177
+ SWIGINTERN GPS_Solver< double >::super_t::options_t GPS_Solver_Sl_double_Sg__set_options(GPS_Solver< double > *self,VALUE obj){
4178
+ GPS_Solver<double>::super_t::options_t opt(self->available_options());
4179
+
4180
+ if(!RB_TYPE_P(obj, T_HASH)){SWIG_exception(SWIG_TypeError, "Hash is expected");}
4181
+ SWIG_AsVal_bool (
4182
+ rb_hash_lookup(obj, ID2SYM(rb_intern("skip_exclusion"))),
4183
+ &opt.skip_exclusion);
4184
+
4185
+ return self->update_options(opt);
4186
+ }
4174
4187
  SWIGINTERN unsigned int SBAS_Ephemeris_Sl_double_Sg__set_svid(SBAS_Ephemeris< double > *self,unsigned int const &v){
4175
4188
  return self->svid = v;
4176
4189
  }
@@ -17225,6 +17238,100 @@ fail:
17225
17238
  }
17226
17239
 
17227
17240
 
17241
+ /*
17242
+ Document-method: GPS_PVT::GPS::Solver.options
17243
+
17244
+ call-seq:
17245
+ options -> GPS_Solver< double >::super_t::options_t
17246
+
17247
+ An instance method.
17248
+
17249
+ */
17250
+ SWIGINTERN VALUE
17251
+ _wrap_Solver_options(int argc, VALUE *argv, VALUE self) {
17252
+ GPS_Solver< double > *arg1 = (GPS_Solver< double > *) 0 ;
17253
+ void *argp1 = 0 ;
17254
+ int res1 = 0 ;
17255
+ GPS_Solver< double >::super_t::options_t result;
17256
+ VALUE vresult = Qnil;
17257
+
17258
+ if ((argc < 0) || (argc > 0)) {
17259
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
17260
+ }
17261
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_GPS_SolverT_double_t, 0 | 0 );
17262
+ if (!SWIG_IsOK(res1)) {
17263
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "GPS_Solver< double > const *","get_options", 1, self ));
17264
+ }
17265
+ arg1 = reinterpret_cast< GPS_Solver< double > * >(argp1);
17266
+ {
17267
+ try {
17268
+ result = GPS_Solver_Sl_double_Sg__get_options((GPS_Solver< double > const *)arg1);
17269
+ } catch (const native_exception &e) {
17270
+ e.regenerate();
17271
+ SWIG_fail;
17272
+ } catch (const std::exception& e) {
17273
+ SWIG_exception_fail(SWIG_RuntimeError, e.what());
17274
+ }
17275
+ }
17276
+ {
17277
+ VALUE res(rb_hash_new());
17278
+ rb_hash_aset(res, ID2SYM(rb_intern("skip_exclusion")), SWIG_From_bool ((&result)->skip_exclusion));
17279
+ vresult = res;
17280
+ }
17281
+ return vresult;
17282
+ fail:
17283
+ return Qnil;
17284
+ }
17285
+
17286
+
17287
+ /*
17288
+ Document-method: GPS_PVT::GPS::Solver.options=
17289
+
17290
+ call-seq:
17291
+ options=(VALUE obj) -> GPS_Solver< double >::super_t::options_t
17292
+
17293
+ An instance method.
17294
+
17295
+ */
17296
+ SWIGINTERN VALUE
17297
+ _wrap_Solver_optionse___(int argc, VALUE *argv, VALUE self) {
17298
+ GPS_Solver< double > *arg1 = (GPS_Solver< double > *) 0 ;
17299
+ VALUE arg2 = (VALUE) 0 ;
17300
+ void *argp1 = 0 ;
17301
+ int res1 = 0 ;
17302
+ GPS_Solver< double >::super_t::options_t result;
17303
+ VALUE vresult = Qnil;
17304
+
17305
+ if ((argc < 1) || (argc > 1)) {
17306
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
17307
+ }
17308
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_GPS_SolverT_double_t, 0 | 0 );
17309
+ if (!SWIG_IsOK(res1)) {
17310
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "GPS_Solver< double > *","set_options", 1, self ));
17311
+ }
17312
+ arg1 = reinterpret_cast< GPS_Solver< double > * >(argp1);
17313
+ arg2 = argv[0];
17314
+ {
17315
+ try {
17316
+ result = GPS_Solver_Sl_double_Sg__set_options(arg1,arg2);
17317
+ } catch (const native_exception &e) {
17318
+ e.regenerate();
17319
+ SWIG_fail;
17320
+ } catch (const std::exception& e) {
17321
+ SWIG_exception_fail(SWIG_RuntimeError, e.what());
17322
+ }
17323
+ }
17324
+ {
17325
+ VALUE res(rb_hash_new());
17326
+ rb_hash_aset(res, ID2SYM(rb_intern("skip_exclusion")), SWIG_From_bool ((&result)->skip_exclusion));
17327
+ vresult = res;
17328
+ }
17329
+ return vresult;
17330
+ fail:
17331
+ return Qnil;
17332
+ }
17333
+
17334
+
17228
17335
  SWIGINTERN void
17229
17336
  free_GPS_Solver_Sl_double_Sg_(void *self) {
17230
17337
  GPS_Solver< double > *arg1 = (GPS_Solver< double > *)self;
@@ -26933,6 +27040,8 @@ SWIGEXPORT void Init_GPS(void) {
26933
27040
  rb_define_method(SwigClassSolver.klass, "solve", VALUEFUNC(_wrap_Solver_solve), -1);
26934
27041
  rb_define_method(SwigClassSolver.klass, "correction", VALUEFUNC(_wrap_Solver_correction), -1);
26935
27042
  rb_define_method(SwigClassSolver.klass, "correction=", VALUEFUNC(_wrap_Solver_correctione___), -1);
27043
+ rb_define_method(SwigClassSolver.klass, "options", VALUEFUNC(_wrap_Solver_options), -1);
27044
+ rb_define_method(SwigClassSolver.klass, "options=", VALUEFUNC(_wrap_Solver_optionse___), -1);
26936
27045
  SwigClassSolver.mark = (void (*)(void *)) GPS_Solver<double>::mark;
26937
27046
  SwigClassSolver.destroy = (void (*)(void *)) free_GPS_Solver_Sl_double_Sg_;
26938
27047
  SwigClassSolver.trackObjects = 0;
@@ -474,12 +474,7 @@ struct GPS_Solver_Base {
474
474
  using super_t::reset;
475
475
  void reset(const int &prn) {set(prn, false);}
476
476
  std::vector<int> excluded() const {
477
- std::vector<int> res(super_t::indices_one());
478
- for(std::vector<int>::iterator it(res.begin()), it_end(res.end());
479
- it != it_end; ++it){
480
- *it += prn_begin;
481
- }
482
- return res;
477
+ return super_t::indices_one(prn_begin);
483
478
  }
484
479
  };
485
480
  };
@@ -60,6 +60,12 @@ struct GPS_PVT_RAIM_LSR : public PVT_BaseT {
60
60
  } FDE_min, FDE_2nd; ///< Fault exclusion
61
61
  };
62
62
 
63
+ template <class FloatT>
64
+ struct GPS_Solver_RAIM_LSR_Options {
65
+ bool skip_exclusion;
66
+ GPS_Solver_RAIM_LSR_Options() : skip_exclusion(false) {}
67
+ };
68
+
63
69
  /*
64
70
  * Comment on implementation of protection level (PL) calculation
65
71
  *
@@ -96,6 +102,27 @@ struct GPS_Solver_RAIM_LSR : public SolverBaseT {
96
102
  inheritate_type(measurement2_t);
97
103
  #undef inheritate_type
98
104
 
105
+ typedef typename GPS_Solver_Base<float_t>::options_t::template merge_t<
106
+ GPS_Solver_RAIM_LSR_Options<float_t>, super_t> options_t;
107
+
108
+ protected:
109
+ GPS_Solver_RAIM_LSR_Options<float_t> _options;
110
+
111
+ public:
112
+ options_t available_options() const {
113
+ return options_t(super_t::available_options(), _options);
114
+ }
115
+
116
+ options_t available_options(const options_t &opt_wish) const {
117
+ GPS_Solver_RAIM_LSR_Options<float_t> opt(opt_wish);
118
+ return options_t(super_t::available_options(opt_wish), opt);
119
+ }
120
+
121
+ options_t update_options(const options_t &opt_wish){
122
+ _options = opt_wish;
123
+ return options_t(super_t::update_options(opt_wish), _options);
124
+ }
125
+
99
126
  typedef GPS_PVT_RAIM_LSR<float_t, typename super_t::user_pvt_t> user_pvt_t;
100
127
 
101
128
  typename super_t::template solver_interface_t<self_t> solve() const {
@@ -155,7 +182,8 @@ protected:
155
182
  user_position_init, receiver_error_init,
156
183
  opt);
157
184
 
158
- if(!pvt.position_solved()
185
+ if(_options.skip_exclusion
186
+ || !pvt.position_solved()
159
187
  || (!pvt.FD.valid)
160
188
  || (pvt.used_satellites < 6)){return;}
161
189
 
@@ -125,9 +125,9 @@ struct BitArray {
125
125
  return (unsigned int)res;
126
126
  }
127
127
  }
128
- std::vector<int> indices_one() const {
128
+ std::vector<int> indices_one(const int &offset = 0) const {
129
129
  std::vector<int> res;
130
- int idx(0);
130
+ int idx(offset);
131
131
  static const const_div_t<bits_per_addr> qr(MAX_SIZE);
132
132
  int rem(qr.rem), i(0);
133
133
  for(; i < qr.quot; ++i, idx += bits_per_addr){
@@ -1356,6 +1356,28 @@ struct GPS_RangeCorrector
1356
1356
  return self->update_correction(true, hash);
1357
1357
  }
1358
1358
  #endif
1359
+ #ifdef SWIGRUBY
1360
+ %typemap(out) typename super_t::options_t {
1361
+ VALUE res(rb_hash_new());
1362
+ rb_hash_aset(res, ID2SYM(rb_intern("skip_exclusion")), SWIG_From(bool)($1.skip_exclusion));
1363
+ %set_output(res);
1364
+ }
1365
+ #endif
1366
+ %rename("options") get_options;
1367
+ typename super_t::options_t get_options() const {
1368
+ return self->available_options();
1369
+ }
1370
+ %rename("options=") set_options;
1371
+ typename super_t::options_t set_options(SWIG_Object obj) {
1372
+ GPS_Solver<FloatT>::super_t::options_t opt(self->available_options());
1373
+ #ifdef SWIGRUBY
1374
+ if(!RB_TYPE_P(obj, T_HASH)){SWIG_exception(SWIG_TypeError, "Hash is expected");}
1375
+ SWIG_AsVal(bool)(
1376
+ rb_hash_lookup(obj, ID2SYM(rb_intern("skip_exclusion"))),
1377
+ &opt.skip_exclusion);
1378
+ #endif
1379
+ return self->update_options(opt);
1380
+ }
1359
1381
  }
1360
1382
  %inline {
1361
1383
  template <class FloatT>
@@ -658,6 +658,73 @@ __ANTEX_TEXT__
658
658
  # https://files.igs.org/pub/station/general/igs14.atx
659
659
  f.path
660
660
  },
661
+ :rinex_clk => Tempfile::open{|f|
662
+ f.write(<<-__RINEX_CLK_TEXT__)
663
+ 3.00 C RINEX VERSION / TYPE
664
+ CCLOCK IGSACC @ NOAA NGS PGM / RUN BY / DATE
665
+ GPS week: 1849 Day: 2 MJD: 57189 COMMENT
666
+ THE COMBINED CLOCKS ARE A WEIGHTED AVERAGE OF: COMMENT
667
+ cod emr esa gfz grg jpl COMMENT
668
+ THE FOLLOWING REFERENCE CLOCKS WERE USED BY ACs: COMMENT
669
+ WSRT AMC2 BRUX HRAO COMMENT
670
+ THE COMBINED CLOCKS ARE ALIGNED TO GPS TIME COMMENT
671
+ USING THE SATELLITE BROADCAST EPHEMERIDES COMMENT
672
+ All clocks have been re-aligned to the IGS time scale: IGST COMMENT
673
+ 16 LEAP SECONDS
674
+ 1 AS # / TYPES OF DATA
675
+ IGS IGSACC @ NOAA NGS ANALYSIS CENTER
676
+ 6 # OF SOLN SATS
677
+ G12 G18 G24 G25 G29 G31 PRN LIST
678
+ G igs08_1848.atx SYS / PCVS APPLIED
679
+ END OF HEADER
680
+ AS G12 2015 06 15 23 45 0.000000 2 3.017937472687e-04 1.069824072610e-11
681
+ AS G18 2015 06 15 23 45 0.000000 2 4.096815344517e-04 9.225410060960e-12
682
+ AS G24 2015 06 15 23 45 0.000000 2 -4.998574751545e-05 2.372704308220e-11
683
+ AS G25 2015 06 15 23 45 0.000000 2 -2.290169594092e-06 1.683218228880e-11
684
+ AS G29 2015 06 15 23 45 0.000000 2 6.168866864097e-04 1.206217360840e-11
685
+ AS G31 2015 06 15 23 45 0.000000 2 3.128244102077e-04 2.173867579920e-11
686
+ AS G12 2015 06 15 23 50 0.000000 2 3.017948525918e-04 1.300769315700e-11
687
+ AS G18 2015 06 15 23 50 0.000000 2 4.096823340968e-04 8.242414325510e-12
688
+ AS G24 2015 06 15 23 50 0.000000 2 -4.998578937856e-05 3.095238106380e-11
689
+ AS G25 2015 06 15 23 50 0.000000 2 -2.291410963946e-06 2.242880773880e-11
690
+ AS G29 2015 06 15 23 50 0.000000 2 6.168873857128e-04 1.695910016600e-11
691
+ AS G31 2015 06 15 23 50 0.000000 2 3.128241216228e-04 1.904362802980e-11
692
+ AS G12 2015 06 15 23 55 0.000000 2 3.017958412577e-04 1.171495359430e-11
693
+ AS G18 2015 06 15 23 55 0.000000 2 4.096833491457e-04 1.008770038860e-11
694
+ AS G24 2015 06 15 23 55 0.000000 2 -4.998596967628e-05 2.600074192880e-11
695
+ AS G25 2015 06 15 23 55 0.000000 2 -2.292650290468e-06 2.671557682290e-11
696
+ AS G29 2015 06 15 23 55 0.000000 2 6.168880208367e-04 1.729095211710e-11
697
+ AS G31 2015 06 15 23 55 0.000000 2 3.128236493567e-04 1.807462018720e-11
698
+ AS G12 2015 06 16 00 00 0.000000 2 3.017967728708e-04 1.000801049580e-11
699
+ AS G18 2015 06 16 00 00 0.000000 2 4.096840539308e-04 1.041670195750e-11
700
+ AS G24 2015 06 16 00 00 0.000000 2 -4.998614775959e-05 1.699628132880e-11
701
+ AS G25 2015 06 16 00 00 0.000000 2 -2.293760646361e-06 1.805118466830e-11
702
+ AS G29 2015 06 16 00 00 0.000000 2 6.168886213338e-04 2.220055594770e-11
703
+ AS G31 2015 06 16 00 00 0.000000 2 3.128233311248e-04 1.215284180360e-11
704
+ AS G12 2015 06 16 00 05 0.000000 2 3.017980078016e-04 1.152529430320e-11
705
+ AS G18 2015 06 16 00 05 0.000000 2 4.096851745816e-04 1.517949585220e-11
706
+ AS G24 2015 06 16 00 05 0.000000 2 -4.998569129850e-05 1.987308774570e-11
707
+ AS G25 2015 06 16 00 05 0.000000 2 -2.295014987154e-06 1.568891027900e-11
708
+ AS G29 2015 06 16 00 05 0.000000 2 6.168894672506e-04 1.906237292480e-11
709
+ AS G31 2015 06 16 00 05 0.000000 2 3.128231387506e-04 1.007829428500e-11
710
+ AS G12 2015 06 16 00 10 0.000000 2 3.017987334831e-04 8.726251168980e-12
711
+ AS G18 2015 06 16 00 10 0.000000 2 4.096859333261e-04 1.403166740100e-11
712
+ AS G24 2015 06 16 00 10 0.000000 2 -4.998597422529e-05 1.727695888430e-11
713
+ AS G25 2015 06 16 00 10 0.000000 2 -2.296262879345e-06 1.460867818340e-11
714
+ AS G29 2015 06 16 00 10 0.000000 2 6.168900483001e-04 1.556536485070e-11
715
+ AS G31 2015 06 16 00 10 0.000000 2 3.128226535741e-04 1.258498073020e-11
716
+ AS G12 2015 06 16 00 15 0.000000 2 3.017999301583e-04 1.006627990480e-11
717
+ AS G18 2015 06 16 00 15 0.000000 2 4.096864636193e-04 1.460541676660e-11
718
+ AS G24 2015 06 16 00 15 0.000000 2 -4.998605241609e-05 1.970841363000e-11
719
+ AS G25 2015 06 16 00 15 0.000000 2 -2.297477664413e-06 1.598459869060e-11
720
+ AS G29 2015 06 16 00 15 0.000000 2 6.168906691983e-04 1.729396319140e-11
721
+ AS G31 2015 06 16 00 15 0.000000 2 3.128222195893e-04 1.358710059900e-11
722
+ __RINEX_CLK_TEXT__
723
+ # modified version. original data are
724
+ # https://cddis.nasa.gov/archive/gnss/products/1849/igs1849[12].clk.Z
725
+ # mirrored: ftp://garner.ucsd.edu/pub/products/1849/igs1849[12].clk.Z
726
+ f.path
727
+ },
661
728
  }}
662
729
  let(:solver){
663
730
  res = GPS::Solver::new
@@ -778,6 +845,10 @@ __ANTEX_TEXT__
778
845
 
779
846
  it 'can be modified through hooks' do
780
847
  sn = solver.gps_space_node
848
+ expect(solver.options).to be_a_kind_of(Hash)
849
+ expect(solver.options.keys).to include(:skip_exclusion)
850
+ expect{solver.options = {:skip_exclusion => true}}.not_to raise_error
851
+ expect(solver.options[:skip_exclusion]).to eq(true)
781
852
  expect(solver.correction[:gps_ionospheric]).to include(:klobuchar)
782
853
  expect(solver.correction[:gps_tropospheric]).to include(:hopfield)
783
854
  expect{solver.correction = nil}.to raise_error(RuntimeError)
@@ -937,5 +1008,55 @@ __ANTEX_TEXT__
937
1008
  puts ([:lat, :lng].collect{|f| pvt.llh.send(f) / Math::PI * 180} + [pvt.llh.alt]).inspect
938
1009
  }
939
1010
  end
1011
+ it 'calculates satellite clock error based on RINEX clock' do
1012
+ clk, sn = [GPS::RINEX_Clock::new, solver.gps_space_node]
1013
+ expect(clk.read(input[:rinex_clk])).to eq(6 * 7)
1014
+ proc{|sats|
1015
+ expect(sats.kind_of?(Array)).to eq(true)
1016
+ expect(sats[clk.class::SYS_GPS]).to eq(6)
1017
+ }.call(clk.satellites)
1018
+ sn.read(input[:rinex_nav])
1019
+ t0 = GPS::Time::new(1849, 172800)
1020
+ sn.update_all_ephemeris(t0)
1021
+ (-5..5).step(1){|dt_min|
1022
+ t = t0 + (dt_min * 60)
1023
+ [12, 18, 24, 25, 29, 31].each{|sat_id|
1024
+ eph = sn.ephemeris(sat_id).constellation(t)
1025
+ expect(clk.clock_error(sat_id, t)).to be_within(1E-7).of(eph[2]) # 100 ns
1026
+ expect(clk.clock_error_dot(sat_id, t)).to be_within(1E-10).of(eph[3]) # 100 ps
1027
+ }
1028
+ }
1029
+ end
1030
+ it 'calculates position without any error with RINEX NAV and CLK' do
1031
+ sn = solver.gps_space_node
1032
+ sn.read(input[:rinex_nav])
1033
+ clk = GPS::RINEX_Clock::new
1034
+ clk.read(input[:rinex_clk])
1035
+ expect(clk.push(solver, clk.class::SYS_GPS)).to eq(true)
1036
+ GPS::RINEX_Observation::read(input[:rinex_obs]){|item|
1037
+ t_meas = item[:time]
1038
+ sn.update_all_ephemeris(t_meas)
1039
+ meas = GPS::Measurement::new
1040
+ types = (item[:meas_types]['G'] || item[:meas_types][' ']).collect.with_index{|type_, i|
1041
+ type_ = {
1042
+ "C1" => :L1_PSEUDORANGE,
1043
+ "D1" => :L1_RANGE_RATE,
1044
+ }[type_]
1045
+ type_ && [i, GPS::Measurement::const_get(type_)]
1046
+ }.compact
1047
+ item[:meas].each{|k, v|
1048
+ sys, prn = k
1049
+ next unless sys == 'G' # GPS only
1050
+ types.each{|i, type_|
1051
+ meas.add(prn, type_, v[i][0]) if v[i]
1052
+ }
1053
+ }
1054
+ pvt = solver.solve(meas, t_meas)
1055
+ expect(pvt.position_solved?).to eq(true)
1056
+ [-3952590.4754, 3360273.8926, 3697987.2632].zip(pvt.xyz.to_a).each{|a, b|
1057
+ expect(a).to be_within(1E+2).of(b) # 10 m
1058
+ }
1059
+ }
1060
+ end
940
1061
  end
941
1062
  end
@@ -19,6 +19,7 @@ class Receiver
19
19
  opt = {
20
20
  :system => [[:GPS, 1..32]],
21
21
  :satellites => (1..32).to_a,
22
+ :FDE => true,
22
23
  }.merge(opt)
23
24
  [[
24
25
  [:week, :itow_rcv, :year, :month, :mday, :hour, :min, :sec_rcv_UTC],
@@ -106,7 +107,7 @@ class Receiver
106
107
  el_deg = [4, 6].collect{|i| pvt.elevation[fd[i]] / Math::PI * 180}
107
108
  fd[0..4] + [el_deg[0]] + fd[5..6] + [el_deg[1]]
108
109
  }
109
- ]] + [[
110
+ ]] + (opt[:FDE] ? [[
110
111
  [:wssr_FDE_min, :wssr_FDE_min_PRN, :wssr_FDE_2nd, :wssr_FDE_2nd_PRN],
111
112
  proc{|pvt|
112
113
  [:fde_min, :fde_2nd].collect{|f|
@@ -115,7 +116,7 @@ class Receiver
115
116
  [info[0], info[-3]]
116
117
  }.flatten
117
118
  }
118
- ]]
119
+ ]] : [])
119
120
  end
120
121
 
121
122
  def self.meas_items(opt = {})
@@ -153,6 +154,9 @@ class Receiver
153
154
  rel_prop[0] = 1 if rel_prop[0] > 0 # weight = 1
154
155
  rel_prop
155
156
  }
157
+ @solver.options = {
158
+ :skip_exclusion => true, # default is to skip fault exclusion calculation
159
+ }
156
160
  @debug = {}
157
161
  solver_opts = [:gps_options, :sbas_options, :glonass_options].collect{|target|
158
162
  @solver.send(target)
@@ -165,8 +169,10 @@ class Receiver
165
169
  output_options = {
166
170
  :system => [[:GPS, 1..32], [:QZSS, 193..202]],
167
171
  :satellites => (1..32).to_a + (193..202).to_a, # [idx, ...] or [[idx, label], ...] is acceptable
172
+ :FDE => false,
168
173
  }
169
174
  options = options.reject{|k, v|
175
+ def v.to_b; !(self =~ /^(?:false|0|f|off)$/i); end
170
176
  case k
171
177
  when :debug
172
178
  v = v.split(/,/)
@@ -280,6 +286,9 @@ class Receiver
280
286
  $stderr.puts "#{mode.capitalize} satellite: #{[sys, svid].compact.join(':')}"
281
287
  }
282
288
  next true
289
+ when :fault_exclusion
290
+ @solver.options = {:skip_exclusion => !(output_options[:FDE] = v.to_b)}
291
+ next true
283
292
  end
284
293
  false
285
294
  }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GPS_PVT
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gps_pvt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - fenrir(M.Naruoka)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-24 00:00:00.000000000 Z
11
+ date: 2022-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake