1 /*
2 * Copyright (C) 2020 Alberto Irurueta Carro (alberto@irurueta.com)
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.irurueta.navigation.inertial.calibration;
17
18 import com.irurueta.units.AngularSpeed;
19 import com.irurueta.units.AngularSpeedConverter;
20 import com.irurueta.units.AngularSpeedUnit;
21
22 import java.io.Serial;
23
24 /**
25 * Contains a triad of angular speed measurements.
26 */
27 public class AngularSpeedTriad extends Triad<AngularSpeedUnit, AngularSpeed, AngularSpeedTriad> implements Cloneable {
28
29 /**
30 * Default angular speed unit.
31 */
32 public static final AngularSpeedUnit DEFAULT_UNIT = AngularSpeedUnit.RADIANS_PER_SECOND;
33
34 /**
35 * Serialization version. This is used to ensure compatibility of deserialization of permanently stored serialized
36 * instances.
37 */
38 @Serial
39 private static final long serialVersionUID = 0L;
40
41 /**
42 * Constructor.
43 */
44 public AngularSpeedTriad() {
45 this(DEFAULT_UNIT);
46 }
47
48 /**
49 * Constructor.
50 *
51 * @param unit angular speed unit for stored values.
52 */
53 public AngularSpeedTriad(final AngularSpeedUnit unit) {
54 super(unit);
55 }
56
57 /**
58 * Constructor.
59 *
60 * @param valueX x-coordinate of measurement value expressed in default unit.
61 * @param valueY y-coordinate of measurement value expressed in default unit.
62 * @param valueZ z-coordinate of measurement value expressed in default unit.
63 */
64 public AngularSpeedTriad(final double valueX, final double valueY, final double valueZ) {
65 this(DEFAULT_UNIT, valueX, valueY, valueZ);
66 }
67
68 /**
69 * Constructor.
70 *
71 * @param unit angular speed unit for stored values.
72 * @param valueX x-coordinate of measurement value expressed in
73 * provided unit.
74 * @param valueY y-coordinate of measurement value expressed in
75 * provided unit.
76 * @param valueZ z-coordinate of measurement value expressed in
77 * provided unit.
78 */
79 public AngularSpeedTriad(
80 final AngularSpeedUnit unit, final double valueX, final double valueY, final double valueZ) {
81 super(unit, valueX, valueY, valueZ);
82 }
83
84 /**
85 * Constructor.
86 *
87 * @param measurementX x-coordinate of measurement.
88 * @param measurementY y-coordinate of measurement.
89 * @param measurementZ z-coordinate of measurement.
90 */
91 public AngularSpeedTriad(
92 final AngularSpeed measurementX, final AngularSpeed measurementY, final AngularSpeed measurementZ) {
93 super(DEFAULT_UNIT);
94 setMeasurementCoordinates(measurementX, measurementY, measurementZ);
95 }
96
97 /**
98 * Copy constructor.
99 *
100 * @param other instance to copy from.
101 */
102 public AngularSpeedTriad(final AngularSpeedTriad other) {
103 super(other);
104 }
105
106 /**
107 * Gets x coordinate of measurement value.
108 *
109 * @return x coordinate of measurement value.
110 */
111 @Override
112 public AngularSpeed getMeasurementX() {
113 return new AngularSpeed(getValueX(), getUnit());
114 }
115
116 /**
117 * Gets x coordinate of measurement value.
118 *
119 * @param result instance where x coordinate of measurement value
120 * will be stored.
121 */
122 @Override
123 public void getMeasurementX(final AngularSpeed result) {
124 result.setValue(getValueX());
125 result.setUnit(getUnit());
126 }
127
128 /**
129 * Sets x coordinate of measurement value.
130 *
131 * @param measurementX x coordinate of measurement value.
132 */
133 @Override
134 public void setMeasurementX(final AngularSpeed measurementX) {
135 setValueX(AngularSpeedConverter.convert(measurementX.getValue(), measurementX.getUnit(),
136 getUnit()).doubleValue());
137 }
138
139 /**
140 * Gets y coordinate of measurement value.
141 *
142 * @return y coordinate of measurement value.
143 */
144 @Override
145 public AngularSpeed getMeasurementY() {
146 return new AngularSpeed(getValueY(), getUnit());
147 }
148
149 /**
150 * Gets y coordinate of measurement value.
151 *
152 * @param result instance where y coordinate of measurement value
153 * will be stored.
154 */
155 @Override
156 public void getMeasurementY(final AngularSpeed result) {
157 result.setValue(getValueY());
158 result.setUnit(getUnit());
159 }
160
161 /**
162 * Sets y coordinate of measurement value.
163 *
164 * @param measurementY y coordinate of measurement value.
165 */
166 @Override
167 public void setMeasurementY(final AngularSpeed measurementY) {
168 setValueY(AngularSpeedConverter.convert(measurementY.getValue(), measurementY.getUnit(),
169 getUnit()).doubleValue());
170 }
171
172 /**
173 * Gets z coordinate of measurement value.
174 *
175 * @return z coordinate of measurement value.
176 */
177 @Override
178 public AngularSpeed getMeasurementZ() {
179 return new AngularSpeed(getValueZ(), getUnit());
180 }
181
182 /**
183 * Gets z coordinate of measurement value.
184 *
185 * @param result instance where z coordinate of measurement value
186 * will be stored.
187 */
188 @Override
189 public void getMeasurementZ(final AngularSpeed result) {
190 result.setValue(getValueZ());
191 result.setUnit(getUnit());
192 }
193
194 /**
195 * Sets z coordinate of measurement value.
196 *
197 * @param measurementZ z coordinate of measurement value.
198 */
199 @Override
200 public void setMeasurementZ(final AngularSpeed measurementZ) {
201 setValueZ(AngularSpeedConverter.convert(measurementZ.getValue(), measurementZ.getUnit(),
202 getUnit()).doubleValue());
203 }
204
205 /**
206 * Sets measurement coordinates.
207 *
208 * @param measurementX x coordinate of measurement value.
209 * @param measurementY y coordinate of measurement value.
210 * @param measurementZ z coordinate of measurement value.
211 */
212 @Override
213 public void setMeasurementCoordinates(
214 final AngularSpeed measurementX, final AngularSpeed measurementY, final AngularSpeed measurementZ) {
215 setMeasurementX(measurementX);
216 setMeasurementY(measurementY);
217 setMeasurementZ(measurementZ);
218 }
219
220 /**
221 * Gets norm as an angular speed.
222 *
223 * @return angular speed containing triad norm.
224 */
225 @Override
226 public AngularSpeed getMeasurementNorm() {
227 return new AngularSpeed(getNorm(), getUnit());
228 }
229
230 /**
231 * Creates and returns a new instance having exactly the same contents
232 * as this instance.
233 *
234 * @return a copy of this instance.
235 */
236 @Override
237 public AngularSpeedTriad copy() {
238 final var result = new AngularSpeedTriad();
239 result.copyFrom(this);
240 return result;
241 }
242
243 /**
244 * Makes a copy of this instance.
245 *
246 * @return a copy of this instance.
247 * @throws CloneNotSupportedException if clone fails for some reason.
248 */
249 @Override
250 protected Object clone() throws CloneNotSupportedException {
251 final var result = (AngularSpeedTriad) super.clone();
252 copyTo(result);
253 return result;
254 }
255 }