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.Acceleration;
19  import com.irurueta.units.AccelerationConverter;
20  import com.irurueta.units.AccelerationUnit;
21  
22  import java.io.Serial;
23  
24  /**
25   * Contains a triad of acceleration measurements.
26   */
27  public class AccelerationTriad extends Triad<AccelerationUnit, Acceleration, AccelerationTriad> implements Cloneable {
28  
29      /**
30       * Default acceleration unit.
31       */
32      public static final AccelerationUnit DEFAULT_UNIT = AccelerationUnit.METERS_PER_SQUARED_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 AccelerationTriad() {
45          this(DEFAULT_UNIT);
46      }
47  
48      /**
49       * Constructor.
50       *
51       * @param unit acceleration unit for stored values.
52       */
53      public AccelerationTriad(final AccelerationUnit 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 AccelerationTriad(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   acceleration 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 AccelerationTriad(
80              final AccelerationUnit 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 AccelerationTriad(
92              final Acceleration measurementX, final Acceleration measurementY, final Acceleration 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 AccelerationTriad(final AccelerationTriad 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 Acceleration getMeasurementX() {
113         return new Acceleration(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 Acceleration 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 Acceleration measurementX) {
135         setValueX(AccelerationConverter.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 Acceleration getMeasurementY() {
146         return new Acceleration(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 Acceleration 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 Acceleration measurementY) {
168         setValueY(AccelerationConverter.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 Acceleration getMeasurementZ() {
179         return new Acceleration(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 Acceleration 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 Acceleration measurementZ) {
201         setValueZ(AccelerationConverter.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 Acceleration measurementX, final Acceleration measurementY, final Acceleration measurementZ) {
215         setMeasurementX(measurementX);
216         setMeasurementY(measurementY);
217         setMeasurementZ(measurementZ);
218     }
219 
220     /**
221      * Gets norm as an acceleration.
222      *
223      * @return acceleration containing triad norm.
224      */
225     @Override
226     public Acceleration getMeasurementNorm() {
227         return new Acceleration(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 AccelerationTriad copy() {
238         final var result = new AccelerationTriad();
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 = (AccelerationTriad) super.clone();
252         copyTo(result);
253         return result;
254     }
255 }