gps_pvt 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,51 @@
1
+ =begin
2
+ Receiver extension
3
+ =end
4
+
5
+ module GPS_PVT
6
+ class Receiver
7
+
8
+ # shortcut to access ephemeris registered in receiver
9
+ def ephemeris(t, sys, prn)
10
+ eph = case sys
11
+ when :GPS, :QZSS
12
+ critical{
13
+ @solver.gps_space_node.update_all_ephemeris(t)
14
+ @solver.gps_space_node.ephemeris(prn)
15
+ }
16
+ when :SBAS
17
+ critical{
18
+ @solver.sbas_space_node.update_all_ephemeris(t)
19
+ @solver.sbas_space_node.ephemeris(prn)
20
+ }
21
+ when :GLONASS
22
+ critical{
23
+ @solver.glonass_space_node.update_all_ephemeris(t)
24
+ @solver.glonass_space_node.ephemeris(prn)
25
+ }
26
+ else
27
+ return nil
28
+ end
29
+ return (eph.valid?(t) ? eph : nil)
30
+ end
31
+
32
+ def attach_online_ephemeris(uri_template = nil)
33
+ if (!uri_template) || (uri_template =~ /^\s*$/) then
34
+ uri_template = "ftp://gssc.esa.int/gnss/data/daily/%Y/brdc/BRDC00IGS_R_%Y%j0000_01D_MN.rnx.gz"
35
+ end
36
+ loader = proc{|t_meas|
37
+ utc = Time::utc(*t_meas.c_tm)
38
+ uri = URI::parse(utc.strftime(uri_template))
39
+ self.parse_rinex_nav(uri)
40
+ uri
41
+ }
42
+ run_orig = self.method(:run)
43
+ eph_list = {}
44
+ self.define_singleton_method(:run){|meas, t_meas, *args|
45
+ w_d = [t_meas.week, (t_meas.seconds.to_i / 86400)]
46
+ eph_list[w_d] ||= loader.call(t_meas)
47
+ run_orig.call(meas, t_meas, *args)
48
+ }
49
+ end
50
+ end
51
+ end
@@ -3,7 +3,7 @@ Receiver class to be an top level interface to a user
3
3
  (The origin is ninja-scan-light/tool/misc/receiver_debug.rb)
4
4
  =end
5
5
 
6
- require_relative 'GPS'
6
+ require 'gps_pvt/GPS' # in case GPS.so is generated under ext/gps_pvt
7
7
  require_relative 'util'
8
8
 
9
9
  module GPS_PVT
@@ -290,6 +290,11 @@ class Receiver
290
290
  when :fault_exclusion
291
291
  @solver.options = {:skip_exclusion => !(output_options[:FDE] = v.to_b)}
292
292
  next true
293
+ when :use_signal
294
+ {
295
+ :GPS_L2C => proc{@solver.gps_options.exclude_L2C = false},
296
+ }[v.to_sym].call rescue next false
297
+ next true
293
298
  end
294
299
  false
295
300
  }
@@ -334,9 +339,9 @@ class Receiver
334
339
  }.flatten(1))]
335
340
  }
336
341
  }.call
337
- alias_method(:add_orig, :add)
342
+ add_orig = instance_method(:add)
338
343
  define_method(:add){|prn, key, value|
339
- add_orig(prn, key.kind_of?(Symbol) ? GPS::Measurement.const_get(key) : key, value)
344
+ add_orig.bind(self).call(prn, key.kind_of?(Symbol) ? GPS::Measurement.const_get(key) : key, value)
340
345
  }
341
346
  }
342
347
 
@@ -523,31 +528,39 @@ class Receiver
523
528
  v
524
529
  }
525
530
  sys, svid = gnss_serial.call(*loader.call(36, 2).reverse)
531
+ sigid = (packet[6 + 13] != 0) ? loader.call(38, 1, "C") : 0 # sigID if version(>0); @see UBX-18010854
526
532
  case sys
527
- when :GPS, :SBAS, :QZSS;
533
+ when :GPS
534
+ sigid = {0 => :L1, 3 => :L2CL, 4 => :L2CM}[sigid]
535
+ when :SBAS
536
+ sigid = :L1
537
+ when :QZSS
538
+ sigid = {0 => :L1, 5 => :L2CL, 4 => :L2CM}[sigid]
528
539
  when :GLONASS
529
540
  svid += 0x100
541
+ sigid = {0 => :L1}[sigid] # TODO: to support {2 -> :L2}
530
542
  meas.add(svid, :L1_FREQUENCY,
531
543
  GPS::SpaceNode_GLONASS::L1_frequency(loader.call(39, 1, "C") - 7))
532
544
  else; next
533
545
  end
546
+ next unless sigid
534
547
  trk_stat = loader.call(46, 1)[0]
535
548
  {
536
- :L1_PSEUDORANGE => [16, 8, "E", proc{|v| (trk_stat & 0x1 == 0x1) ? v : nil}],
537
- :L1_PSEUDORANGE_SIGMA => [43, 1, nil, proc{|v|
549
+ :PSEUDORANGE => [16, 8, "E", proc{|v| (trk_stat & 0x1 == 0x1) ? v : nil}],
550
+ :PSEUDORANGE_SIGMA => [43, 1, nil, proc{|v|
538
551
  (trk_stat & 0x1 == 0x1) ? (1E-2 * (1 << (v[0] & 0xF))) : nil
539
552
  }],
540
- :L1_DOPPLER => [32, 4, "e"],
541
- :L1_DOPPLER_SIGMA => [45, 1, nil, proc{|v| 2E-3 * (1 << (v[0] & 0xF))}],
542
- :L1_CARRIER_PHASE => [24, 8, "E", proc{|v| (trk_stat & 0x2 == 0x2) ? v : nil}],
543
- :L1_CARRIER_PHASE_SIGMA => [44, 1, nil, proc{|v|
553
+ :DOPPLER => [32, 4, "e"],
554
+ :DOPPLER_SIGMA => [45, 1, nil, proc{|v| 2E-3 * (1 << (v[0] & 0xF))}],
555
+ :CARRIER_PHASE => [24, 8, "E", proc{|v| (trk_stat & 0x2 == 0x2) ? v : nil}],
556
+ :CARRIER_PHASE_SIGMA => [44, 1, nil, proc{|v|
544
557
  (trk_stat & 0x2 == 0x2) ? (0.004 * (v[0] & 0xF)) : nil
545
558
  }],
546
- :L1_SIGNAL_STRENGTH_dBHz => [42, 1, "C"],
547
- :L1_LOCK_SEC => [40, 2, "v", proc{|v| 1E-3 * v}],
559
+ :SIGNAL_STRENGTH_dBHz => [42, 1, "C"],
560
+ :LOCK_SEC => [40, 2, "v", proc{|v| 1E-3 * v}],
548
561
  }.each{|k, prop|
549
562
  next unless v = loader.call(*prop)
550
- meas.add(svid, k, v)
563
+ meas.add(svid, "#{sigid}_#{k}".to_sym, v) rescue nil # unsupported signal
551
564
  }
552
565
  }
553
566
  after_run.call(run(meas, t_meas), [meas, t_meas])
@@ -556,10 +569,13 @@ class Receiver
556
569
  register_ephemeris(
557
570
  t_meas,
558
571
  sys, svid,
559
- packet.slice(6 + 2, 40).each_slice(4).collect{|v|
560
- res = v.pack("C*").unpack("V")[0]
561
- (sys == :GPS) ? ((res & 0xFFFFFF) << 6) : res
562
- })
572
+ proc{|data|
573
+ case sys # adjust padding
574
+ when :GPS; data.collect!{|v| (v & 0xFFFFFF) << 6}
575
+ when :SBAS; data[7] <<= 6
576
+ end
577
+ data
578
+ }.call(packet.slice(6 + 2, 40).pack("C*").unpack("V*")))
563
579
  when [0x02, 0x13] # RXM-SFRBX
564
580
  sys, svid = gnss_serial.call(packet[6 + 1], packet[6])
565
581
  opt = {}
@@ -567,9 +583,7 @@ class Receiver
567
583
  register_ephemeris(
568
584
  t_meas,
569
585
  sys, svid,
570
- packet.slice(6 + 8, 4 * packet[6 + 4]).each_slice(4).collect{|v|
571
- v.pack("C*").unpack("V")[0]
572
- }, opt)
586
+ packet.slice(6 + 8, 4 * packet[6 + 4]).pack("C*").unpack("V*"), opt)
573
587
  end
574
588
  }
575
589
  $stderr.puts ", found packets are %s"%[ubx_kind.inspect]
@@ -602,18 +616,19 @@ class Receiver
602
616
 
603
617
  types ||= Hash[*(item[:meas_types].collect{|sys, values|
604
618
  [sys, values.collect.with_index{|type_, i|
605
- case type_
606
- when "C1", "C1C"
607
- [i, :L1_PSEUDORANGE]
608
- when "L1", "L1C"
609
- [i, :L1_CARRIER_PHASE]
610
- when "D1", "D1C"
611
- [i, :L1_DOPPLER]
612
- when "S1", "S1C"
613
- [i, :L1_SIGNAL_STRENGTH_dBHz]
614
- else
615
- nil
616
- end
619
+ sig_obs_type = [case type_[1..-1]
620
+ when /^1C?$/; :L1
621
+ when /^2[XL]$/; :L2CL
622
+ when /^2S$/; :L2CM
623
+ else; nil
624
+ end, {
625
+ 'C' => :PSEUDORANGE,
626
+ 'L' => :CARRIER_PHASE,
627
+ 'D' => :DOPPLER,
628
+ 'S' => :SIGNAL_STRENGTH_dBHz,
629
+ }[type_[0]]]
630
+ next nil unless sig_obs_type.all?
631
+ [i, sig_obs_type.join('_').to_sym]
617
632
  }.compact]
618
633
  }.flatten(1))]
619
634
 
@@ -696,3 +711,5 @@ class Receiver
696
711
  end
697
712
  end
698
713
  end
714
+
715
+ require_relative 'receiver/extension'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GPS_PVT
4
- VERSION = "0.8.0"
4
+ VERSION = "0.8.2"
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.8.0
4
+ version: 0.8.2
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-09-13 00:00:00.000000000 Z
11
+ date: 2022-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyserial
@@ -112,11 +112,13 @@ files:
112
112
  - ext/ninja-scan-light/tool/swig/makefile
113
113
  - ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb
114
114
  - ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb
115
+ - ext/ninja-scan-light/tool/util/bit_counter.h
115
116
  - ext/ninja-scan-light/tool/util/text_helper.h
116
117
  - gps_pvt.gemspec
117
118
  - gps_pvt.rbs
118
119
  - lib/gps_pvt.rb
119
120
  - lib/gps_pvt/receiver.rb
121
+ - lib/gps_pvt/receiver/extension.rb
120
122
  - lib/gps_pvt/ubx.rb
121
123
  - lib/gps_pvt/util.rb
122
124
  - lib/gps_pvt/version.rb