1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.ar.slam;
17
18
19
20
21
22
23
24 public class ConstantVelocityModelSlamCalibrator extends BaseSlamCalibrator<ConstantVelocityModelSlamCalibrationData> {
25
26
27
28
29 private double lastAngularSpeedX;
30
31
32
33
34 private double lastAngularSpeedY;
35
36
37
38
39 private double lastAngularSpeedZ;
40
41
42
43
44
45 private long lastTimestampNanos = -1;
46
47
48
49
50 public ConstantVelocityModelSlamCalibrator() {
51 super(ConstantVelocityModelSlamEstimator.CONTROL_LENGTH);
52 }
53
54
55
56
57 @Override
58 public void reset() {
59 super.reset();
60 lastAngularSpeedX = lastAngularSpeedY = lastAngularSpeedZ = 0.0;
61 lastTimestampNanos = -1;
62 }
63
64
65
66
67
68
69 @Override
70 protected int getEstimatorStateLength() {
71 return ConstantVelocityModelSlamEstimator.STATE_LENGTH;
72 }
73
74
75
76
77
78
79
80 @Override
81 public ConstantVelocityModelSlamCalibrationData getCalibrationData() {
82 final var result = new ConstantVelocityModelSlamCalibrationData();
83 getCalibrationData(result);
84 return result;
85 }
86
87
88
89
90
91 @SuppressWarnings("DuplicatedCode")
92 @Override
93 protected void processFullSample() {
94 if (listener != null) {
95 listener.onFullSampleReceived(this);
96 }
97
98 final var timestamp = getMostRecentTimestampNanos();
99 if (lastTimestampNanos < 0) {
100
101
102 lastAngularSpeedX = accumulatedAngularSpeedSampleX;
103 lastAngularSpeedY = accumulatedAngularSpeedSampleY;
104 lastAngularSpeedZ = accumulatedAngularSpeedSampleZ;
105
106 lastTimestampNanos = timestamp;
107
108 if (listener != null) {
109 listener.onFullSampleProcessed(this);
110 }
111
112 return;
113 }
114
115 final var deltaAngularSpeedX = accumulatedAngularSpeedSampleX - lastAngularSpeedX;
116 final var deltaAngularSpeedY = accumulatedAngularSpeedSampleY - lastAngularSpeedY;
117 final var deltaAngularSpeedZ = accumulatedAngularSpeedSampleZ - lastAngularSpeedZ;
118 final var deltaTimestamp = (timestamp - lastTimestampNanos) * NANOS_TO_SECONDS;
119
120 sample[0] = accumulatedAccelerationSampleX * deltaTimestamp;
121 sample[1] = accumulatedAccelerationSampleY * deltaTimestamp;
122 sample[2] = accumulatedAccelerationSampleZ * deltaTimestamp;
123 sample[3] = deltaAngularSpeedX;
124 sample[4] = deltaAngularSpeedY;
125 sample[5] = deltaAngularSpeedZ;
126 updateSample();
127
128 lastAngularSpeedX = accumulatedAngularSpeedSampleX;
129 lastAngularSpeedY = accumulatedAngularSpeedSampleY;
130 lastAngularSpeedZ = accumulatedAngularSpeedSampleZ;
131
132 lastTimestampNanos = timestamp;
133
134 if (listener != null) {
135 listener.onFullSampleProcessed(this);
136 }
137 }
138 }