gps_pvt 0.8.0 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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