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.
- checksums.yaml +4 -4
- data/Rakefile +1 -0
- data/exe/gps_pvt +1 -17
- data/exe/to_ubx +162 -32
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +1677 -399
- data/ext/ninja-scan-light/tool/navigation/GLONASS.h +137 -9
- data/ext/ninja-scan-light/tool/navigation/GLONASS_Solver.h +5 -3
- data/ext/ninja-scan-light/tool/navigation/GPS.h +301 -50
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +5 -3
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_MultiFrequency.h +1 -0
- data/ext/ninja-scan-light/tool/navigation/QZSS.h +48 -15
- data/ext/ninja-scan-light/tool/navigation/SBAS.h +106 -4
- data/ext/ninja-scan-light/tool/navigation/SBAS_Solver.h +5 -3
- data/ext/ninja-scan-light/tool/param/bit_array.h +53 -16
- data/ext/ninja-scan-light/tool/swig/GPS.i +265 -25
- data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +64 -0
- data/ext/ninja-scan-light/tool/util/bit_counter.h +84 -0
- data/lib/gps_pvt/receiver/extension.rb +51 -0
- data/lib/gps_pvt/receiver.rb +49 -32
- data/lib/gps_pvt/version.rb +1 -1
- metadata +4 -2
@@ -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
|
data/lib/gps_pvt/receiver.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
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
|
-
:
|
537
|
-
:
|
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
|
-
:
|
541
|
-
:
|
542
|
-
:
|
543
|
-
:
|
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
|
-
:
|
547
|
-
:
|
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
|
-
|
560
|
-
|
561
|
-
|
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]).
|
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
|
-
|
607
|
-
[
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
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'
|
data/lib/gps_pvt/version.rb
CHANGED
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.
|
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-
|
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
|