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.
@@ -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.dist(ref_pos) - (clk_err * c_1ms * 1E3)
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})
@@ -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
- (packet[6 + 31 + (i * 24)] & 0x01 == 0x01) ? -1 : 0)
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| (trk_stat & 0x2 == 0x2) ? v : nil}],
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{|k, v|
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
- meas.add(prn, type_, v[i][0]) if v[i]
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
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GPS_PVT
4
- VERSION = "0.9.3"
4
+ VERSION = "0.9.4"
5
5
 
6
6
  def GPS_PVT.version_compare(a, b)
7
7
  Gem::Version::new(a) <=> Gem::Version::new(b)
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.3
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-03-07 00:00:00.000000000 Z
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.1.2
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