gps_pvt 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +159 -3
- data/Rakefile +7 -0
- data/ext/gps_pvt/Coordinate/Coordinate_wrap.cxx +53 -19
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +39 -7
- data/ext/gps_pvt/SylphideMath/SylphideMath_wrap.cxx +5210 -2058
- data/ext/gps_pvt/extconf.rb +6 -5
- data/ext/ninja-scan-light/tool/navigation/GLONASS_Solver.h +1 -1
- data/ext/ninja-scan-light/tool/navigation/GPS.h +6 -2
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +1 -1
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_Base.h +3 -1
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_MultiFrequency.h +3 -0
- data/ext/ninja-scan-light/tool/navigation/RINEX.h +9 -9
- data/ext/ninja-scan-light/tool/navigation/SBAS_Solver.h +1 -1
- data/ext/ninja-scan-light/tool/navigation/coordinate.h +13 -6
- data/ext/ninja-scan-light/tool/param/matrix.h +1020 -247
- data/ext/ninja-scan-light/tool/param/matrix_fixed.h +26 -0
- data/ext/ninja-scan-light/tool/swig/GPS.i +6 -4
- data/ext/ninja-scan-light/tool/swig/SylphideMath.i +139 -36
- data/ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb +115 -5
- data/gps_pvt.gemspec +2 -1
- data/lib/gps_pvt/ntrip.rb +1 -1
- data/lib/gps_pvt/receiver/rtcm3.rb +4 -3
- data/lib/gps_pvt/receiver.rb +18 -8
- data/lib/gps_pvt/rtcm3.rb +9 -4
- data/lib/gps_pvt/version.rb +1 -1
- metadata +17 -3
@@ -81,7 +81,7 @@ class Receiver
|
|
81
81
|
eph = sn.ephemeris(svid)
|
82
82
|
cache[[sys, svid]] = [if eph.valid?(t) then
|
83
83
|
sv_pos, clk_err = eph.constellation(t).values_at(0, 2)
|
84
|
-
sv_pos.
|
84
|
+
sv_pos.distance(ref_pos) - (clk_err * c_1ms * 1E3)
|
85
85
|
end, t]
|
86
86
|
}
|
87
87
|
}
|
@@ -259,9 +259,9 @@ class Receiver
|
|
259
259
|
sys_svid_list = ranges[:sat_sig].collect{|sat, sig| [sys, (sat + svid_offset) & 0xFF]}
|
260
260
|
restore_ranges.call(t_meas2, sys_svid_list, ranges)
|
261
261
|
item_size = sys_svid_list.size
|
262
|
-
[:sat_sig, :pseudo_range, :phase_range, :phase_range_rate, :cn].collect{|k|
|
262
|
+
[:sat_sig, :pseudo_range, :phase_range, :phase_range_rate, :cn, :halfc_amb].collect{|k|
|
263
263
|
ranges[k] || ([nil] * item_size)
|
264
|
-
}.transpose.each{|(svid, sig), pr, cpr, dr, cn|
|
264
|
+
}.transpose.each{|(svid, sig), pr, cpr, dr, cn, amb|
|
265
265
|
prefix, len = sig_list[sig]
|
266
266
|
next unless prefix
|
267
267
|
proc{
|
@@ -274,6 +274,7 @@ class Receiver
|
|
274
274
|
meas2 << [svid, "#{prefix}_RANGE_RATE".to_sym, dr] if dr
|
275
275
|
meas2 << [svid, "#{prefix}_CARRIER_PHASE".to_sym, cpr / len] if cpr && len
|
276
276
|
meas2 << [svid, "#{prefix}_SIGNAL_STRENGTH_dBHz".to_sym, cn] if cn
|
277
|
+
meas2 << [svid, "#{prefix}_CARRIER_PHASE_AMBIGUITY_SCALE".to_sym, 0.5] if amb && (amb == 1)
|
277
278
|
}
|
278
279
|
else
|
279
280
|
#p({msg_num => parsed})
|
data/lib/gps_pvt/receiver.rb
CHANGED
@@ -509,10 +509,12 @@ class Receiver
|
|
509
509
|
}.each{|k, prop|
|
510
510
|
meas.add(prn, k, loader.call(*prop))
|
511
511
|
}
|
512
|
+
lli = packet[6 + 31 + (i * 24)]
|
512
513
|
# bit 0 of RINEX LLI (loss of lock indicator) shows lost lock
|
513
514
|
# between previous and current observation, which maps negative lock seconds
|
514
|
-
meas.add(prn, :L1_LOCK_SEC,
|
515
|
-
|
515
|
+
meas.add(prn, :L1_LOCK_SEC, (lli & 0x01 == 0x01) ? -1 : 0)
|
516
|
+
# set bit 1 of LLI represents possibility of half cycle ambiguity
|
517
|
+
meas.add(prn, :L1_CARRIER_PHASE_AMBIGUITY_SCALE, 0.5) if (lli & 0x02 == 0x02)
|
516
518
|
}
|
517
519
|
after_run.call(run(meas, t_meas), [meas, t_meas])
|
518
520
|
when [0x02, 0x15] # RXM-RAWX
|
@@ -553,7 +555,13 @@ class Receiver
|
|
553
555
|
}],
|
554
556
|
:DOPPLER => [32, 4, "e"],
|
555
557
|
:DOPPLER_SIGMA => [45, 1, nil, proc{|v| 2E-3 * (1 << (v[0] & 0xF))}],
|
556
|
-
:CARRIER_PHASE => [24, 8, "E", proc{|v|
|
558
|
+
:CARRIER_PHASE => [24, 8, "E", proc{|v|
|
559
|
+
case (trk_stat & 0x6)
|
560
|
+
when 0x6; (trk_stat & 0x8 == 0x8) ? (v + 0.5) : v
|
561
|
+
when 0x2; meas.add(svid, "#{sigid}_CARRIER_PHASE_AMBIGUITY_SCALE".to_sym, 0.5); v
|
562
|
+
else; nil
|
563
|
+
end
|
564
|
+
}],
|
557
565
|
:CARRIER_PHASE_SIGMA => [44, 1, nil, proc{|v|
|
558
566
|
(trk_stat & 0x2 == 0x2) ? (0.004 * (v[0] & 0xF)) : nil
|
559
567
|
}],
|
@@ -629,7 +637,7 @@ class Receiver
|
|
629
637
|
'S' => :SIGNAL_STRENGTH_dBHz,
|
630
638
|
}[type_[0]]]
|
631
639
|
next nil unless sig_obs_type.all?
|
632
|
-
[i, sig_obs_type.join('_').to_sym]
|
640
|
+
[i, sig_obs_type.join('_').to_sym, *sig_obs_type]
|
633
641
|
}.compact]
|
634
642
|
}.flatten(1))]
|
635
643
|
|
@@ -644,8 +652,7 @@ class Receiver
|
|
644
652
|
}.call(item[:header]["GLONASS SLOT / FRQ #"])
|
645
653
|
|
646
654
|
meas = GPS::Measurement::new
|
647
|
-
item[:meas].each{|
|
648
|
-
sys, prn = k
|
655
|
+
item[:meas].each{|(sys, prn), v|
|
649
656
|
case sys
|
650
657
|
when 'G', ' '
|
651
658
|
when 'S'; prn += 100
|
@@ -662,8 +669,11 @@ class Receiver
|
|
662
669
|
else; next
|
663
670
|
end
|
664
671
|
types[sys] = (types[' '] || []) unless types[sys]
|
665
|
-
types[sys].each{|i, type_|
|
666
|
-
|
672
|
+
types[sys].each{|i, type_, sig_type, obs_type|
|
673
|
+
next unless v[i]
|
674
|
+
meas.add(prn, type_, v[i][0])
|
675
|
+
meas.add(prn, "#{sig_type}_CARRIER_PHASE_AMBIGUITY_SCALE".to_sym, 0.5) \
|
676
|
+
if (obs_type == :CARRIER_PHASE) && (v[i][1] & 0x2 == 0x2)
|
667
677
|
}
|
668
678
|
}
|
669
679
|
after_run.call(run(meas, t_meas), [meas, t_meas])
|
data/lib/gps_pvt/rtcm3.rb
CHANGED
@@ -421,6 +421,7 @@ class RTCM3
|
|
421
421
|
}
|
422
422
|
add_proc.call(0)
|
423
423
|
add_proc.call(1)
|
424
|
+
res[:halfc_amb] = self[-ncell, ncell].transpose[0] if self[-1][1] == 420
|
424
425
|
res
|
425
426
|
end
|
426
427
|
end
|
@@ -433,14 +434,16 @@ class RTCM3
|
|
433
434
|
range_rough2 = self[offset + (nsat * 1), nsat] # DF398
|
434
435
|
range_fine = self[offset + (nsat * 2), ncell] # DF400/405
|
435
436
|
phase_fine = self[offset + (nsat * 2) + (ncell * 1), ncell] # DF401/406
|
437
|
+
halfc_amb = self[offset + (nsat * 2) + (ncell * 3), ncell] # DF420
|
436
438
|
cn = self[offset + (nsat * 2) + (ncell * 4), ncell] # DF403/408
|
437
|
-
Hash[*([:sat_sig, :pseudo_range, :phase_range, :cn].zip(
|
439
|
+
Hash[*([:sat_sig, :pseudo_range, :phase_range, :cn, :halfc_amb].zip(
|
438
440
|
[cells] + cells.collect.with_index{|(sat, sig), i|
|
439
441
|
i2 = sats.find_index(sat)
|
440
442
|
rough_ms = (range_rough2[i2][0] + range_rough[i2][0]) rescue nil
|
441
443
|
[(((range_fine[i][0] + rough_ms) * SPEED_OF_LIGHT) rescue nil),
|
442
444
|
(((phase_fine[i][0] + rough_ms) * SPEED_OF_LIGHT) rescue nil),
|
443
|
-
cn[i][0]
|
445
|
+
cn[i][0],
|
446
|
+
halfc_amb[i][0]]
|
444
447
|
}.transpose).flatten(1))]
|
445
448
|
end
|
446
449
|
end
|
@@ -454,16 +457,18 @@ class RTCM3
|
|
454
457
|
delta_rough = self[offset + (nsat * 3), nsat] # DF399
|
455
458
|
range_fine = self[offset + (nsat * 4), ncell] # DF400/405
|
456
459
|
phase_fine = self[offset + (nsat * 4) + (ncell * 1), ncell] # DF401/406
|
460
|
+
halfc_amb = self[offset + (nsat * 4) + (ncell * 3), ncell] # DF420
|
457
461
|
cn = self[offset + (nsat * 4) + (ncell * 4), ncell] # DF403/408
|
458
462
|
delta_fine = self[offset + (nsat * 4) + (ncell * 5), ncell] # DF404
|
459
|
-
Hash[*([:sat_sig, :pseudo_range, :phase_range, :phase_range_rate, :cn].zip(
|
463
|
+
Hash[*([:sat_sig, :pseudo_range, :phase_range, :phase_range_rate, :cn, :halfc_amb].zip(
|
460
464
|
[cells] + cells.collect.with_index{|(sat, sig), i|
|
461
465
|
i2 = sats.find_index(sat)
|
462
466
|
rough_ms = (range_rough2[i2][0] + range_rough[i2][0]) rescue nil
|
463
467
|
[(((range_fine[i][0] + rough_ms) * SPEED_OF_LIGHT) rescue nil),
|
464
468
|
(((phase_fine[i][0] + rough_ms) * SPEED_OF_LIGHT) rescue nil),
|
465
469
|
((delta_fine[i][0] + delta_rough[i2][0]) rescue nil),
|
466
|
-
cn[i][0]
|
470
|
+
cn[i][0],
|
471
|
+
halfc_amb[i][0]]
|
467
472
|
}.transpose).flatten(1))]
|
468
473
|
end
|
469
474
|
end
|
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.9.
|
4
|
+
version: 0.9.4
|
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: 2023-
|
11
|
+
date: 2023-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyserial
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: github_changelog_generator
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: This module calculate PVT by using raw observation obtained from a GPS
|
70
84
|
receiver
|
71
85
|
email:
|
@@ -163,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
177
|
- !ruby/object:Gem::Version
|
164
178
|
version: '0'
|
165
179
|
requirements: []
|
166
|
-
rubygems_version: 3.
|
180
|
+
rubygems_version: 3.3.5
|
167
181
|
signing_key:
|
168
182
|
specification_version: 4
|
169
183
|
summary: GPS position, velocity, and time (PVT) solver
|