@wemap/positioning 2.0.0 → 2.2.0

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.
Files changed (99) hide show
  1. package/.eslintrc.json +4 -2
  2. package/debug/absolute-attitude.html +16 -0
  3. package/debug/arcore.html +16 -0
  4. package/debug/gnss-wifi-pdr.html +16 -0
  5. package/debug/gnss-wifi.html +16 -0
  6. package/debug/imu.html +16 -0
  7. package/debug/inclination.html +16 -0
  8. package/debug/pdr.html +16 -0
  9. package/debug/pose.html +16 -0
  10. package/debug/positioning.html +16 -0
  11. package/debug/relative-attitude.html +16 -0
  12. package/package.json +7 -4
  13. package/src/PositioningHandler.js +96 -34
  14. package/src/components/AbsoluteAttitudeComponent.jsx +104 -0
  15. package/src/components/ArCoreComponent.jsx +74 -0
  16. package/src/components/GnssWifiComponent.jsx +58 -0
  17. package/src/components/GnssWifiPdrComponent.jsx +94 -0
  18. package/src/components/ImuComponent.jsx +100 -0
  19. package/src/components/InclinationComponent.jsx +53 -0
  20. package/src/components/MapComponent.jsx +226 -0
  21. package/src/components/PdrComponent.jsx +97 -0
  22. package/src/components/PoseComponent.jsx +81 -0
  23. package/src/components/PositioningComponent.jsx +26 -0
  24. package/src/components/PositioningInclinationComponent.jsx +76 -0
  25. package/src/components/PositioningPoseComponent.jsx +120 -0
  26. package/src/components/RelativeAttitudeComponent.jsx +82 -0
  27. package/src/components/StartStopComponent.jsx +50 -0
  28. package/src/components/Utils.js +92 -0
  29. package/src/components/index.js +32 -0
  30. package/src/errors/AskImuOnDesktopError.js +9 -0
  31. package/src/errors/GeolocationApiMissingError.js +9 -0
  32. package/src/errors/GeolocationPermissionDeniedError.js +9 -0
  33. package/src/errors/GeolocationPositionUnavailableError.js +9 -0
  34. package/src/errors/IpResolveServerError.js +9 -0
  35. package/src/errors/MissingAccelerometerError.js +11 -0
  36. package/src/errors/MissingArCoreError.js +9 -0
  37. package/src/errors/MissingGyroscopeError.js +11 -0
  38. package/src/errors/MissingMagnetometerError.js +9 -0
  39. package/src/errors/MissingNativeInterfaceError.js +9 -0
  40. package/src/errors/MissingSensorError.js +14 -0
  41. package/src/events/EventType.js +20 -0
  42. package/src/events/ProviderError.js +52 -0
  43. package/src/events/ProviderEvent.js +35 -0
  44. package/src/index.js +2 -2
  45. package/src/providers/Constants.js +5 -0
  46. package/src/providers/FakeAbsolutePositionProvider.js +56 -0
  47. package/src/providers/Provider.js +230 -0
  48. package/src/providers/ProviderOptions.js +28 -0
  49. package/{src.old → src}/providers/ProvidersLogger.js +2 -2
  50. package/src/providers/attitude/AbsoluteAttitudeProvider.js +207 -0
  51. package/src/providers/attitude/RelativeAttitudeProvider.js +129 -0
  52. package/src/providers/others/ImuProvider.js +186 -0
  53. package/src/providers/others/InclinationProvider.js +107 -0
  54. package/{src.old/providers/LocationSource.js → src/providers/others/MapMatchingProvider.js} +5 -148
  55. package/src/providers/pose/ArCoreProvider.js +127 -0
  56. package/src/providers/pose/GnssWifiPdrProvider.js +233 -0
  57. package/src/providers/pose/PoseProvider.js +90 -0
  58. package/{src.old/providers/PdrLocationSource.js → src/providers/pose/pdr/PdrProvider.js} +145 -113
  59. package/{src.old/providers/pdr → src/providers/pose/pdr/helpers}/Smoother.js +1 -1
  60. package/src/providers/position/GnssWifiProvider.js +129 -0
  61. package/src/providers/position/IpProvider.js +75 -0
  62. package/webpack/webpack.common.js +1 -1
  63. package/webpack/webpack.dev.js +1 -1
  64. package/debug/index.html +0 -15
  65. package/debug/index.old.html +0 -37
  66. package/scripts/release-github.js +0 -216
  67. package/src/providers/FakeLocationSource.js +0 -36
  68. package/src.old/Constants.js +0 -11
  69. package/src.old/NavigationHandler.js +0 -244
  70. package/src.old/Pose.js +0 -8
  71. package/src.old/attitude/AttitudeHandler.js +0 -342
  72. package/src.old/components/AbsoluteAttitude.jsx +0 -136
  73. package/src.old/components/Imu.jsx +0 -89
  74. package/src.old/components/LocationSource.jsx +0 -434
  75. package/src.old/components/Logger.jsx +0 -113
  76. package/src.old/components/NavigationDebugApp.jsx +0 -106
  77. package/src.old/components/Others.jsx +0 -121
  78. package/src.old/components/RelativeAttitude.jsx +0 -104
  79. package/src.old/components/Utils.js +0 -35
  80. package/src.old/components/index.js +0 -13
  81. package/src.old/index.js +0 -7
  82. package/src.old/providers/FixedLocationImuLocationSource.js +0 -66
  83. package/src.old/providers/GnssLocationSource.js +0 -118
  84. package/src.old/providers/GnssPdrLocationSource.js +0 -182
  85. package/src.old/providers/IPLocationSource.js +0 -96
  86. package/src.old/sensors/SensorsCompatibility.js +0 -486
  87. package/src.old/sensors/SensorsCompatibility.spec.js +0 -270
  88. package/src.old/sensors/SensorsLogger.js +0 -94
  89. package/src.old/sensors/SensorsLoggerUtils.js +0 -35
  90. /package/{src.old → src/providers}/attitude/EkfAttitude.js +0 -0
  91. /package/{src.old → src/providers}/attitude/EkfAttitude.spec.js +0 -0
  92. /package/{src.old/providers/pdr → src/providers/pose/pdr/helpers}/HeadingUnlocker.js +0 -0
  93. /package/{src.old/providers/pdr → src/providers/pose/pdr/helpers}/HeadingUnlocker.spec.js +0 -0
  94. /package/{src.old/providers/pdr → src/providers/pose/pdr/helpers}/Smoother.spec.js +0 -0
  95. /package/{src.old/providers/pdr → src/providers/pose/pdr/helpers}/ThugDetector.js +0 -0
  96. /package/{src.old/providers → src/providers/pose/pdr}/steps/StepDetection.js +0 -0
  97. /package/{src.old/providers → src/providers/pose/pdr}/steps/StepDetectionLadetto.js +0 -0
  98. /package/{src.old/providers → src/providers/pose/pdr}/steps/StepDetectionMinMaxPeaks.js +0 -0
  99. /package/{src.old/providers → src/providers/pose/pdr}/steps/StepDetectionMinMaxPeaks2.js +0 -0
@@ -1,270 +0,0 @@
1
- import chai from 'chai';
2
- import chaiAlmost from 'chai-almost';
3
- import chaiAsPromised from 'chai-as-promised';
4
- import 'jsdom-global/register';
5
-
6
- import SensorsCompatibility from './SensorsCompatibility';
7
-
8
- const expect = chai.expect;
9
- chai.use(chaiAlmost());
10
- chai.use(chaiAsPromised);
11
-
12
- const IOS_USER_AGENT = 'iPad';
13
- const ANDROID_USER_AGENT = 'Android';
14
- const FIREFOX_USER_AGENT = 'Firefox';
15
- const OPERA_USER_AGENT = 'Opera';
16
- const UNKNOWN_USER_AGENT = 'foobar';
17
-
18
- const defaultMotionSensors = {
19
- accelerometer: true,
20
- gyroscope: true,
21
- magnetometer: true
22
- };
23
-
24
- const defaultDeviceMotionSensors = {
25
- accelerometer: true,
26
- gyroscope: true,
27
- magnetometer: false
28
- };
29
-
30
- const timestamps = [
31
- 0, 0.02, 0.04, 0.06, 0.08
32
- ];
33
-
34
- const accData = [
35
- [-0.034561157, 3.81073, 8.860977],
36
- [-0.030700684, 3.814499, 8.818954],
37
- [-0.018234253, 3.8023376, 8.85762],
38
- [-0.020080566, 3.8205414, 8.8676605],
39
- [-0.054519653, 3.8456726, 8.810287]
40
- ];
41
-
42
- const gyrData = [
43
- [0.0047454834, 0.0028076172, 0.0022888184],
44
- [0.005218506, 0.0020446777, 0.0012207031],
45
- [0.0044555664, 0.0023040771, 4.4250488E-4],
46
- [0.0044555664, 0.0027618408, 0.0011444092],
47
- [0.0040893555, 0.0020446777, 0.0025787354]
48
- ];
49
-
50
-
51
- function fakeUserAgent(userAgent) {
52
- navigator.__defineGetter__('userAgent', () => userAgent);
53
- }
54
-
55
- const commonDeviceMotion = (userAgent = ANDROID_USER_AGENT,
56
- _simulatedSensors = defaultDeviceMotionSensors,
57
- _expectedSensors = defaultDeviceMotionSensors) => {
58
-
59
- const simulatedSensors = !_simulatedSensors ? defaultMotionSensors : _simulatedSensors;
60
- const expectedSensors = !_expectedSensors ? defaultMotionSensors : _expectedSensors;
61
-
62
- return new Promise((resolve, reject) => {
63
- const result = [];
64
-
65
- fakeUserAgent(userAgent);
66
- document.hasFocus = () => true;
67
- const sc = new SensorsCompatibility();
68
-
69
- let eventsReceived = 0;
70
- sc.startImu((e) => {
71
- result.push(e);
72
-
73
- eventsReceived++;
74
- if (eventsReceived === accData.length) {
75
- resolve(result);
76
- }
77
- }, expectedSensors).catch(e => {
78
- reject(e);
79
- });
80
-
81
- if (!simulatedSensors.accelerometer && !simulatedSensors.gyroscope) {
82
- return;
83
- }
84
-
85
- for (let i = 0; i < timestamps.length; i++) {
86
-
87
- const event = new CustomEvent('devicemotion');
88
-
89
- Object.defineProperty(event, 'timeStamp', { get: () => timestamps[i] });
90
-
91
- if (simulatedSensors.accelerometer) {
92
- const acc = accData[i];
93
- event.accelerationIncludingGravity = {
94
- x: acc[0],
95
- y: acc[1],
96
- z: acc[2]
97
- };
98
- }
99
-
100
- if (simulatedSensors.gyroscope) {
101
- const gyr = gyrData[i];
102
- event.rotationRate = {
103
- alpha: gyr[0],
104
- beta: gyr[1],
105
- gamma: gyr[2]
106
- };
107
- }
108
- window.dispatchEvent(event);
109
- }
110
- });
111
- };
112
-
113
-
114
- describe('devicemotion', () => {
115
-
116
- it('[Android] Acc - Gyr', (done) => {
117
- commonDeviceMotion(ANDROID_USER_AGENT).then((receivedDataset) => {
118
- for (let i = 0; i < receivedDataset.length; i++) {
119
- const e = receivedDataset[i];
120
-
121
- const expectedGyr = gyrData[i].map(x => x * Math.PI / 180);
122
- const expectedAcc = accData[i];
123
- const expectedTimestamp = timestamps[i] / 1e3;
124
-
125
- expect(e.timestamp).almost(expectedTimestamp);
126
- expect(e.acc).deep.almost(expectedAcc);
127
- expect(e.gyr).deep.almost(expectedGyr);
128
- }
129
- done();
130
- }).catch(e => done(e));
131
- });
132
-
133
- it('[iOS] Acc - Gyr', (done) => {
134
- commonDeviceMotion(IOS_USER_AGENT).then((receivedDataset) => {
135
- for (let i = 0; i < receivedDataset.length; i++) {
136
- const e = receivedDataset[i];
137
-
138
- const expectedGyr = gyrData[i].map(x => x * Math.PI / 180);
139
- const expectedAcc = accData[i].map(x => -x);
140
- const expectedTimestamp = timestamps[i] / 1e3;
141
-
142
- expect(e.timestamp).almost(expectedTimestamp);
143
- expect(e.acc).deep.almost(expectedAcc);
144
- expect(e.gyr).deep.almost(expectedGyr);
145
- }
146
- done();
147
- }).catch(e => done(e));
148
- });
149
-
150
- it('[Firefox] Acc - Gyr', (done) => {
151
- commonDeviceMotion(FIREFOX_USER_AGENT).then((receivedDataset) => {
152
- for (let i = 0; i < receivedDataset.length; i++) {
153
- const e = receivedDataset[i];
154
-
155
- const expectedGyr = gyrData[i].map(x => x * Math.PI / 180);
156
- const expectedAcc = accData[i];
157
- const expectedTimestamp = timestamps[i] / 1e3;
158
-
159
- expect(e.timestamp).almost(expectedTimestamp);
160
- expect(e.acc).deep.almost(expectedAcc);
161
- expect(e.gyr).deep.almost(expectedGyr);
162
- }
163
- done();
164
- }).catch(e => done(e));
165
- });
166
-
167
- it('[Opera] Acc - Gyr', (done) => {
168
- commonDeviceMotion(OPERA_USER_AGENT).then((receivedDataset) => {
169
- for (let i = 0; i < receivedDataset.length; i++) {
170
- const e = receivedDataset[i];
171
-
172
- const expectedGyr = gyrData[i].map(x => x * Math.PI / 180);
173
- const expectedAcc = accData[i];
174
- const expectedTimestamp = timestamps[i] / 1e3;
175
-
176
- expect(e.timestamp).almost(expectedTimestamp);
177
- expect(e.acc).deep.almost(expectedAcc);
178
- expect(e.gyr).deep.almost(expectedGyr);
179
- }
180
- done();
181
- }).catch(e => done(e));
182
- });
183
-
184
-
185
- it('[Unknown] Acc - Gyr', (done) => {
186
- commonDeviceMotion(UNKNOWN_USER_AGENT).then((receivedDataset) => {
187
- for (let i = 0; i < receivedDataset.length; i++) {
188
- const e = receivedDataset[i];
189
-
190
- const expectedGyr = gyrData[i].map(x => x * Math.PI / 180);
191
- const expectedAcc = accData[i];
192
- const expectedTimestamp = timestamps[i] / 1e3;
193
-
194
- expect(e.timestamp).almost(expectedTimestamp);
195
- expect(e.acc).deep.almost(expectedAcc);
196
- expect(e.gyr).deep.almost(expectedGyr);
197
- }
198
- done();
199
- }).catch(e => done(e));
200
- });
201
-
202
-
203
- it('[Unknown] Missing gyr', (done) => {
204
-
205
- const globalTimeout = setTimeout(() => done(), 20);
206
-
207
- commonDeviceMotion(UNKNOWN_USER_AGENT,
208
- {
209
- accelerometer: true,
210
- gyroscope: false
211
- }, {
212
- accelerometer: true,
213
- gyroscope: true
214
- })
215
- .then(() => {
216
- clearTimeout(globalTimeout);
217
- done(Error('Should not success'));
218
- })
219
- .catch(() => {
220
- clearTimeout(globalTimeout);
221
- done(Error('Should not reject'));
222
- });
223
- });
224
-
225
-
226
- it('[Unknown] Missing acc', (done) => {
227
-
228
- const globalTimeout = setTimeout(() => done(), 20);
229
-
230
- commonDeviceMotion(UNKNOWN_USER_AGENT,
231
- {
232
- accelerometer: true,
233
- gyroscope: false
234
- }, {
235
- accelerometer: true,
236
- gyroscope: true
237
- })
238
- .then(() => {
239
- clearTimeout(globalTimeout);
240
- done(Error('Should not success'));
241
- })
242
- .catch(() => {
243
- clearTimeout(globalTimeout);
244
- done(Error('Should not reject'));
245
- });
246
- });
247
-
248
-
249
- it('[Unknown] No sensor', (done) => {
250
-
251
- const globalTimeout = setTimeout(() => done(), 20);
252
-
253
- commonDeviceMotion(UNKNOWN_USER_AGENT,
254
- {
255
- accelerometer: false,
256
- gyroscope: false
257
- }, {
258
- accelerometer: true,
259
- gyroscope: true
260
- })
261
- .then(() => {
262
- clearTimeout(globalTimeout);
263
- done(Error('Should not success'));
264
- })
265
- .catch(() => {
266
- clearTimeout(globalTimeout);
267
- done(Error('Should not reject'));
268
- });
269
- });
270
- });
@@ -1,94 +0,0 @@
1
-
2
- const DataType = {
3
- ACCELEROMETER: 0,
4
- GYROSCOPE: 1,
5
- DEVICE_ORIENTATION_RELATIVE: 2,
6
- DEVICE_ORIENTATION_ABSOLUTE: 3,
7
- WATCH_POSITION: 4,
8
- USER_INPUT_POSITION: 10,
9
- USER_INPUT_HEADING: 11,
10
- IP_POSITION: 12
11
- };
12
-
13
- const PRECISION = 1000;
14
-
15
- class SensorsLogger {
16
-
17
- constructor() {
18
- this.dataset = [];
19
- this.videoBlobs = [];
20
- this.removeDuplicates = true;
21
-
22
- this.lastDataTimestamp = new Array(DataType.length);
23
- for (let i = 0; i < DataType.length; i++) {
24
- this.lastDataTimestamp[i] = 0;
25
- }
26
- }
27
-
28
- static get DataType() {
29
- return DataType;
30
- }
31
-
32
- disableRemoveDuplicates() {
33
- this.removeDuplicates = false;
34
- }
35
-
36
- feedWithCurrentTime(dataType, data, compact) {
37
- this.feed(dataType, performance.now() / 1e3, data, compact);
38
- }
39
-
40
- feed(dataType, timestamp, _data, compact = false) {
41
-
42
- let data;
43
-
44
- const smallTimestamp = Math.round(timestamp * PRECISION) / PRECISION;
45
- if (this.removeDuplicates && this.lastDataTimestamp[dataType] === timestamp) {
46
- return;
47
- }
48
-
49
- if (compact) {
50
- const smallData = new Array(_data.length);
51
- for (let i = 0; i < _data.length; i++) {
52
- smallData[i] = Math.round(_data[i] * PRECISION) / PRECISION;
53
- }
54
- data = smallData;
55
- } else {
56
- data = _data;
57
- }
58
-
59
- const dataArray = [dataType, smallTimestamp].concat(data);
60
- this.dataset.push(dataArray);
61
- if (this.removeDuplicates) {
62
- this.lastDataTimestamp[dataType] = timestamp;
63
- }
64
- }
65
-
66
- // TODO: this is not linked to the rest of the code. Check why
67
- // videoFeed = event => {
68
- // if (event.data && event.data.size > 0) {
69
- // this.videoBlobs.push(event.data);
70
- // }
71
- // }
72
-
73
- getVideoSize() {
74
- return this.videoBlobs.length;
75
- }
76
-
77
- /**
78
- * Pop current logs dataset
79
- */
80
- pop() {
81
- const currentDataset = this.dataset;
82
- this.dataset = [];
83
- return currentDataset;
84
- }
85
-
86
- popVideoBlob() {
87
- const currentVideoBlobs = this.videoBlobs;
88
- this.videoBlobs = [];
89
- return new Blob(currentVideoBlobs, { type: 'video/webm' });
90
- }
91
-
92
- }
93
-
94
- export default SensorsLogger;
@@ -1,35 +0,0 @@
1
- import JSZip from 'jszip';
2
- import { saveAs } from 'file-saver';
3
-
4
- class SensorsLoggerUtils {
5
-
6
- static download(sensorsLogger) {
7
-
8
- const data = sensorsLogger.pop();
9
- const csvData = data.map(row => row.join(',')).join('\r\n');
10
-
11
- const zip = new JSZip();
12
- zip.file('data.csv', csvData);
13
- zip.file('video.webm', sensorsLogger.popVideoBlob());
14
- zip.generateAsync({ type: 'blob' })
15
- .then(function(content) {
16
- saveAs(content, 'dataset.zip');
17
- });
18
- }
19
-
20
-
21
- /**
22
- * Return a value equivalent to performance now from a given unix timestamp
23
- * @param {Number} timestamp a unix timestamp
24
- * @returns timestamp relative to performance.now()
25
- */
26
- static unixTimestampToPerformanceNow(timestamp) {
27
-
28
- if (!window || !window.performance) {
29
- throw new Error('window.performance does not exist');
30
- }
31
- return window.performance.now() + timestamp - new Date().getTime();
32
- }
33
- }
34
-
35
- export default SensorsLoggerUtils;