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.
- 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
|