gps_pvt 0.4.0 → 0.4.1
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/ext/ninja-scan-light/tool/navigation/GLONASS.h +86 -27
- data/lib/gps_pvt/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffde7da5c82fa8eecc03dc1fb71c630ff95d8c1b016aefe4da64b63f8ab9e928
|
4
|
+
data.tar.gz: 8a56df6b69e8f91cb888aa1135846b6db75a053bbd833e50c62bf0f4937a7157
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2889b55a9f925b9952ac1f29900bce98d8e0ab000418d7cecdd0405a2d81b84e70659ef4da271bb924231b7dcd80d8a550937478fbdb9f63ec0b38c0ea6d3061
|
7
|
+
data.tar.gz: '08d73a274ee81613d1d44129cfbc1a9732cc886ef5ee48d3eb70113e7d700244ad5ea977abae2d3294d86ac142380c05ba7ccf6b266327f3d001f80be584b0dc'
|
@@ -952,6 +952,8 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
952
952
|
float_t sidereal_t_b_rad;
|
953
953
|
typename Ephemeris::differential_t eq_of_motion;
|
954
954
|
|
955
|
+
static const float_t time_step_max_per_one_integration;
|
956
|
+
|
955
957
|
void calculate_additional() {
|
956
958
|
sidereal_t_b_rad = TimeProperties::date_t::Greenwich_sidereal_time_deg(
|
957
959
|
TimeProperties::date.c_tm(),
|
@@ -1009,36 +1011,52 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
1009
1011
|
return calculate_clock_error(t_arrival_onboard - Ephemeris::t_b, pseudo_range);
|
1010
1012
|
}
|
1011
1013
|
/**
|
1012
|
-
* Calculate constellation(t) based on constellation(t_0).
|
1014
|
+
* Calculate absolute constellation(t) based on constellation(t_0).
|
1013
1015
|
* t_0 is a time around t_b, and is used to calculate
|
1014
|
-
*
|
1015
|
-
*
|
1016
|
-
* by using a cache.
|
1017
|
-
* @param delta_t time interval from t_0 to t
|
1018
|
-
* @param pseudo_range measured pusedo_range to correct delta_t
|
1016
|
+
* @param t_step time interval from t_0 to t
|
1017
|
+
* @param times number of integration steps (assume times >=0)
|
1019
1018
|
* @param xa_t_0 constellation(t_0)
|
1020
|
-
* @param t_0_from_t_b time interval from t_b to t_0
|
1019
|
+
* @param t_0_from_t_b time interval from t_b to t_0 (= t_0 - t_b)
|
1021
1020
|
*/
|
1022
|
-
constellation_t
|
1023
|
-
|
1021
|
+
constellation_t constellation_abs(
|
1022
|
+
const float_t &t_step,
|
1023
|
+
int times,
|
1024
1024
|
const constellation_t &xa_t_0, const float_t &t_0_from_t_b) const {
|
1025
1025
|
|
1026
1026
|
constellation_t res(xa_t_0);
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
int i(std::floor(delta_t_to_transmit / t_step_max));
|
1031
|
-
float_t t_step_remain(delta_t_to_transmit - t_step_max * i);
|
1032
|
-
float_t delta_t_itg(0); // accumulative time of integration
|
1033
|
-
for(; i > 0; --i, delta_t_itg += t_step_max){
|
1034
|
-
res = nextByRK4(eq_of_motion, delta_t_itg, res, t_step_max);
|
1035
|
-
}
|
1036
|
-
res = nextByRK4(eq_of_motion, delta_t_itg, res, t_step_remain);
|
1027
|
+
float_t delta_t_itg(t_0_from_t_b); // accumulative time of integration
|
1028
|
+
for(; times > 0; --times, delta_t_itg += t_step){
|
1029
|
+
res = nextByRK4(eq_of_motion, delta_t_itg, res, t_step);
|
1037
1030
|
}
|
1031
|
+
return res;
|
1032
|
+
}
|
1033
|
+
/**
|
1034
|
+
* Calculate absolute constellation(t) based on constellation(t_0).
|
1035
|
+
* t_0 is a time around t_b, and is used to calculate
|
1036
|
+
* an intermediate result specified with the 2nd argument.
|
1037
|
+
* This method is useful to calculate constellation effectively
|
1038
|
+
* by using a cache.
|
1039
|
+
* @param delta_t time interval from t_0 to t
|
1040
|
+
* @param xa_t_0 constellation(t_0)
|
1041
|
+
* @param t_0_from_t_b time interval from t_b to t_0 (= t_0 - t_b)
|
1042
|
+
*/
|
1043
|
+
constellation_t constellation_abs(
|
1044
|
+
const float_t &delta_t,
|
1045
|
+
const constellation_t &xa_t_0, const float_t &t_0_from_t_b) const {
|
1038
1046
|
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1047
|
+
float_t t_step_max(delta_t >= 0
|
1048
|
+
? time_step_max_per_one_integration
|
1049
|
+
: -time_step_max_per_one_integration);
|
1050
|
+
int n(std::floor(delta_t / t_step_max));
|
1051
|
+
float_t delta_t_steps(t_step_max * n), delta_t_remain(delta_t - delta_t_steps);
|
1052
|
+
|
1053
|
+
// To perform time integration from t_0 to (t_0 + delta_t),
|
1054
|
+
// n-times integration with t_step_max,
|
1055
|
+
// then, one-time integration with delta_t_remain are conducted.
|
1056
|
+
return constellation_abs(
|
1057
|
+
delta_t_remain, 1,
|
1058
|
+
constellation_abs(t_step_max, n, xa_t_0, t_0_from_t_b),
|
1059
|
+
t_0_from_t_b + delta_t_steps);
|
1042
1060
|
}
|
1043
1061
|
/**
|
1044
1062
|
* Calculate constellation(t) based on constellation(t_b).
|
@@ -1046,8 +1064,14 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
1046
1064
|
* @param pseudo_range measured pusedo_range to correct delta_t, default is 0.
|
1047
1065
|
*/
|
1048
1066
|
constellation_t calculate_constellation(
|
1049
|
-
float_t delta_t, const float_t &pseudo_range = 0) const {
|
1050
|
-
|
1067
|
+
const float_t &delta_t, const float_t &pseudo_range = 0) const {
|
1068
|
+
|
1069
|
+
float_t delta_t_to_transmit(delta_t - pseudo_range / light_speed);
|
1070
|
+
constellation_t res(
|
1071
|
+
constellation_abs(delta_t_to_transmit, xa_t_b, float_t(0)));
|
1072
|
+
|
1073
|
+
return res.rel_corrdinate(
|
1074
|
+
sidereal_t_b_rad + (constellation_t::omega_E * delta_t)); // transform from abs to PZ-90.02
|
1051
1075
|
}
|
1052
1076
|
/**
|
1053
1077
|
* @param t_arrival_glonass signal arrival time in glonass time scale,
|
@@ -1098,7 +1122,37 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
1098
1122
|
struct Satellite : public SatelliteProperties {
|
1099
1123
|
public:
|
1100
1124
|
typedef typename SatelliteProperties::Ephemeris_with_GPS_Time eph_t;
|
1101
|
-
|
1125
|
+
|
1126
|
+
struct eph_cached_t : public eph_t {
|
1127
|
+
mutable typename eph_t::constellation_t xa_t_0;
|
1128
|
+
mutable float_t t_0_from_t_b;
|
1129
|
+
eph_cached_t() : eph_t(), xa_t_0(eph_t::xa_t_b), t_0_from_t_b(0) {}
|
1130
|
+
eph_cached_t(const eph_t &eph) : eph_t(eph), xa_t_0(eph.xa_t_b), t_0_from_t_b(0) {}
|
1131
|
+
using eph_t::constellation;
|
1132
|
+
typename eph_t::constellation_t constellation(
|
1133
|
+
const GPS_Time<float_t> &t_arrival_gps, const float_t &pseudo_range = 0) const {
|
1134
|
+
float_t delta_t(t_arrival_gps - eph_t::t_b_gps);
|
1135
|
+
float_t delta_t_transmit_from_t_0(delta_t - pseudo_range / light_speed - t_0_from_t_b);
|
1136
|
+
|
1137
|
+
float_t t_step_max(delta_t_transmit_from_t_0 >= 0
|
1138
|
+
? eph_t::time_step_max_per_one_integration
|
1139
|
+
: -eph_t::time_step_max_per_one_integration);
|
1140
|
+
|
1141
|
+
int big_steps(std::floor(delta_t_transmit_from_t_0 / t_step_max));
|
1142
|
+
if(big_steps > 0){ // perform integration and update cache
|
1143
|
+
xa_t_0 = eph_t::constellation_abs(t_step_max, big_steps, xa_t_0, t_0_from_t_b);
|
1144
|
+
float_t delta_t_updated(t_step_max * big_steps);
|
1145
|
+
t_0_from_t_b += delta_t_updated;
|
1146
|
+
delta_t_transmit_from_t_0 -= delta_t_updated;
|
1147
|
+
}
|
1148
|
+
|
1149
|
+
return eph_t::constellation_abs(delta_t_transmit_from_t_0, 1, xa_t_0, t_0_from_t_b)
|
1150
|
+
.rel_corrdinate(
|
1151
|
+
eph_t::sidereal_t_b_rad + (eph_t::constellation_t::omega_E * delta_t)); // transform from abs to PZ-90.02
|
1152
|
+
}
|
1153
|
+
};
|
1154
|
+
|
1155
|
+
typedef typename GPS_SpaceNode<float_t>::template PropertyHistory<eph_cached_t> eph_list_t;
|
1102
1156
|
protected:
|
1103
1157
|
eph_list_t eph_history;
|
1104
1158
|
public:
|
@@ -1115,7 +1169,7 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
1115
1169
|
}
|
1116
1170
|
|
1117
1171
|
void register_ephemeris(const eph_t &eph, const int &priority_delta = 1){
|
1118
|
-
eph_history.add(eph, priority_delta);
|
1172
|
+
eph_history.add(eph_cached_t(eph), priority_delta);
|
1119
1173
|
}
|
1120
1174
|
|
1121
1175
|
void merge(const Satellite &another, const bool &keep_original = true){
|
@@ -1143,7 +1197,7 @@ if(std::abs(TARGET - eph.TARGET) > raw_t::sf[raw_t::SF_ ## TARGET]){break;}
|
|
1143
1197
|
typename GPS_SpaceNode<float_t>::SatelliteProperties::constellation_t constellation(
|
1144
1198
|
const GPS_Time<float_t> &t, const float_t &pseudo_range = 0) const {
|
1145
1199
|
return (typename GPS_SpaceNode<float_t>::SatelliteProperties::constellation_t)(
|
1146
|
-
|
1200
|
+
eph_history.current().constellation(t, pseudo_range));
|
1147
1201
|
}
|
1148
1202
|
|
1149
1203
|
typename GPS_SpaceNode<float_t>::xyz_t position(const GPS_Time<float_t> &t, const float_t &pseudo_range = 0) const {
|
@@ -1267,4 +1321,9 @@ typename GLONASS_SpaceNode<FloatT>::u8_t GLONASS_SpaceNode<FloatT>::SatellitePro
|
|
1267
1321
|
return res;
|
1268
1322
|
}
|
1269
1323
|
|
1324
|
+
template <class FloatT>
|
1325
|
+
const typename GLONASS_SpaceNode<FloatT>::float_t
|
1326
|
+
GLONASS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris_with_Time
|
1327
|
+
::time_step_max_per_one_integration = 60;
|
1328
|
+
|
1270
1329
|
#endif /* __GLONASS_H__ */
|
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.4.
|
4
|
+
version: 0.4.1
|
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-03-
|
11
|
+
date: 2022-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|