View Javadoc
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 }