gps_pvt 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|