View Javadoc
1   /*
2    * Copyright (C) 2019 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.estimators;
17  
18  import com.irurueta.algebra.AlgebraException;
19  import com.irurueta.algebra.Matrix;
20  import com.irurueta.algebra.Utils;
21  import com.irurueta.navigation.frames.CoordinateTransformation;
22  import com.irurueta.navigation.frames.NEDFrame;
23  import com.irurueta.navigation.frames.NEDPosition;
24  import com.irurueta.navigation.frames.NEDVelocity;
25  import com.irurueta.navigation.geodesic.Constants;
26  import com.irurueta.navigation.inertial.BodyKinematics;
27  import com.irurueta.units.*;
28  
29  /**
30   * Estimates body kinematics (specific force applied to a body and its angular rate) with respect and resolved
31   * along north, east, and down.
32   * This implementation is based on the equations defined in "Principles of GNSS, Inertial, and Multisensor
33   * Integrated Navigation Systems, Second Edition" and on the companion software available at:
34   * <a href="https://github.com/ymjdz/MATLAB-Codes/blob/master/Kinematics_NED.m">
35   *     https://github.com/ymjdz/MATLAB-Codes/blob/master/Kinematics_NED.m
36   * </a>
37   */
38  public class NEDKinematicsEstimator {
39  
40      /**
41       * Earth rotation rate expressed in radians per second (rad/s).
42       */
43      public static final double EARTH_ROTATION_RATE = Constants.EARTH_ROTATION_RATE;
44  
45      /**
46       * Scaling threshold.
47       */
48      private static final double SCALING_THRESHOLD = 2e-5;
49  
50      /**
51       * Alpha threshold.
52       */
53      private static final double ALPHA_THRESHOLD = 1e-8;
54  
55      /**
56       * Number of rows.
57       */
58      private static final int ROWS = 3;
59  
60      /**
61       * Estimates body kinematics (specific force applied to a body and its angular rates)
62       * with respect NED frame and resolved along body-frame axes, averaged over time interval.
63       *
64       * @param timeInterval time interval between epochs expressed in seconds (s).
65       * @param c            body-to-NED coordinate transformation.
66       * @param oldC         previous body-to-NED coordinate transformation.
67       * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
68       *                     north, east, and down and expressed in meters per second (m/s).
69       * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
70       *                     north, east, and down and expressed in meters per second (m/s).
71       * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
72       *                     north, east, and down and expressed in meters per second (m/s).
73       * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
74       *                     along north, east, and down and expressed in meters per second (m/s).
75       * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
76       *                     along north, east, and down and expressed in meters per second (m/s).
77       * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
78       *                     along north, east, and down and expressed in meters per second (m/s).
79       * @param latitude     current latitude expressed in radians (rad).
80       * @param height       current height expressed in meters (m).
81       * @param oldLatitude  previous latitude expressed in radians (rad).
82       * @param oldHeight    previous height expressed in meters (m).
83       * @param result       instance where estimated body kinematics will be stored.
84       * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
85       *                                  matrices are not NED frame valid.
86       */
87      public void estimate(
88              final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
89              final double vn, final double ve, final double vd,
90              final double oldVn, final double oldVe, final double oldVd,
91              final double latitude, final double height, final double oldLatitude, final double oldHeight,
92              final BodyKinematics result) {
93          estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
94                  oldLatitude, oldHeight, result);
95      }
96  
97      /**
98       * Estimates body kinematics (specific force applied to a body and its angular rates)
99       * with respect NED frame and resolved along body-frame axes, averaged over time interval.
100      *
101      * @param timeInterval time interval between epochs.
102      * @param c            body-to-NED coordinate transformation.
103      * @param oldC         previous body-to-NED coordinate transformation.
104      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
105      *                     north, east, and down and expressed in meters per second (m/s).
106      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
107      *                     north, east, and down and expressed in meters per second (m/s).
108      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
109      *                     north, east, and down and expressed in meters per second (m/s).
110      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
111      *                     along north, east, and down and expressed in meters per second (m/s).
112      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
113      *                     along north, east, and down and expressed in meters per second (m/s).
114      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
115      *                     along north, east, and down and expressed in meters per second (m/s).
116      * @param latitude     current latitude expressed in radians (rad).
117      * @param height       current height expressed in meters (m).
118      * @param oldLatitude  previous latitude expressed in radians (rad).
119      * @param oldHeight    previous height expressed in meters (m).
120      * @param result       instance where estimated body kinematics will be stored.
121      * @throws IllegalArgumentException if provided time interval is negative or coordinate
122      */
123     public void estimate(
124             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
125             final double vn, final double ve, final double vd,
126             final double oldVn, final double oldVe, final double oldVd,
127             final double latitude, final double height, final double oldLatitude, final double oldHeight,
128             final BodyKinematics result) {
129         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
130                 oldLatitude, oldHeight, result);
131     }
132 
133     /**
134      * Estimates body kinematics (specific force applied to a body and its angular rates)
135      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
136      *
137      * @param timeInterval time interval between epochs expressed in seconds (s).
138      * @param c            body-to-NED coordinate transformation.
139      * @param oldC         previous body-to-NED coordinate transformation.
140      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
141      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
142      *                     down.
143      * @param latitude     current latitude expressed in radians (rad).
144      * @param height       current height expressed in meters (m).
145      * @param oldLatitude  previous latitude expressed in radians (rad).
146      * @param oldHeight    previous height expressed in meters (m).
147      * @param result       instance where estimated body kinematics will be stored.
148      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
149      *                                  matrices are not NED frame valid.
150      */
151     public void estimate(
152             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
153             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
154             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
155         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
156                 result);
157     }
158 
159     /**
160      * Estimates body kinematics (specific force applied to a body and its angular rates)
161      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
162      *
163      * @param timeInterval time interval between epochs.
164      * @param c            body-to-NED coordinate transformation.
165      * @param oldC         previous body-to-NED coordinate transformation.
166      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
167      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
168      *                     down.
169      * @param latitude     current latitude expressed in radians (rad).
170      * @param height       current height expressed in meters (m).
171      * @param oldLatitude  previous latitude expressed in radians (rad).
172      * @param oldHeight    previous height expressed in meters (m).
173      * @param result       instance where estimated body kinematics will be stored.
174      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
175      *                                  matrices are not NED frame valid.
176      */
177     public void estimate(
178             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
179             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
180             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
181         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
182                 result);
183     }
184 
185     /**
186      * Estimates body kinematics (specific force applied to a body and its angular rates)
187      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
188      *
189      * @param timeInterval time interval between epochs expressed in seconds (s).
190      * @param c            body-to-NED coordinate transformation.
191      * @param oldC         previous body-to-NED coordinate transformation.
192      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
193      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
194      *                     down.
195      * @param latitude     current latitude.
196      * @param height       current height.
197      * @param oldLatitude  previous latitude.
198      * @param oldHeight    previous height.
199      * @param result       instance where estimated body kinematics will be stored.
200      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
201      *                                  matrices are not NED frame valid.
202      */
203     public void estimate(
204             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
205             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
206             final Angle oldLatitude, final Distance oldHeight, final BodyKinematics result) {
207         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
208                 result);
209     }
210 
211     /**
212      * Estimates body kinematics (specific force applied to a body and its angular rates)
213      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
214      *
215      * @param timeInterval time interval between epochs expressed in seconds (s).
216      * @param c            body-to-NED coordinate transformation.
217      * @param oldC         previous body-to-NED coordinate transformation.
218      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
219      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
220      *                     down.
221      * @param latitude     current latitude.
222      * @param height       current height.
223      * @param oldLatitude  previous latitude.
224      * @param oldHeight    previous height.
225      * @param result       instance where estimated body kinematics will be stored.
226      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
227      *                                  matrices are not NED frame valid.
228      */
229     public void estimate(
230             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
231             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
232             final Angle oldLatitude, final Distance oldHeight, final BodyKinematics result) {
233         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
234                 result);
235     }
236 
237     /**
238      * Estimates body kinematics (specific force applied to a body and its angular rates)
239      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
240      *
241      * @param timeInterval time interval between epochs expressed in seconds (s).
242      * @param c            body-to-NED coordinate transformation.
243      * @param oldC         previous body-to-NED coordinate transformation.
244      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
245      *                     north, east, and down and expressed in meters per second (m/s).
246      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
247      *                     north, east, and down and expressed in meters per second (m/s).
248      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
249      *                     north, east, and down and expressed in meters per second (m/s).
250      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
251      *                     along north, east, and down and expressed in meters per second (m/s).
252      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
253      *                     along north, east, and down and expressed in meters per second (m/s).
254      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
255      *                     along north, east, and down and expressed in meters per second (m/s).
256      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
257      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
258      * @param result       instance where estimated body kinematics will be stored.
259      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
260      *                                  matrices are not NED frame valid.
261      */
262     public void estimate(
263             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
264             final double vn, final double ve, final double vd,
265             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
266             final NEDPosition oldPosition, final BodyKinematics result) {
267         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
268     }
269 
270     /**
271      * Estimates body kinematics (specific force applied to a body and its angular rates)
272      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
273      *
274      * @param timeInterval time interval between epochs.
275      * @param c            body-to-NED coordinate transformation.
276      * @param oldC         previous body-to-NED coordinate transformation.
277      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
278      *                     north, east, and down and expressed in meters per second (m/s).
279      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
280      *                     north, east, and down and expressed in meters per second (m/s).
281      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
282      *                     north, east, and down and expressed in meters per second (m/s).
283      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
284      *                     along north, east, and down and expressed in meters per second (m/s).
285      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
286      *                     along north, east, and down and expressed in meters per second (m/s).
287      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
288      *                     along north, east, and down and expressed in meters per second (m/s).
289      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
290      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
291      * @param result       instance where estimated body kinematics will be stored.
292      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
293      *                                  matrices are not NED frame valid.
294      */
295     public void estimate(
296             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
297             final double vn, final double ve, final double vd,
298             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
299             final NEDPosition oldPosition, final BodyKinematics result) {
300         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
301     }
302 
303     /**
304      * Estimates body kinematics (specific force applied to a body and its angular rates)
305      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
306      *
307      * @param timeInterval time interval between epochs expressed in seconds (s).
308      * @param c            body-to-NED coordinate transformation.
309      * @param oldC         previous body-to-NED coordinate transformation.
310      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
311      *                     north, east, and down.
312      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
313      *                     north, east, and down.
314      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
315      *                     north, east, and down.
316      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
317      *                     along north, east, and down.
318      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
319      *                     along north, east, and down.
320      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
321      *                     along north, east, and down.
322      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
323      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
324      * @param result       instance where estimated body kinematics will be stored.
325      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
326      *                                  matrices are not NED frame valid.
327      */
328     public void estimate(
329             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
330             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
331             final NEDPosition position, final NEDPosition oldPosition, final BodyKinematics result) {
332         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
333     }
334 
335     /**
336      * Estimates body kinematics (specific force applied to a body and its angular rates)
337      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
338      *
339      * @param timeInterval time interval between epochs.
340      * @param c            body-to-NED coordinate transformation.
341      * @param oldC         previous body-to-NED coordinate transformation.
342      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
343      *                     north, east, and down.
344      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
345      *                     north, east, and down.
346      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
347      *                     north, east, and down.
348      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
349      *                     along north, east, and down.
350      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
351      *                     along north, east, and down.
352      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
353      *                     along north, east, and down.
354      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
355      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
356      * @param result       instance where estimated body kinematics will be stored.
357      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
358      *                                  matrices are not NED frame valid.
359      */
360     public void estimate(
361             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
362             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
363             final NEDPosition position, final NEDPosition oldPosition, final BodyKinematics result) {
364         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
365     }
366 
367     /**
368      * Estimates body kinematics (specific force applied to a body and its angular rates)
369      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
370      *
371      * @param timeInterval time interval between epochs expressed in seconds (s).
372      * @param c            body-to-NED coordinate transformation.
373      * @param oldC         previous body-to-NED coordinate transformation.
374      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
375      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
376      *                     down.
377      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
378      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
379      * @param result       instance where estimated body kinematics will be stored.
380      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
381      *                                  matrices are not NED frame valid.
382      */
383     public void estimate(
384             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
385             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
386             final NEDPosition oldPosition, final BodyKinematics result) {
387         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition, result);
388     }
389 
390     /**
391      * Estimates body kinematics (specific force applied to a body and its angular rates)
392      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
393      *
394      * @param timeInterval time interval between epochs.
395      * @param c            body-to-NED coordinate transformation.
396      * @param oldC         previous body-to-NED coordinate transformation.
397      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
398      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
399      *                     down.
400      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
401      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
402      * @param result       instance where estimated body kinematics will be stored.
403      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
404      *                                  matrices are not NED frame valid.
405      */
406     public void estimate(
407             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
408             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
409             final NEDPosition oldPosition, final BodyKinematics result) {
410         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition, result);
411     }
412 
413     /**
414      * Estimates body kinematics (specific force applied to a body and its angular rates)
415      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
416      *
417      * @param timeInterval time interval between epochs expressed in seconds (s).
418      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
419      * @param oldC         previous body-to-NED coordinate transformation.
420      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
421      *                     along north, east, and down and expressed in meters per second (m/s).
422      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
423      *                     along north, east, and down and expressed in meters per second (m/s).
424      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
425      *                     along north, east, and down and expressed in meters per second (m/s).
426      * @param oldLatitude  previous latitude expressed in radians (rad).
427      * @param oldHeight    previous height expressed in meters (m).
428      * @param result       instance where estimated body kinematics will be stored.
429      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
430      *                                  matrices are not NED frame valid.
431      */
432     public void estimate(
433             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
434             final double oldVn, final double oldVe, final double oldVd,
435             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
436         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight, result);
437     }
438 
439     /**
440      * Estimates body kinematics (specific force applied to a body and its angular rates)
441      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
442      *
443      * @param timeInterval time interval between epochs.
444      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
445      * @param oldC         previous body-to-NED coordinate transformation.
446      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
447      *                     along north, east, and down and expressed in meters per second (m/s).
448      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
449      *                     along north, east, and down and expressed in meters per second (m/s).
450      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
451      *                     along north, east, and down and expressed in meters per second (m/s).
452      * @param oldLatitude  previous latitude expressed in radians (rad).
453      * @param oldHeight    previous height expressed in meters (m).
454      * @param result       instance where estimated body kinematics will be stored.
455      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
456      *                                  matrices are not NED frame valid.
457      */
458     public void estimate(
459             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
460             final double oldVn, final double oldVe, final double oldVd,
461             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
462         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight, result);
463     }
464 
465     /**
466      * Estimates body kinematics (specific force applied to a body and its angular rates)
467      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
468      *
469      * @param timeInterval time interval between epochs expressed in seconds (s).
470      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
471      * @param oldC         previous body-to-NED coordinate transformation.
472      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
473      *                     down.
474      * @param oldLatitude  previous latitude expressed in radians (rad).
475      * @param oldHeight    previous height expressed in meters (m).
476      * @param result       instance where estimated body kinematics will be stored.
477      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
478      *                                  matrices are not NED frame valid.
479      */
480     public void estimate(
481             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
482             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight,
483             final BodyKinematics result) {
484         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
485     }
486 
487     /**
488      * Estimates body kinematics (specific force applied to a body and its angular rates)
489      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
490      *
491      * @param timeInterval time interval between epochs.
492      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
493      * @param oldC         previous body-to-NED coordinate transformation.
494      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
495      *                     down.
496      * @param oldLatitude  previous latitude expressed in radians (rad).
497      * @param oldHeight    previous height expressed in meters (m).
498      * @param result       instance where estimated body kinematics will be stored.
499      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
500      *                                  matrices are not NED frame valid.
501      */
502     public void estimate(
503             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
504             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight,
505             final BodyKinematics result) {
506         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
507     }
508 
509     /**
510      * Estimates body kinematics (specific force applied to a body and its angular rates)
511      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
512      *
513      * @param timeInterval time interval between epochs expressed in seconds (s).
514      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
515      * @param oldC         previous body-to-NED coordinate transformation.
516      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
517      *                     down.
518      * @param oldLatitude  previous latitude.
519      * @param oldHeight    previous height.
520      * @param result       instance where estimated body kinematics will be stored.
521      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
522      *                                  matrices are not NED frame valid.
523      */
524     public void estimate(
525             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
526             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight,
527             final BodyKinematics result) {
528         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
529     }
530 
531     /**
532      * Estimates body kinematics (specific force applied to a body and its angular rates)
533      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
534      *
535      * @param timeInterval time interval between epochs.
536      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
537      * @param oldC         previous body-to-NED coordinate transformation.
538      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
539      *                     down.
540      * @param oldLatitude  previous latitude.
541      * @param oldHeight    previous height.
542      * @param result       instance where estimated body kinematics will be stored.
543      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
544      *                                  matrices are not NED frame valid.
545      */
546     public void estimate(
547             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
548             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight,
549             final BodyKinematics result) {
550         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
551     }
552 
553     /**
554      * Estimates body kinematics (specific force applied to a body and its angular rates)
555      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
556      *
557      * @param timeInterval time interval between epochs expressed in seconds (s).
558      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
559      * @param oldC         previous body-to-NED coordinate transformation.
560      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
561      *                     along north, east, and down and expressed in meters per second (m/s).
562      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
563      *                     along north, east, and down and expressed in meters per second (m/s).
564      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
565      *                     along north, east, and down and expressed in meters per second (m/s).
566      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
567      * @param result       instance where estimated body kinematics will be stored.
568      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
569      *                                  matrices are not NED frame valid.
570      */
571     public void estimate(
572             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
573             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition,
574             final BodyKinematics result) {
575         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
576     }
577 
578     /**
579      * Estimates body kinematics (specific force applied to a body and its angular rates)
580      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
581      *
582      * @param timeInterval time interval between epochs.
583      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
584      * @param oldC         previous body-to-NED coordinate transformation.
585      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
586      *                     along north, east, and down and expressed in meters per second (m/s).
587      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
588      *                     along north, east, and down and expressed in meters per second (m/s).
589      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
590      *                     along north, east, and down and expressed in meters per second (m/s).
591      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
592      * @param result       instance where estimated body kinematics will be stored.
593      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
594      *                                  matrices are not NED frame valid.
595      */
596     public void estimate(
597             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
598             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition,
599             final BodyKinematics result) {
600         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
601     }
602 
603     /**
604      * Estimates body kinematics (specific force applied to a body and its angular rates)
605      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
606      *
607      * @param timeInterval time interval between epochs expressed in seconds (s).
608      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
609      * @param oldC         previous body-to-NED coordinate transformation.
610      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
611      *                     along north, east, and down.
612      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
613      *                     along north, east, and down.
614      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
615      *                     along north, east, and down.
616      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
617      * @param result       instance where estimated body kinematics will be stored.
618      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
619      *                                  matrices are not NED frame valid.
620      */
621     public void estimate(
622             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
623             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition,
624             final BodyKinematics result) {
625         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
626     }
627 
628     /**
629      * Estimates body kinematics (specific force applied to a body and its angular rates)
630      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
631      *
632      * @param timeInterval time interval between epochs expressed in seconds (s).
633      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
634      * @param oldC         previous body-to-NED coordinate transformation.
635      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
636      *                     along north, east, and down.
637      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
638      *                     along north, east, and down.
639      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
640      *                     along north, east, and down.
641      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
642      * @param result       instance where estimated body kinematics will be stored.
643      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
644      *                                  matrices are not NED frame valid.
645      */
646     public void estimate(
647             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
648             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition,
649             final BodyKinematics result) {
650         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
651     }
652 
653     /**
654      * Estimates body kinematics (specific force applied to a body and its angular rates)
655      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
656      *
657      * @param timeInterval time interval between epochs expressed in seconds (s).
658      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
659      * @param oldC         previous body-to-NED coordinate transformation.
660      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
661      *                     down.
662      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
663      * @param result       instance where estimated body kinematics will be stored.
664      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
665      *                                  matrices are not NED frame valid.
666      */
667     public void estimate(
668             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
669             final NEDVelocity oldVelocity, final NEDPosition oldPosition, final BodyKinematics result) {
670         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldPosition, result);
671     }
672 
673     /**
674      * Estimates body kinematics (specific force applied to a body and its angular rates)
675      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
676      *
677      * @param timeInterval time interval between epochs.
678      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
679      * @param oldC         previous body-to-NED coordinate transformation.
680      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
681      *                     down.
682      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
683      * @param result       instance where estimated body kinematics will be stored.
684      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
685      *                                  matrices are not NED frame valid.
686      */
687     public void estimate(
688             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
689             final NEDVelocity oldVelocity, final NEDPosition oldPosition, final BodyKinematics result) {
690         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldPosition, result);
691     }
692 
693     /**
694      * Estimates body kinematics (specific force applied to a body and its angular rates)
695      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
696      *
697      * @param timeInterval time interval between epochs expressed in seconds (s).
698      * @param c            body-to-NED coordinate transformation.
699      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
700      *                     north, east, and down and expressed in meters per second (m/s).
701      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
702      *                     north, east, and down and expressed in meters per second (m/s).
703      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
704      *                     north, east, and down and expressed in meters per second (m/s).
705      * @param latitude     current latitude expressed in radians (rad).
706      * @param height       current height expressed in meters (m).
707      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
708      * @param result       instance where estimated body kinematics will be stored.
709      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
710      *                                  matrices are not NED frame valid.
711      */
712     public void estimate(
713             final double timeInterval, final CoordinateTransformation c,
714             final double vn, final double ve, final double vd, final double latitude, final double height,
715             final NEDFrame oldFrame, final BodyKinematics result) {
716         estimateKinematics(timeInterval, c, vn, ve, vd, latitude, height, oldFrame, result);
717     }
718 
719     /**
720      * Estimates body kinematics (specific force applied to a body and its angular rates)
721      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
722      *
723      * @param timeInterval time interval between epochs.
724      * @param c            body-to-NED coordinate transformation.
725      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
726      *                     north, east, and down and expressed in meters per second (m/s).
727      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
728      *                     north, east, and down and expressed in meters per second (m/s).
729      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
730      *                     north, east, and down and expressed in meters per second (m/s).
731      * @param latitude     current latitude expressed in radians (rad).
732      * @param height       current height expressed in meters (m).
733      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
734      * @param result       instance where estimated body kinematics will be stored.
735      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
736      *                                  matrices are not NED frame valid.
737      */
738     public void estimate(
739             final Time timeInterval, final CoordinateTransformation c,
740             final double vn, final double ve, final double vd, final double latitude, final double height,
741             final NEDFrame oldFrame, final BodyKinematics result) {
742         estimateKinematics(timeInterval, c, vn, ve, vd, latitude, height, oldFrame, result);
743     }
744 
745     /**
746      * Estimates body kinematics (specific force applied to a body and its angular rates)
747      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
748      *
749      * @param timeInterval time interval between epochs expressed in seconds (s).
750      * @param c            body-to-NED coordinate transformation.
751      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
752      * @param latitude     current latitude expressed in radians (rad).
753      * @param height       current height expressed in meters (m).
754      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
755      * @param result       instance where estimated body kinematics will be stored.
756      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
757      *                                  matrices are not NED frame valid.
758      */
759     public void estimate(
760             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
761             final double latitude, final double height, final NEDFrame oldFrame, final BodyKinematics result) {
762         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
763     }
764 
765     /**
766      * Estimates body kinematics (specific force applied to a body and its angular rates)
767      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
768      *
769      * @param timeInterval time interval between epochs.
770      * @param c            body-to-NED coordinate transformation.
771      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
772      * @param latitude     current latitude expressed in radians (rad).
773      * @param height       current height expressed in meters (m).
774      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
775      * @param result       instance where estimated body kinematics will be stored.
776      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
777      *                                  matrices are not NED frame valid.
778      */
779     public void estimate(
780             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
781             final double latitude, final double height, final NEDFrame oldFrame, final BodyKinematics result) {
782         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
783     }
784 
785     /**
786      * Estimates body kinematics (specific force applied to a body and its angular rates)
787      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
788      *
789      * @param timeInterval time interval between epochs expressed in seconds (s).
790      * @param c            body-to-NED coordinate transformation.
791      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
792      * @param latitude     current latitude.
793      * @param height       current height.
794      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
795      * @param result       instance where estimated body kinematics will be stored.
796      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
797      *                                  matrices are not NED frame valid.
798      */
799     public void estimate(
800             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
801             final Angle latitude, final Distance height, final NEDFrame oldFrame, final BodyKinematics result) {
802         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
803     }
804 
805     /**
806      * Estimates body kinematics (specific force applied to a body and its angular rates)
807      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
808      *
809      * @param timeInterval time interval between epochs.
810      * @param c            body-to-NED coordinate transformation.
811      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
812      * @param latitude     current latitude.
813      * @param height       current height.
814      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
815      * @param result       instance where estimated body kinematics will be stored.
816      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
817      *                                  matrices are not NED frame valid.
818      */
819     public void estimate(
820             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity, final Angle latitude,
821             final Distance height, final NEDFrame oldFrame, final BodyKinematics result) {
822         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
823     }
824 
825     /**
826      * Estimates body kinematics (specific force applied to a body and its angular rates)
827      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
828      *
829      * @param timeInterval time interval between epochs expressed in seconds (s).
830      * @param c            body-to-NED coordinate transformation.
831      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
832      *                     north, east, and down and expressed in meters per second (m/s).
833      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
834      *                     north, east, and down and expressed in meters per second (m/s).
835      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
836      *                     north, east, and down and expressed in meters per second (m/s).
837      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
838      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
839      * @param result       instance where estimated body kinematics will be stored.
840      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
841      *                                  matrices are not NED frame valid.
842      */
843     public void estimate(
844             final double timeInterval, final CoordinateTransformation c,
845             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame,
846             final BodyKinematics result) {
847         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
848     }
849 
850     /**
851      * Estimates body kinematics (specific force applied to a body and its angular rates)
852      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
853      *
854      * @param timeInterval time interval between epochs.
855      * @param c            body-to-NED coordinate transformation.
856      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
857      *                     north, east, and down and expressed in meters per second (m/s).
858      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
859      *                     north, east, and down and expressed in meters per second (m/s).
860      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
861      *                     north, east, and down and expressed in meters per second (m/s).
862      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
863      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
864      * @param result       instance where estimated body kinematics will be stored.
865      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
866      *                                  matrices are not NED frame valid.
867      */
868     public void estimate(
869             final Time timeInterval, final CoordinateTransformation c,
870             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame,
871             final BodyKinematics result) {
872         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
873     }
874 
875     /**
876      * Estimates body kinematics (specific force applied to a body and its angular rates)
877      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
878      *
879      * @param timeInterval time interval between epochs expressed in seconds (s).
880      * @param c            body-to-NED coordinate transformation.
881      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
882      *                     north, east, and down.
883      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
884      *                     north, east, and down.
885      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
886      *                     north, east, and down.
887      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
888      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
889      * @param result       instance where estimated body kinematics will be stored.
890      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
891      *                                  matrices are not NED frame valid.
892      */
893     public void estimate(
894             final double timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
895             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
896         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
897     }
898 
899     /**
900      * Estimates body kinematics (specific force applied to a body and its angular rates)
901      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
902      *
903      * @param timeInterval time interval between epochs.
904      * @param c            body-to-NED coordinate transformation.
905      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
906      *                     north, east, and down.
907      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
908      *                     north, east, and down.
909      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
910      *                     north, east, and down.
911      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
912      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
913      * @param result       instance where estimated body kinematics will be stored.
914      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
915      *                                  matrices are not NED frame valid.
916      */
917     public void estimate(
918             final Time timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
919             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
920         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
921     }
922 
923     /**
924      * Estimates body kinematics (specific force applied to a body and its angular rates)
925      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
926      *
927      * @param timeInterval time interval between epochs expressed in seconds (s).
928      * @param c            body-to-NED coordinate transformation.
929      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
930      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
931      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
932      * @param result       instance where estimated body kinematics will be stored.
933      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
934      *                                  matrices are not NED frame valid.
935      */
936     public void estimate(
937             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
938             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
939         estimateKinematics(timeInterval, c, velocity, position, oldFrame, result);
940     }
941 
942     /**
943      * Estimates body kinematics (specific force applied to a body and its angular rates)
944      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
945      *
946      * @param timeInterval time interval between epochs.
947      * @param c            body-to-NED coordinate transformation.
948      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
949      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
950      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
951      * @param result       instance where estimated body kinematics will be stored.
952      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
953      *                                  matrices are not NED frame valid.
954      */
955     public void estimate(
956             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
957             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
958         estimateKinematics(timeInterval, c, velocity, position, oldFrame, result);
959     }
960 
961     /**
962      * Estimates body kinematics (specific force applied to a body and its angular rates)
963      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
964      *
965      * @param timeInterval time interval between epochs expressed in seconds (s).
966      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
967      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
968      * @param result       instance where estimated body kinematics will be stored.
969      * @throws IllegalArgumentException if provided time interval is negative.
970      */
971     public void estimate(
972             final double timeInterval, final NEDFrame frame, final NEDFrame oldFrame, final BodyKinematics result) {
973         estimateKinematics(timeInterval, frame, oldFrame, result);
974     }
975 
976     /**
977      * Estimates body kinematics (specific force applied to a body and its angular rates)
978      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
979      *
980      * @param timeInterval time interval between epochs.
981      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
982      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
983      * @param result       instance where estimated body kinematics will be stored.
984      * @throws IllegalArgumentException if provided time interval is negative.
985      */
986     public void estimate(
987             final Time timeInterval, final NEDFrame frame, final NEDFrame oldFrame, final BodyKinematics result) {
988         estimateKinematics(timeInterval, frame, oldFrame, result);
989     }
990 
991     /**
992      * Estimates body kinematics (specific force applied to a body and its angular rates)
993      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
994      *
995      * @param timeInterval time interval between epochs expressed in seconds (s).
996      * @param c            body-to-NED coordinate transformation.
997      * @param oldC         previous body-to-NED coordinate transformation.
998      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
999      *                     north, east, and down.
1000      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1001      *                     north, east, and down.
1002      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1003      *                     north, east, and down.
1004      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1005      *                     along north, east, and down.
1006      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1007      *                     along north, east, and down.
1008      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1009      *                     along north, east, and down.
1010      * @param latitude     current latitude expressed in radians (rad).
1011      * @param height       current height expressed in meters (m).
1012      * @param oldLatitude  previous latitude expressed in radians (rad).
1013      * @param oldHeight    previous height expressed in meters (m).
1014      * @param result       instance where estimated body kinematics will be stored.
1015      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1016      *                                  matrices are not NED frame valid.
1017      */
1018     public void estimate(
1019             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1020             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1021             final double latitude, final double height, final double oldLatitude, final double oldHeight,
1022             final BodyKinematics result) {
1023         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1024                 oldLatitude, oldHeight, result);
1025     }
1026 
1027     /**
1028      * Estimates body kinematics (specific force applied to a body and its angular rates)
1029      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1030      *
1031      * @param timeInterval time interval between epochs.
1032      * @param c            body-to-NED coordinate transformation.
1033      * @param oldC         previous body-to-NED coordinate transformation.
1034      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1035      *                     north, east, and down.
1036      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1037      *                     north, east, and down.
1038      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1039      *                     north, east, and down.
1040      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1041      *                     along north, east, and down.
1042      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1043      *                     along north, east, and down.
1044      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1045      *                     along north, east, and down.
1046      * @param latitude     current latitude expressed in radians (rad).
1047      * @param height       current height expressed in meters (m).
1048      * @param oldLatitude  previous latitude expressed in radians (rad).
1049      * @param oldHeight    previous height expressed in meters (m).
1050      * @param result       instance where estimated body kinematics will be stored.
1051      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1052      *                                  matrices are not NED frame valid.
1053      */
1054     public void estimate(
1055             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1056             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1057             final double latitude, final double height, final double oldLatitude, final double oldHeight,
1058             final BodyKinematics result) {
1059         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1060                 oldLatitude, oldHeight, result);
1061     }
1062 
1063     /**
1064      * Estimates body kinematics (specific force applied to a body and its angular rates)
1065      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1066      *
1067      * @param timeInterval time interval between epochs expressed in seconds (s).
1068      * @param c            body-to-NED coordinate transformation.
1069      * @param oldC         previous body-to-NED coordinate transformation.
1070      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1071      *                     north, east, and down and expressed in meters per second (m/s).
1072      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1073      *                     north, east, and down and expressed in meters per second (m/s).
1074      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1075      *                     north, east, and down and expressed in meters per second (m/s).
1076      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1077      *                     along north, east, and down and expressed in meters per second (m/s).
1078      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1079      *                     along north, east, and down and expressed in meters per second (m/s).
1080      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1081      *                     along north, east, and down and expressed in meters per second (m/s).
1082      * @param latitude     current latitude.
1083      * @param height       current height expressed in meters (m).
1084      * @param oldLatitude  previous latitude.
1085      * @param oldHeight    previous height expressed in meters (m).
1086      * @param result       instance where estimated body kinematics will be stored.
1087      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1088      *                                  matrices are not NED frame valid.
1089      */
1090     public void estimate(
1091             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1092             final double vn, final double ve, final double vd,
1093             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
1094             final Angle oldLatitude, final double oldHeight, final BodyKinematics result) {
1095         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1096                 oldLatitude, oldHeight, result);
1097     }
1098 
1099     /**
1100      * Estimates body kinematics (specific force applied to a body and its angular rates)
1101      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1102      *
1103      * @param timeInterval time interval between epochs.
1104      * @param c            body-to-NED coordinate transformation.
1105      * @param oldC         previous body-to-NED coordinate transformation.
1106      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1107      *                     north, east, and down and expressed in meters per second (m/s).
1108      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1109      *                     north, east, and down and expressed in meters per second (m/s).
1110      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1111      *                     north, east, and down and expressed in meters per second (m/s).
1112      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1113      *                     along north, east, and down and expressed in meters per second (m/s).
1114      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1115      *                     along north, east, and down and expressed in meters per second (m/s).
1116      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1117      *                     along north, east, and down and expressed in meters per second (m/s).
1118      * @param latitude     current latitude.
1119      * @param height       current height expressed in meters (m).
1120      * @param oldLatitude  previous latitude.
1121      * @param oldHeight    previous height expressed in meters (m).
1122      * @param result       instance where estimated body kinematics will be stored.
1123      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1124      *                                  matrices are not NED frame valid.
1125      */
1126     public void estimate(
1127             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1128             final double vn, final double ve, final double vd,
1129             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
1130             final Angle oldLatitude, final double oldHeight, final BodyKinematics result) {
1131         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1132                 oldLatitude, oldHeight, result);
1133     }
1134 
1135     /**
1136      * Estimates body kinematics (specific force applied to a body and its angular rates)
1137      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1138      *
1139      * @param timeInterval time interval between epochs expressed in seconds (s).
1140      * @param c            body-to-NED coordinate transformation.
1141      * @param oldC         previous body-to-NED coordinate transformation.
1142      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1143      *                     north, east, and down and expressed in meters per second (m/s).
1144      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1145      *                     north, east, and down and expressed in meters per second (m/s).
1146      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1147      *                     north, east, and down and expressed in meters per second (m/s).
1148      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1149      *                     along north, east, and down and expressed in meters per second (m/s).
1150      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1151      *                     along north, east, and down and expressed in meters per second (m/s).
1152      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1153      *                     along north, east, and down and expressed in meters per second (m/s).
1154      * @param latitude     current latitude expressed in radians (rad).
1155      * @param height       current height.
1156      * @param oldLatitude  previous latitude expressed in radians (rad).
1157      * @param oldHeight    previous height.
1158      * @param result       instance where estimated body kinematics will be stored.
1159      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1160      *                                  matrices are not NED frame valid.
1161      */
1162     public void estimate(
1163             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1164             final double vn, final double ve, final double vd,
1165             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
1166             final double oldLatitude, final Distance oldHeight, final BodyKinematics result) {
1167         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1168                 oldLatitude, oldHeight, result);
1169     }
1170 
1171     /**
1172      * Estimates body kinematics (specific force applied to a body and its angular rates)
1173      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1174      *
1175      * @param timeInterval time interval between epochs.
1176      * @param c            body-to-NED coordinate transformation.
1177      * @param oldC         previous body-to-NED coordinate transformation.
1178      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1179      *                     north, east, and down and expressed in meters per second (m/s).
1180      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1181      *                     north, east, and down and expressed in meters per second (m/s).
1182      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1183      *                     north, east, and down and expressed in meters per second (m/s).
1184      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1185      *                     along north, east, and down and expressed in meters per second (m/s).
1186      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1187      *                     along north, east, and down and expressed in meters per second (m/s).
1188      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1189      *                     along north, east, and down and expressed in meters per second (m/s).
1190      * @param latitude     current latitude expressed in radians (rad).
1191      * @param height       current height.
1192      * @param oldLatitude  previous latitude expressed in radians (rad).
1193      * @param oldHeight    previous height.
1194      * @param result       instance where estimated body kinematics will be stored.
1195      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1196      *                                  matrices are not NED frame valid.
1197      */
1198     public void estimate(
1199             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1200             final double vn, final double ve, final double vd,
1201             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
1202             final double oldLatitude, final Distance oldHeight, final BodyKinematics result) {
1203         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1204                 oldLatitude, oldHeight, result);
1205     }
1206 
1207     /**
1208      * Estimates body kinematics (specific force applied to a body and its angular rates)
1209      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1210      *
1211      * @param timeInterval time interval between epochs expressed in seconds (s).
1212      * @param c            body-to-NED coordinate transformation.
1213      * @param oldC         previous body-to-NED coordinate transformation.
1214      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1215      *                     north, east, and down.
1216      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1217      *                     north, east, and down.
1218      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1219      *                     north, east, and down.
1220      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1221      *                     along north, east, and down.
1222      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1223      *                     along north, east, and down.
1224      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1225      *                     along north, east, and down.
1226      * @param latitude     current latitude.
1227      * @param height       current height.
1228      * @param oldLatitude  previous latitude.
1229      * @param oldHeight    previous height.
1230      * @param result       instance where estimated body kinematics will be stored.
1231      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1232      *                                  matrices are not NED frame valid.
1233      */
1234     public void estimate(
1235             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1236             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1237             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight,
1238             final BodyKinematics result) {
1239         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1240                 oldLatitude, oldHeight, result);
1241     }
1242 
1243     /**
1244      * Estimates body kinematics (specific force applied to a body and its angular rates)
1245      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1246      *
1247      * @param timeInterval time interval between epochs.
1248      * @param c            body-to-NED coordinate transformation.
1249      * @param oldC         previous body-to-NED coordinate transformation.
1250      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1251      *                     north, east, and down.
1252      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1253      *                     north, east, and down.
1254      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1255      *                     north, east, and down.
1256      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1257      *                     along north, east, and down.
1258      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1259      *                     along north, east, and down.
1260      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1261      *                     along north, east, and down.
1262      * @param latitude     current latitude.
1263      * @param height       current height.
1264      * @param oldLatitude  previous latitude.
1265      * @param oldHeight    previous height.
1266      * @param result       instance where estimated body kinematics will be stored.
1267      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1268      *                                  matrices are not NED frame valid.
1269      */
1270     public void estimate(
1271             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1272             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1273             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight,
1274             final BodyKinematics result) {
1275         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1276                 oldLatitude, oldHeight, result);
1277     }
1278 
1279     /**
1280      * Estimates body kinematics (specific force applied to a body and its angular rates)
1281      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1282      *
1283      * @param timeInterval time interval between epochs expressed in seconds (s).
1284      * @param c            body-to-NED coordinate transformation.
1285      * @param oldC         previous body-to-NED coordinate transformation.
1286      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1287      *                     north, east, and down and expressed in meters per second (m/s).
1288      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1289      *                     north, east, and down and expressed in meters per second (m/s).
1290      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1291      *                     north, east, and down and expressed in meters per second (m/s).
1292      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1293      *                     along north, east, and down and expressed in meters per second (m/s).
1294      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1295      *                     along north, east, and down and expressed in meters per second (m/s).
1296      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1297      *                     along north, east, and down and expressed in meters per second (m/s).
1298      * @param latitude     current latitude expressed in radians (rad).
1299      * @param height       current height expressed in meters (m).
1300      * @param oldLatitude  previous latitude expressed in radians (rad).
1301      * @param oldHeight    previous height expressed in meters (m).
1302      * @return a new body kinematics instance.
1303      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1304      *                                  matrices are not NED frame valid.
1305      */
1306     public BodyKinematics estimateAndReturnNew(
1307             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1308             final double vn, final double ve, final double vd,
1309             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
1310             final double oldLatitude, final double oldHeight) {
1311         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1312                 oldLatitude, oldHeight);
1313     }
1314 
1315     /**
1316      * Estimates body kinematics (specific force applied to a body and its angular rates)
1317      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1318      *
1319      * @param timeInterval time interval between epochs.
1320      * @param c            body-to-NED coordinate transformation.
1321      * @param oldC         previous body-to-NED coordinate transformation.
1322      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1323      *                     north, east, and down and expressed in meters per second (m/s).
1324      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1325      *                     north, east, and down and expressed in meters per second (m/s).
1326      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1327      *                     north, east, and down and expressed in meters per second (m/s).
1328      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1329      *                     along north, east, and down and expressed in meters per second (m/s).
1330      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1331      *                     along north, east, and down and expressed in meters per second (m/s).
1332      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1333      *                     along north, east, and down and expressed in meters per second (m/s).
1334      * @param latitude     current latitude expressed in radians (rad).
1335      * @param height       current height expressed in meters (m).
1336      * @param oldLatitude  previous latitude expressed in radians (rad).
1337      * @param oldHeight    previous height expressed in meters (m).
1338      * @return a new body kinematics instance.
1339      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1340      *                                  matrices are not NED frame valid.
1341      */
1342     public BodyKinematics estimateAndReturnNew(
1343             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1344             final double vn, final double ve, final double vd,
1345             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
1346             final double oldLatitude, final double oldHeight) {
1347         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
1348                 oldLatitude, oldHeight);
1349     }
1350 
1351     /**
1352      * Estimates body kinematics (specific force applied to a body and its angular rates)
1353      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1354      *
1355      * @param timeInterval time interval between epochs expressed in seconds (s).
1356      * @param c            body-to-NED coordinate transformation.
1357      * @param oldC         previous body-to-NED coordinate transformation.
1358      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1359      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1360      *                     down.
1361      * @param latitude     current latitude expressed in radians (rad).
1362      * @param height       current height expressed in meters (m).
1363      * @param oldLatitude  previous latitude expressed in radians (rad).
1364      * @param oldHeight    previous height expressed in meters (m).
1365      * @return a new body kinematics instance.
1366      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1367      *                                  matrices are not NED frame valid.
1368      */
1369     public BodyKinematics estimateAndReturnNew(
1370             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1371             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
1372             final double oldLatitude, final double oldHeight) {
1373         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, latitude, height,
1374                 oldLatitude, oldHeight);
1375     }
1376 
1377     /**
1378      * Estimates body kinematics (specific force applied to a body and its angular rates)
1379      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1380      *
1381      * @param timeInterval time interval between epochs.
1382      * @param c            body-to-NED coordinate transformation.
1383      * @param oldC         previous body-to-NED coordinate transformation.
1384      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1385      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1386      *                     down.
1387      * @param latitude     current latitude expressed in radians (rad).
1388      * @param height       current height expressed in meters (m).
1389      * @param oldLatitude  previous latitude expressed in radians (rad).
1390      * @param oldHeight    previous height expressed in meters (m).
1391      * @return a new body kinematics instance.
1392      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1393      *                                  matrices are not NED frame valid.
1394      */
1395     public BodyKinematics estimateAndReturnNew(
1396             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1397             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
1398             final double oldLatitude, final double oldHeight) {
1399         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, latitude, height,
1400                 oldLatitude, oldHeight);
1401     }
1402 
1403     /**
1404      * Estimates body kinematics (specific force applied to a body and its angular rates)
1405      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1406      *
1407      * @param timeInterval time interval between epochs expressed in seconds (s).
1408      * @param c            body-to-NED coordinate transformation.
1409      * @param oldC         previous body-to-NED coordinate transformation.
1410      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1411      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1412      *                     down.
1413      * @param latitude     current latitude.
1414      * @param height       current height.
1415      * @param oldLatitude  previous latitude.
1416      * @param oldHeight    previous height.
1417      * @return a new body kinematics instance.
1418      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1419      *                                  matrices are not NED frame valid.
1420      */
1421     public BodyKinematics estimateAndReturnNew(
1422             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1423             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
1424             final Angle oldLatitude, final Distance oldHeight) {
1425         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, latitude, height,
1426                 oldLatitude, oldHeight);
1427     }
1428 
1429     /**
1430      * Estimates body kinematics (specific force applied to a body and its angular rates)
1431      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1432      *
1433      * @param timeInterval time interval between epochs.
1434      * @param c            body-to-NED coordinate transformation.
1435      * @param oldC         previous body-to-NED coordinate transformation.
1436      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1437      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1438      *                     down.
1439      * @param latitude     current latitude.
1440      * @param height       current height.
1441      * @param oldLatitude  previous latitude.
1442      * @param oldHeight    previous height.
1443      * @return a new body kinematics instance.
1444      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1445      *                                  matrices are not NED frame valid.
1446      */
1447     public BodyKinematics estimateAndReturnNew(
1448             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1449             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
1450             final Angle oldLatitude, final Distance oldHeight) {
1451         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, latitude, height,
1452                 oldLatitude, oldHeight);
1453     }
1454 
1455     /**
1456      * Estimates body kinematics (specific force applied to a body and its angular rates)
1457      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1458      *
1459      * @param timeInterval time interval between epochs expressed in seconds (s).
1460      * @param c            body-to-NED coordinate transformation.
1461      * @param oldC         previous body-to-NED coordinate transformation.
1462      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1463      *                     north, east, and down and expressed in meters per second (m/s).
1464      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1465      *                     north, east, and down and expressed in meters per second (m/s).
1466      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1467      *                     north, east, and down and expressed in meters per second (m/s).
1468      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1469      *                     along north, east, and down and expressed in meters per second (m/s).
1470      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1471      *                     along north, east, and down and expressed in meters per second (m/s).
1472      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1473      *                     along north, east, and down and expressed in meters per second (m/s).
1474      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1475      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1476      * @return a new body kinematics instance.
1477      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1478      *                                  matrices are not NED frame valid.
1479      */
1480     public BodyKinematics estimateAndReturnNew(
1481             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1482             final double vn, final double ve, final double vd,
1483             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
1484             final NEDPosition oldPosition) {
1485         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position,
1486                 oldPosition);
1487     }
1488 
1489     /**
1490      * Estimates body kinematics (specific force applied to a body and its angular rates)
1491      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1492      *
1493      * @param timeInterval time interval between epochs.
1494      * @param c            body-to-NED coordinate transformation.
1495      * @param oldC         previous body-to-NED coordinate transformation.
1496      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1497      *                     north, east, and down and expressed in meters per second (m/s).
1498      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1499      *                     north, east, and down and expressed in meters per second (m/s).
1500      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1501      *                     north, east, and down and expressed in meters per second (m/s).
1502      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1503      *                     along north, east, and down and expressed in meters per second (m/s).
1504      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1505      *                     along north, east, and down and expressed in meters per second (m/s).
1506      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1507      *                     along north, east, and down and expressed in meters per second (m/s).
1508      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1509      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1510      * @return a new body kinematics instance.
1511      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1512      *                                  matrices are not NED frame valid.
1513      */
1514     public BodyKinematics estimateAndReturnNew(
1515             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1516             final double vn, final double ve, final double vd,
1517             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
1518             final NEDPosition oldPosition) {
1519         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position,
1520                 oldPosition);
1521     }
1522 
1523     /**
1524      * Estimates body kinematics (specific force applied to a body and its angular rates)
1525      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1526      *
1527      * @param timeInterval time interval between epochs expressed in seconds (s).
1528      * @param c            body-to-NED coordinate transformation.
1529      * @param oldC         previous body-to-NED coordinate transformation.
1530      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1531      *                     north, east, and down.
1532      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1533      *                     north, east, and down.
1534      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1535      *                     north, east, and down.
1536      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1537      *                     along north, east, and down.
1538      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1539      *                     along north, east, and down.
1540      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1541      *                     along north, east, and down.
1542      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1543      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1544      * @return a new body kinematics instance.
1545      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1546      *                                  matrices are not NED frame valid.
1547      */
1548     public BodyKinematics estimateAndReturnNew(
1549             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1550             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1551             final NEDPosition position, final NEDPosition oldPosition) {
1552         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position,
1553                 oldPosition);
1554     }
1555 
1556     /**
1557      * Estimates body kinematics (specific force applied to a body and its angular rates)
1558      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1559      *
1560      * @param timeInterval time interval between epochs.
1561      * @param c            body-to-NED coordinate transformation.
1562      * @param oldC         previous body-to-NED coordinate transformation.
1563      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1564      *                     north, east, and down.
1565      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1566      *                     north, east, and down.
1567      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1568      *                     north, east, and down.
1569      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1570      *                     along north, east, and down.
1571      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1572      *                     along north, east, and down.
1573      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1574      *                     along north, east, and down.
1575      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1576      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1577      * @return a new body kinematics instance.
1578      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1579      *                                  matrices are not NED frame valid.
1580      */
1581     public BodyKinematics estimateAndReturnNew(
1582             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1583             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
1584             final NEDPosition position, final NEDPosition oldPosition) {
1585         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position,
1586                 oldPosition);
1587     }
1588 
1589     /**
1590      * Estimates body kinematics (specific force applied to a body and its angular rates)
1591      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1592      *
1593      * @param timeInterval time interval between epochs expressed in seconds (s).
1594      * @param c            body-to-NED coordinate transformation.
1595      * @param oldC         previous body-to-NED coordinate transformation.
1596      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1597      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1598      *                     down.
1599      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1600      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1601      * @return a new body kinematics instance.
1602      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1603      *                                  matrices are not NED frame valid.
1604      */
1605     public BodyKinematics estimateAndReturnNew(
1606             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1607             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
1608             final NEDPosition oldPosition) {
1609         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition);
1610     }
1611 
1612     /**
1613      * Estimates body kinematics (specific force applied to a body and its angular rates)
1614      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1615      *
1616      * @param timeInterval time interval between epochs.
1617      * @param c            body-to-NED coordinate transformation.
1618      * @param oldC         previous body-to-NED coordinate transformation.
1619      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1620      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1621      *                     down.
1622      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
1623      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1624      * @return a new body kinematics instance.
1625      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1626      *                                  matrices are not NED frame valid.
1627      */
1628     public BodyKinematics estimateAndReturnNew(
1629             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
1630             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
1631             final NEDPosition oldPosition) {
1632         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition);
1633     }
1634 
1635     /**
1636      * Estimates body kinematics (specific force applied to a body and its angular rates)
1637      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1638      *
1639      * @param timeInterval time interval between epochs expressed in seconds (s).
1640      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1641      * @param oldC         previous body-to-NED coordinate transformation.
1642      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1643      *                     along north, east, and down and expressed in meters per second (m/s).
1644      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1645      *                     along north, east, and down and expressed in meters per second (m/s).
1646      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1647      *                     along north, east, and down and expressed in meters per second (m/s).
1648      * @param oldLatitude  previous latitude expressed in radians (rad).
1649      * @param oldHeight    previous height expressed in meters (m).
1650      * @return a new body kinematics instance.
1651      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1652      *                                  matrices are not NED frame valid.
1653      */
1654     public BodyKinematics estimateAndReturnNew(
1655             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1656             final double oldVn, final double oldVe, final double oldVd,
1657             final double oldLatitude, final double oldHeight) {
1658         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight);
1659     }
1660 
1661     /**
1662      * Estimates body kinematics (specific force applied to a body and its angular rates)
1663      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1664      *
1665      * @param timeInterval time interval between epochs.
1666      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1667      * @param oldC         previous body-to-NED coordinate transformation.
1668      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1669      *                     along north, east, and down and expressed in meters per second (m/s).
1670      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1671      *                     along north, east, and down and expressed in meters per second (m/s).
1672      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1673      *                     along north, east, and down and expressed in meters per second (m/s).
1674      * @param oldLatitude  previous latitude expressed in radians (rad).
1675      * @param oldHeight    previous height expressed in meters (m).
1676      * @return a new body kinematics instance.
1677      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1678      *                                  matrices are not NED frame valid.
1679      */
1680     public BodyKinematics estimateAndReturnNew(
1681             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1682             final double oldVn, final double oldVe, final double oldVd,
1683             final double oldLatitude, final double oldHeight) {
1684         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight);
1685     }
1686 
1687     /**
1688      * Estimates body kinematics (specific force applied to a body and its angular rates)
1689      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1690      *
1691      * @param timeInterval time interval between epochs expressed in seconds (s).
1692      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1693      * @param oldC         previous body-to-NED coordinate transformation.
1694      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1695      *                     down.
1696      * @param oldLatitude  previous latitude expressed in radians (rad).
1697      * @param oldHeight    previous height expressed in meters (m).
1698      * @return a new body kinematics instance.
1699      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1700      *                                  matrices are not NED frame valid.
1701      */
1702     public BodyKinematics estimateAndReturnNew(
1703             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1704             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight) {
1705         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight);
1706     }
1707 
1708     /**
1709      * Estimates body kinematics (specific force applied to a body and its angular rates)
1710      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1711      *
1712      * @param timeInterval time interval between epochs.
1713      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1714      * @param oldC         previous body-to-NED coordinate transformation.
1715      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1716      *                     down.
1717      * @param oldLatitude  previous latitude expressed in radians (rad).
1718      * @param oldHeight    previous height expressed in meters (m).
1719      * @return a new body kinematics instance.
1720      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1721      *                                  matrices are not NED frame valid.
1722      */
1723     public BodyKinematics estimateAndReturnNew(
1724             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1725             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight) {
1726         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight);
1727     }
1728 
1729     /**
1730      * Estimates body kinematics (specific force applied to a body and its angular rates)
1731      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1732      *
1733      * @param timeInterval time interval between epochs expressed in seconds (s).
1734      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1735      * @param oldC         previous body-to-NED coordinate transformation.
1736      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1737      *                     down.
1738      * @param oldLatitude  previous latitude.
1739      * @param oldHeight    previous height.
1740      * @return a new body kinematics instance.
1741      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1742      *                                  matrices are not NED frame valid.
1743      */
1744     public BodyKinematics estimateAndReturnNew(
1745             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1746             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight) {
1747         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight);
1748     }
1749 
1750     /**
1751      * Estimates body kinematics (specific force applied to a body and its angular rates)
1752      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1753      *
1754      * @param timeInterval time interval between epochs.
1755      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1756      * @param oldC         previous body-to-NED coordinate transformation.
1757      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1758      *                     down.
1759      * @param oldLatitude  previous latitude.
1760      * @param oldHeight    previous height.
1761      * @return a new body kinematics instance.
1762      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1763      *                                  matrices are not NED frame valid.
1764      */
1765     public BodyKinematics estimateAndReturnNew(
1766             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1767             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight) {
1768         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight);
1769     }
1770 
1771     /**
1772      * Estimates body kinematics (specific force applied to a body and its angular rates)
1773      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1774      *
1775      * @param timeInterval time interval between epochs expressed in seconds (s).
1776      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1777      * @param oldC         previous body-to-NED coordinate transformation.
1778      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1779      *                     along north, east, and down and expressed in meters per second (m/s).
1780      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1781      *                     along north, east, and down and expressed in meters per second (m/s).
1782      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1783      *                     along north, east, and down and expressed in meters per second (m/s).
1784      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1785      * @return a new body kinematics instance.
1786      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1787      *                                  matrices are not NED frame valid.
1788      */
1789     public BodyKinematics estimateAndReturnNew(
1790             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1791             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition) {
1792         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition);
1793     }
1794 
1795     /**
1796      * Estimates body kinematics (specific force applied to a body and its angular rates)
1797      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1798      *
1799      * @param timeInterval time interval between epochs.
1800      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1801      * @param oldC         previous body-to-NED coordinate transformation.
1802      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1803      *                     along north, east, and down and expressed in meters per second (m/s).
1804      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1805      *                     along north, east, and down and expressed in meters per second (m/s).
1806      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1807      *                     along north, east, and down and expressed in meters per second (m/s).
1808      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1809      * @return a new body kinematics instance.
1810      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1811      *                                  matrices are not NED frame valid.
1812      */
1813     public BodyKinematics estimateAndReturnNew(
1814             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1815             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition) {
1816         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition);
1817     }
1818 
1819     /**
1820      * Estimates body kinematics (specific force applied to a body and its angular rates)
1821      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1822      *
1823      * @param timeInterval time interval between epochs expressed in seconds (s).
1824      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1825      * @param oldC         previous body-to-NED coordinate transformation.
1826      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1827      *                     along north, east, and down.
1828      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1829      *                     along north, east, and down.
1830      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1831      *                     along north, east, and down.
1832      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1833      * @return a new body kinematics instance.
1834      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1835      *                                  matrices are not NED frame valid.
1836      */
1837     public BodyKinematics estimateAndReturnNew(
1838             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1839             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition) {
1840         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition);
1841     }
1842 
1843     /**
1844      * Estimates body kinematics (specific force applied to a body and its angular rates)
1845      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1846      *
1847      * @param timeInterval time interval between epochs.
1848      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1849      * @param oldC         previous body-to-NED coordinate transformation.
1850      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
1851      *                     along north, east, and down.
1852      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
1853      *                     along north, east, and down.
1854      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
1855      *                     along north, east, and down.
1856      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1857      * @return a new body kinematics instance.
1858      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1859      *                                  matrices are not NED frame valid.
1860      */
1861     public BodyKinematics estimateAndReturnNew(
1862             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1863             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition) {
1864         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition);
1865     }
1866 
1867     /**
1868      * Estimates body kinematics (specific force applied to a body and its angular rates)
1869      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1870      *
1871      * @param timeInterval time interval between epochs expressed in seconds (s).
1872      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1873      * @param oldC         previous body-to-NED coordinate transformation.
1874      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1875      *                     down.
1876      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1877      * @return a new body kinematics instance.
1878      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1879      *                                  matrices are not NED frame valid.
1880      */
1881     public BodyKinematics estimateAndReturnNew(
1882             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1883             final NEDVelocity oldVelocity, final NEDPosition oldPosition) {
1884         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldPosition);
1885     }
1886 
1887     /**
1888      * Estimates body kinematics (specific force applied to a body and its angular rates)
1889      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1890      *
1891      * @param timeInterval time interval between epochs.
1892      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
1893      * @param oldC         previous body-to-NED coordinate transformation.
1894      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
1895      *                     down.
1896      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
1897      * @return a new body kinematics instance.
1898      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1899      *                                  matrices are not NED frame valid.
1900      */
1901     public BodyKinematics estimateAndReturnNew(
1902             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
1903             final NEDVelocity oldVelocity, final NEDPosition oldPosition) {
1904         return estimateKinematicsAndReturnNew(timeInterval, frame, oldC, oldVelocity, oldPosition);
1905     }
1906 
1907     /**
1908      * Estimates body kinematics (specific force applied to a body and its angular rates)
1909      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1910      *
1911      * @param timeInterval time interval between epochs expressed in seconds (s).
1912      * @param c            body-to-NED coordinate transformation.
1913      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1914      *                     north, east, and down and expressed in meters per second (m/s).
1915      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1916      *                     north, east, and down and expressed in meters per second (m/s).
1917      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1918      *                     north, east, and down and expressed in meters per second (m/s).
1919      * @param latitude     current latitude expressed in radians (rad).
1920      * @param height       current height expressed in meters (m).
1921      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
1922      * @return a new body kinematics instance.
1923      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1924      *                                  matrices are not NED frame valid.
1925      */
1926     public BodyKinematics estimateAndReturnNew(
1927             final double timeInterval, final CoordinateTransformation c,
1928             final double vn, final double ve, final double vd, final double latitude, final double height,
1929             final NEDFrame oldFrame) {
1930         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, latitude, height, oldFrame);
1931     }
1932 
1933     /**
1934      * Estimates body kinematics (specific force applied to a body and its angular rates)
1935      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1936      *
1937      * @param timeInterval time interval between epochs.
1938      * @param c            body-to-NED coordinate transformation.
1939      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
1940      *                     north, east, and down and expressed in meters per second (m/s).
1941      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
1942      *                     north, east, and down and expressed in meters per second (m/s).
1943      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
1944      *                     north, east, and down and expressed in meters per second (m/s).
1945      * @param latitude     current latitude expressed in radians (rad).
1946      * @param height       current height expressed in meters (m).
1947      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
1948      * @return a new body kinematics instance.
1949      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1950      *                                  matrices are not NED frame valid.
1951      */
1952     public BodyKinematics estimateAndReturnNew(
1953             final Time timeInterval, final CoordinateTransformation c,
1954             final double vn, final double ve, final double vd, final double latitude, final double height,
1955             final NEDFrame oldFrame) {
1956         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, latitude, height, oldFrame);
1957     }
1958 
1959     /**
1960      * Estimates body kinematics (specific force applied to a body and its angular rates)
1961      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1962      *
1963      * @param timeInterval time interval between epochs expressed in seconds (s).
1964      * @param c            body-to-NED coordinate transformation.
1965      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1966      * @param latitude     current latitude expressed in radians (rad).
1967      * @param height       current height expressed in meters (m).
1968      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
1969      * @return a new body kinematics instance.
1970      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1971      *                                  matrices are not NED frame valid.
1972      */
1973     public BodyKinematics estimateAndReturnNew(
1974             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
1975             final double latitude, final double height, final NEDFrame oldFrame) {
1976         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, latitude, height, oldFrame);
1977     }
1978 
1979     /**
1980      * Estimates body kinematics (specific force applied to a body and its angular rates)
1981      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
1982      *
1983      * @param timeInterval time interval between epochs.
1984      * @param c            body-to-NED coordinate transformation.
1985      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
1986      * @param latitude     current latitude expressed in radians (rad).
1987      * @param height       current height expressed in meters (m).
1988      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
1989      * @return a new body kinematics instance.
1990      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
1991      *                                  matrices are not NED frame valid.
1992      */
1993     public BodyKinematics estimateAndReturnNew(
1994             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
1995             final double latitude, final double height, final NEDFrame oldFrame) {
1996         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, latitude, height, oldFrame);
1997     }
1998 
1999     /**
2000      * Estimates body kinematics (specific force applied to a body and its angular rates)
2001      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2002      *
2003      * @param timeInterval time interval between epochs expressed in seconds (s).
2004      * @param c            body-to-NED coordinate transformation.
2005      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2006      * @param latitude     current latitude.
2007      * @param height       current height.
2008      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2009      * @return a new body kinematics instance.
2010      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2011      *                                  matrices are not NED frame valid.
2012      */
2013     public BodyKinematics estimateAndReturnNew(
2014             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
2015             final Angle latitude, final Distance height, final NEDFrame oldFrame) {
2016         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, latitude, height, oldFrame);
2017     }
2018 
2019     /**
2020      * Estimates body kinematics (specific force applied to a body and its angular rates)
2021      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2022      *
2023      * @param timeInterval time interval between epochs.
2024      * @param c            body-to-NED coordinate transformation.
2025      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2026      * @param latitude     current latitude.
2027      * @param height       current height.
2028      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2029      * @return a new body kinematics instance.
2030      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2031      *                                  matrices are not NED frame valid.
2032      */
2033     public BodyKinematics estimateAndReturnNew(
2034             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
2035             final Angle latitude, final Distance height, final NEDFrame oldFrame) {
2036         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, latitude, height, oldFrame);
2037     }
2038 
2039     /**
2040      * Estimates body kinematics (specific force applied to a body and its angular rates)
2041      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2042      *
2043      * @param timeInterval time interval between epochs expressed in seconds (s).
2044      * @param c            body-to-NED coordinate transformation.
2045      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2046      *                     north, east, and down and expressed in meters per second (m/s).
2047      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2048      *                     north, east, and down and expressed in meters per second (m/s).
2049      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2050      *                     north, east, and down and expressed in meters per second (m/s).
2051      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2052      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2053      * @return a new body kinematics instance.
2054      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2055      *                                  matrices are not NED frame valid.
2056      */
2057     public BodyKinematics estimateAndReturnNew(
2058             final double timeInterval, final CoordinateTransformation c,
2059             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame) {
2060         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, position, oldFrame);
2061     }
2062 
2063     /**
2064      * Estimates body kinematics (specific force applied to a body and its angular rates)
2065      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2066      *
2067      * @param timeInterval time interval between epochs.
2068      * @param c            body-to-NED coordinate transformation.
2069      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2070      *                     north, east, and down and expressed in meters per second (m/s).
2071      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2072      *                     north, east, and down and expressed in meters per second (m/s).
2073      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2074      *                     north, east, and down and expressed in meters per second (m/s).
2075      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2076      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2077      * @return a new body kinematics instance.
2078      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2079      *                                  matrices are not NED frame valid.
2080      */
2081     public BodyKinematics estimateAndReturnNew(
2082             final Time timeInterval, final CoordinateTransformation c,
2083             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame) {
2084         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, position, oldFrame);
2085     }
2086 
2087     /**
2088      * Estimates body kinematics (specific force applied to a body and its angular rates)
2089      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2090      *
2091      * @param timeInterval time interval between epochs expressed in seconds (s).
2092      * @param c            body-to-NED coordinate transformation.
2093      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2094      *                     north, east, and down.
2095      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2096      *                     north, east, and down.
2097      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2098      *                     north, east, and down.
2099      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2100      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2101      * @return a new body kinematics instance.
2102      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2103      *                                  matrices are not NED frame valid.
2104      */
2105     public BodyKinematics estimateAndReturnNew(
2106             final double timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
2107             final NEDPosition position, final NEDFrame oldFrame) {
2108         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, position, oldFrame);
2109     }
2110 
2111     /**
2112      * Estimates body kinematics (specific force applied to a body and its angular rates)
2113      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2114      *
2115      * @param timeInterval time interval between epochs.
2116      * @param c            body-to-NED coordinate transformation.
2117      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2118      *                     north, east, and down.
2119      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2120      *                     north, east, and down.
2121      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2122      *                     north, east, and down.
2123      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2124      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2125      * @return a new body kinematics instance.
2126      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2127      *                                  matrices are not NED frame valid.
2128      */
2129     public BodyKinematics estimateAndReturnNew(
2130             final Time timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
2131             final NEDPosition position, final NEDFrame oldFrame) {
2132         return estimateKinematicsAndReturnNew(timeInterval, c, vn, ve, vd, position, oldFrame);
2133     }
2134 
2135     /**
2136      * Estimates body kinematics (specific force applied to a body and its angular rates)
2137      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2138      *
2139      * @param timeInterval time interval between epochs expressed in seconds (s).
2140      * @param c            body-to-NED coordinate transformation.
2141      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2142      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2143      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2144      * @return a new body kinematics instance.
2145      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2146      *                                  matrices are not NED frame valid.
2147      */
2148     public BodyKinematics estimateAndReturnNew(
2149             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
2150             final NEDPosition position, final NEDFrame oldFrame) {
2151         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, position, oldFrame);
2152     }
2153 
2154     /**
2155      * Estimates body kinematics (specific force applied to a body and its angular rates)
2156      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2157      *
2158      * @param timeInterval time interval between epochs.
2159      * @param c            body-to-NED coordinate transformation.
2160      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2161      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2162      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2163      * @return a new body kinematics instance.
2164      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2165      *                                  matrices are not NED frame valid.
2166      */
2167     public BodyKinematics estimateAndReturnNew(
2168             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
2169             final NEDPosition position, final NEDFrame oldFrame) {
2170         return estimateKinematicsAndReturnNew(timeInterval, c, velocity, position, oldFrame);
2171     }
2172 
2173     /**
2174      * Estimates body kinematics (specific force applied to a body and its angular rates)
2175      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2176      *
2177      * @param timeInterval time interval between epochs expressed in seconds (s).
2178      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
2179      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2180      * @return a new body kinematics instance.
2181      * @throws IllegalArgumentException if provided time interval is negative.
2182      */
2183     public BodyKinematics estimateAndReturnNew(
2184             final double timeInterval, final NEDFrame frame, final NEDFrame oldFrame) {
2185         return estimateKinematicsAndReturnNew(timeInterval, frame, oldFrame);
2186     }
2187 
2188     /**
2189      * Estimates body kinematics (specific force applied to a body and its angular rates)
2190      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2191      *
2192      * @param timeInterval time interval between epochs.
2193      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
2194      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
2195      * @return a new body kinematics instance.
2196      * @throws IllegalArgumentException if provided time interval is negative.
2197      */
2198     public BodyKinematics estimateAndReturnNew(
2199             final Time timeInterval, final NEDFrame frame, final NEDFrame oldFrame) {
2200         return estimateKinematicsAndReturnNew(timeInterval, frame, oldFrame);
2201     }
2202 
2203     /**
2204      * Estimates body kinematics (specific force applied to a body and its angular rates)
2205      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2206      *
2207      * @param timeInterval time interval between epochs expressed in seconds (s).
2208      * @param c            body-to-NED coordinate transformation.
2209      * @param oldC         previous body-to-NED coordinate transformation.
2210      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2211      *                     north, east, and down.
2212      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2213      *                     north, east, and down.
2214      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2215      *                     north, east, and down.
2216      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2217      *                     along north, east, and down.
2218      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2219      *                     along north, east, and down.
2220      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2221      *                     along north, east, and down.
2222      * @param latitude     current latitude expressed in radians (rad).
2223      * @param height       current height expressed in meters (m).
2224      * @param oldLatitude  previous latitude expressed in radians (rad).
2225      * @param oldHeight    previous height expressed in meters (m).
2226      * @return a new body kinematics instance.
2227      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2228      *                                  matrices are not NED frame valid.
2229      */
2230     public BodyKinematics estimateAndReturnNew(
2231             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2232             final Speed vn, final Speed ve, final Speed vd,
2233             final Speed oldVn, final Speed oldVe, final Speed oldVd,
2234             final double latitude, final double height, final double oldLatitude, final double oldHeight) {
2235         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2236                 oldLatitude, oldHeight);
2237     }
2238 
2239     /**
2240      * Estimates body kinematics (specific force applied to a body and its angular rates)
2241      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2242      *
2243      * @param timeInterval time interval between epochs.
2244      * @param c            body-to-NED coordinate transformation.
2245      * @param oldC         previous body-to-NED coordinate transformation.
2246      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2247      *                     north, east, and down.
2248      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2249      *                     north, east, and down.
2250      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2251      *                     north, east, and down.
2252      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2253      *                     along north, east, and down.
2254      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2255      *                     along north, east, and down.
2256      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2257      *                     along north, east, and down.
2258      * @param latitude     current latitude expressed in radians (rad).
2259      * @param height       current height expressed in meters (m).
2260      * @param oldLatitude  previous latitude expressed in radians (rad).
2261      * @param oldHeight    previous height expressed in meters (m).
2262      * @return a new body kinematics instance.
2263      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2264      *                                  matrices are not NED frame valid.
2265      */
2266     public BodyKinematics estimateAndReturnNew(
2267             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2268             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
2269             final double latitude, final double height, final double oldLatitude, final double oldHeight) {
2270         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2271                 oldLatitude, oldHeight);
2272     }
2273 
2274     /**
2275      * Estimates body kinematics (specific force applied to a body and its angular rates)
2276      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2277      *
2278      * @param timeInterval time interval between epochs expressed in seconds (s).
2279      * @param c            body-to-NED coordinate transformation.
2280      * @param oldC         previous body-to-NED coordinate transformation.
2281      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2282      *                     north, east, and down and expressed in meters per second (m/s).
2283      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2284      *                     north, east, and down and expressed in meters per second (m/s).
2285      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2286      *                     north, east, and down and expressed in meters per second (m/s).
2287      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2288      *                     along north, east, and down and expressed in meters per second (m/s).
2289      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2290      *                     along north, east, and down and expressed in meters per second (m/s).
2291      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2292      *                     along north, east, and down and expressed in meters per second (m/s).
2293      * @param latitude     current latitude.
2294      * @param height       current height expressed in meters (m).
2295      * @param oldLatitude  previous latitude.
2296      * @param oldHeight    previous height expressed in meters (m).
2297      * @return a new body kinematics instance.
2298      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2299      *                                  matrices are not NED frame valid.
2300      */
2301     public BodyKinematics estimateAndReturnNew(
2302             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2303             final double vn, final double ve, final double vd,
2304             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
2305             final Angle oldLatitude, final double oldHeight) {
2306         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2307                 oldLatitude, oldHeight);
2308     }
2309 
2310     /**
2311      * Estimates body kinematics (specific force applied to a body and its angular rates)
2312      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2313      *
2314      * @param timeInterval time interval between epochs.
2315      * @param c            body-to-NED coordinate transformation.
2316      * @param oldC         previous body-to-NED coordinate transformation.
2317      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2318      *                     north, east, and down and expressed in meters per second (m/s).
2319      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2320      *                     north, east, and down and expressed in meters per second (m/s).
2321      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2322      *                     north, east, and down and expressed in meters per second (m/s).
2323      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2324      *                     along north, east, and down and expressed in meters per second (m/s).
2325      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2326      *                     along north, east, and down and expressed in meters per second (m/s).
2327      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2328      *                     along north, east, and down and expressed in meters per second (m/s).
2329      * @param latitude     current latitude.
2330      * @param height       current height expressed in meters (m).
2331      * @param oldLatitude  previous latitude.
2332      * @param oldHeight    previous height expressed in meters (m).
2333      * @return a new body kinematics instance.
2334      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2335      *                                  matrices are not NED frame valid.
2336      */
2337     public BodyKinematics estimateAndReturnNew(
2338             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2339             final double vn, final double ve, final double vd,
2340             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
2341             final Angle oldLatitude, final double oldHeight) {
2342         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2343                 oldLatitude, oldHeight);
2344     }
2345 
2346     /**
2347      * Estimates body kinematics (specific force applied to a body and its angular rates)
2348      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2349      *
2350      * @param timeInterval time interval between epochs expressed in seconds (s).
2351      * @param c            body-to-NED coordinate transformation.
2352      * @param oldC         previous body-to-NED coordinate transformation.
2353      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2354      *                     north, east, and down and expressed in meters per second (m/s).
2355      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2356      *                     north, east, and down and expressed in meters per second (m/s).
2357      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2358      *                     north, east, and down and expressed in meters per second (m/s).
2359      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2360      *                     along north, east, and down and expressed in meters per second (m/s).
2361      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2362      *                     along north, east, and down and expressed in meters per second (m/s).
2363      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2364      *                     along north, east, and down and expressed in meters per second (m/s).
2365      * @param latitude     current latitude expressed in radians (rad).
2366      * @param height       current height.
2367      * @param oldLatitude  previous latitude expressed in radians (rad).
2368      * @param oldHeight    previous height.
2369      * @return a new body kinematics instance.
2370      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2371      *                                  matrices are not NED frame valid.
2372      */
2373     public BodyKinematics estimateAndReturnNew(
2374             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2375             final double vn, final double ve, final double vd,
2376             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
2377             final double oldLatitude, final Distance oldHeight) {
2378         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2379                 oldLatitude, oldHeight);
2380     }
2381 
2382     /**
2383      * Estimates body kinematics (specific force applied to a body and its angular rates)
2384      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2385      *
2386      * @param timeInterval time interval between epochs.
2387      * @param c            body-to-NED coordinate transformation.
2388      * @param oldC         previous body-to-NED coordinate transformation.
2389      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2390      *                     north, east, and down and expressed in meters per second (m/s).
2391      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2392      *                     north, east, and down and expressed in meters per second (m/s).
2393      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2394      *                     north, east, and down and expressed in meters per second (m/s).
2395      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2396      *                     along north, east, and down and expressed in meters per second (m/s).
2397      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2398      *                     along north, east, and down and expressed in meters per second (m/s).
2399      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2400      *                     along north, east, and down and expressed in meters per second (m/s).
2401      * @param latitude     current latitude expressed in radians (rad).
2402      * @param height       current height.
2403      * @param oldLatitude  previous latitude expressed in radians (rad).
2404      * @param oldHeight    previous height.
2405      * @return a new body kinematics instance.
2406      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2407      *                                  matrices are not NED frame valid.
2408      */
2409     public BodyKinematics estimateAndReturnNew(
2410             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2411             final double vn, final double ve, final double vd,
2412             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
2413             final double oldLatitude, final Distance oldHeight) {
2414         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2415                 oldLatitude, oldHeight);
2416     }
2417 
2418     /**
2419      * Estimates body kinematics (specific force applied to a body and its angular rates)
2420      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2421      *
2422      * @param timeInterval time interval between epochs expressed in seconds (s).
2423      * @param c            body-to-NED coordinate transformation.
2424      * @param oldC         previous body-to-NED coordinate transformation.
2425      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2426      *                     north, east, and down.
2427      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2428      *                     north, east, and down.
2429      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2430      *                     north, east, and down.
2431      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2432      *                     along north, east, and down.
2433      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2434      *                     along north, east, and down.
2435      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2436      *                     along north, east, and down.
2437      * @param latitude     current latitude.
2438      * @param height       current height.
2439      * @param oldLatitude  previous latitude.
2440      * @param oldHeight    previous height.
2441      * @return a new body kinematics instance.
2442      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2443      *                                  matrices are not NED frame valid.
2444      */
2445     public BodyKinematics estimateAndReturnNew(
2446             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2447             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
2448             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight) {
2449         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2450                 oldLatitude, oldHeight);
2451     }
2452 
2453     /**
2454      * Estimates body kinematics (specific force applied to a body and its angular rates)
2455      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2456      *
2457      * @param timeInterval time interval between epochs.
2458      * @param c            body-to-NED coordinate transformation.
2459      * @param oldC         previous body-to-NED coordinate transformation.
2460      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2461      *                     north, east, and down.
2462      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2463      *                     north, east, and down.
2464      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2465      *                     north, east, and down.
2466      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2467      *                     along north, east, and down.
2468      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2469      *                     along north, east, and down.
2470      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2471      *                     along north, east, and down.
2472      * @param latitude     current latitude.
2473      * @param height       current height.
2474      * @param oldLatitude  previous latitude.
2475      * @param oldHeight    previous height.
2476      * @return a new body kinematics instance.
2477      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2478      *                                  matrices are not NED frame valid.
2479      */
2480     public BodyKinematics estimateAndReturnNew(
2481             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2482             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
2483             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight) {
2484         return estimateKinematicsAndReturnNew(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2485                 oldLatitude, oldHeight);
2486     }
2487 
2488     /**
2489      * Estimates body kinematics (specific force applied to a body and its angular rates)
2490      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2491      *
2492      * @param timeInterval time interval between epochs expressed in seconds (s).
2493      * @param c            body-to-NED coordinate transformation.
2494      * @param oldC         previous body-to-NED coordinate transformation.
2495      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2496      *                     north, east, and down and expressed in meters per second (m/s).
2497      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2498      *                     north, east, and down and expressed in meters per second (m/s).
2499      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2500      *                     north, east, and down and expressed in meters per second (m/s).
2501      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2502      *                     along north, east, and down and expressed in meters per second (m/s).
2503      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2504      *                     along north, east, and down and expressed in meters per second (m/s).
2505      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2506      *                     along north, east, and down and expressed in meters per second (m/s).
2507      * @param latitude     current latitude expressed in radians (rad).
2508      * @param height       current height expressed in meters (m).
2509      * @param oldLatitude  previous latitude expressed in radians (rad).
2510      * @param oldHeight    previous height expressed in meters (m).
2511      * @param result       instance where estimated body kinematics will be stored.
2512      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2513      *                                  matrices are not NED frame valid.
2514      */
2515     public static void estimateKinematics(
2516             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2517             final double vn, final double ve, final double vd,
2518             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
2519             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
2520 
2521         if (timeInterval < 0.0 || !NEDFrame.isValidCoordinateTransformation(c)
2522                 || !NEDFrame.isValidCoordinateTransformation(oldC)) {
2523             throw new IllegalArgumentException();
2524         }
2525 
2526         if (timeInterval > 0.0) {
2527             try {
2528                 // From (2.123), determine the angular rate of the NED frame
2529                 // with respect the ECI frame, resolved about NED
2530                 final var omegaIen = new Matrix(ROWS, 1);
2531                 omegaIen.setElementAtIndex(0, EARTH_ROTATION_RATE * Math.cos(oldLatitude));
2532                 omegaIen.setElementAtIndex(2, -EARTH_ROTATION_RATE * Math.sin(oldLatitude));
2533 
2534                 // From (5.44), determine the angular rate of the NED frame
2535                 // with respect the NED frame, resolved about NED
2536                 final var oldRadiiOfCurvature = RadiiOfCurvatureEstimator.estimateRadiiOfCurvatureAndReturnNew(
2537                         oldLatitude);
2538                 final var oldRn = oldRadiiOfCurvature.getRn();
2539                 final var oldRe = oldRadiiOfCurvature.getRe();
2540 
2541                 final var radiiOfCurvature = RadiiOfCurvatureEstimator.estimateRadiiOfCurvatureAndReturnNew(latitude);
2542                 final var rn = radiiOfCurvature.getRn();
2543                 final var re = radiiOfCurvature.getRe();
2544 
2545                 final var oldOmegaEnN = new Matrix(ROWS, 1);
2546                 oldOmegaEnN.setElementAtIndex(0, oldVe / (oldRe + oldHeight));
2547                 oldOmegaEnN.setElementAtIndex(1, -oldVn / (oldRn + oldHeight));
2548                 oldOmegaEnN.setElementAtIndex(2, -oldVe * Math.tan(oldLatitude) / (oldRe + oldHeight));
2549 
2550                 final var omegaEnN = new Matrix(ROWS, 1);
2551                 omegaEnN.setElementAtIndex(0, ve / (re + height));
2552                 omegaEnN.setElementAtIndex(1, -vn / (rn + height));
2553                 omegaEnN.setElementAtIndex(2, -ve * Math.tan(latitude) / (re + height));
2554 
2555                 // Obtain coordinate transformation matrix from the old attitude (with
2556                 // respect the inertial frame) to the new using (5.77)
2557                 final var cbn = c.getMatrix();
2558                 cbn.transpose();
2559 
2560                 final var omega = omegaIen.addAndReturnNew(omegaEnN.multiplyByScalarAndReturnNew(0.5));
2561                 omega.add(oldOmegaEnN.multiplyByScalarAndReturnNew(0.5));
2562                 final var skew1 = Utils.skewMatrix(omega);
2563                 skew1.multiplyByScalar(timeInterval);
2564 
2565                 final var tmp1 = Matrix.identity(ROWS, ROWS);
2566                 tmp1.subtract(skew1);
2567 
2568                 final var oldCbn = oldC.getMatrix();
2569                 cbn.multiply(tmp1);
2570                 cbn.multiply(oldCbn);
2571                 // cbn contains transformation matrix from the old to the new attitude (cOldNew)
2572 
2573                 // Calculate the approximate angular rate with respect an inertial frame
2574                 final var alphaIbb = new Matrix(ROWS, 1);
2575                 alphaIbb.setElementAtIndex(0,
2576                         0.5 * (cbn.getElementAt(1, 2) - cbn.getElementAt(2, 1)));
2577                 alphaIbb.setElementAtIndex(1,
2578                         0.5 * (cbn.getElementAt(2, 0) - cbn.getElementAt(0, 2)));
2579                 alphaIbb.setElementAtIndex(2,
2580                         0.5 * (cbn.getElementAt(0, 1) - cbn.getElementAt(1, 0)));
2581 
2582                 // Calculate and apply the scaling factor
2583                 final var temp = Math.acos(0.5 * (Utils.trace(cbn) - 1.0));
2584                 if (temp > SCALING_THRESHOLD) {
2585                     // Scaling is 1 if temp is less than this
2586                     alphaIbb.multiplyByScalar(temp / Math.sin(temp));
2587                 }
2588 
2589                 // Calculate the angular rate
2590                 final var angularRateX = alphaIbb.getElementAtIndex(0) / timeInterval;
2591                 final var angularRateY = alphaIbb.getElementAtIndex(1) / timeInterval;
2592                 final var angularRateZ = alphaIbb.getElementAtIndex(2) / timeInterval;
2593 
2594                 // Calculate the specific force resolved about NED-frame axes
2595                 // From (5.54)
2596                 final var tmp2 = new Matrix(ROWS, 1);
2597                 tmp2.setElementAtIndex(0, (vn - oldVn) / timeInterval);
2598                 tmp2.setElementAtIndex(1, (ve - oldVe) / timeInterval);
2599                 tmp2.setElementAtIndex(2, (vd - oldVd) / timeInterval);
2600 
2601                 final var gravity = NEDGravityEstimator.estimateGravityAndReturnNew(oldLatitude, oldHeight);
2602                 final var g = gravity.asMatrix();
2603 
2604                 final var oldVebn = new Matrix(ROWS, 1);
2605                 oldVebn.setElementAtIndex(0, oldVn);
2606                 oldVebn.setElementAtIndex(1, oldVe);
2607                 oldVebn.setElementAtIndex(2, oldVd);
2608 
2609                 final var skew2 = Utils.skewMatrix(oldOmegaEnN.addAndReturnNew(
2610                         omegaIen.multiplyByScalarAndReturnNew(2.0)));
2611                 skew2.multiply(oldVebn);
2612 
2613                 tmp2.subtract(g);
2614                 tmp2.add(skew2);
2615                 // tmp2 now contains specific force resolved about NED (fIbn)
2616 
2617                 // Calculate the average body-to-NED coordinate transformation
2618                 // matrix over the update interval using (5.84) and (5.86)
2619                 final var magAlpha = Utils.normF(alphaIbb);
2620                 final var skewAlpha = Utils.skewMatrix(alphaIbb);
2621 
2622                 oldOmegaEnN.add(omegaIen);
2623                 final var tmp3 = Utils.skewMatrix(oldOmegaEnN);
2624                 tmp3.multiplyByScalar(0.5);
2625                 tmp3.multiply(oldCbn);
2626 
2627                 if (magAlpha > ALPHA_THRESHOLD) {
2628                     final var magAlpha2 = magAlpha * magAlpha;
2629                     final var value1 = (1.0 - Math.cos(magAlpha)) / magAlpha2;
2630                     final var value2 = (1.0 - Math.sin(magAlpha) / magAlpha) / magAlpha2;
2631 
2632                     final var tmp4 = skewAlpha.multiplyByScalarAndReturnNew(value1);
2633                     final var tmp5 = skewAlpha.multiplyByScalarAndReturnNew(value2);
2634                     tmp5.multiply(skewAlpha);
2635 
2636                     final var tmp6 = Matrix.identity(ROWS, ROWS);
2637                     tmp6.add(tmp4);
2638                     tmp6.add(tmp5);
2639 
2640                     oldCbn.multiply(tmp6);
2641                 }
2642 
2643                 oldCbn.subtract(tmp3);
2644                 // oldCbn now contains average body-to-NED (aveCbn)
2645 
2646                 // Transform specific force to body-frame resolving axes using (5.81)
2647                 final var fIbb = Utils.inverse(oldCbn);
2648                 fIbb.multiply(tmp2);
2649 
2650                 final var specificForceX = fIbb.getElementAtIndex(0);
2651                 final var specificForceY = fIbb.getElementAtIndex(1);
2652                 final var specificForceZ = fIbb.getElementAtIndex(2);
2653 
2654                 // save result data
2655                 result.setSpecificForceCoordinates(specificForceX, specificForceY, specificForceZ);
2656                 result.setAngularRateCoordinates(angularRateX, angularRateY, angularRateZ);
2657 
2658             } catch (final AlgebraException ignore) {
2659                 // never happens
2660             }
2661         } else {
2662             // If time interval is zero, set angular rate and specific force to zero
2663             result.setSpecificForceCoordinates(0.0, 0.0, 0.0);
2664             result.setAngularRateCoordinates(0.0, 0.0, 0.0);
2665         }
2666     }
2667 
2668     /**
2669      * Estimates body kinematics (specific force applied to a body and its angular rates)
2670      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2671      *
2672      * @param timeInterval time interval between epochs.
2673      * @param c            body-to-NED coordinate transformation.
2674      * @param oldC         previous body-to-NED coordinate transformation.
2675      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2676      *                     north, east, and down and expressed in meters per second (m/s).
2677      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2678      *                     north, east, and down and expressed in meters per second (m/s).
2679      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2680      *                     north, east, and down and expressed in meters per second (m/s).
2681      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2682      *                     along north, east, and down and expressed in meters per second (m/s).
2683      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2684      *                     along north, east, and down and expressed in meters per second (m/s).
2685      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2686      *                     along north, east, and down and expressed in meters per second (m/s).
2687      * @param latitude     current latitude expressed in radians (rad).
2688      * @param height       current height expressed in meters (m).
2689      * @param oldLatitude  previous latitude expressed in radians (rad).
2690      * @param oldHeight    previous height expressed in meters (m).
2691      * @param result       instance where estimated body kinematics will be stored.
2692      * @throws IllegalArgumentException if provided time interval is negative or coordinate
2693      */
2694     public static void estimateKinematics(
2695             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2696             final double vn, final double ve, final double vd,
2697             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
2698             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
2699         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
2700                 oldLatitude, oldHeight, result);
2701     }
2702 
2703     /**
2704      * Estimates body kinematics (specific force applied to a body and its angular rates)
2705      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2706      *
2707      * @param timeInterval time interval between epochs expressed in seconds (s).
2708      * @param c            body-to-NED coordinate transformation.
2709      * @param oldC         previous body-to-NED coordinate transformation.
2710      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2711      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2712      *                     down.
2713      * @param latitude     current latitude expressed in radians (rad).
2714      * @param height       current height expressed in meters (m).
2715      * @param oldLatitude  previous latitude expressed in radians (rad).
2716      * @param oldHeight    previous height expressed in meters (m).
2717      * @param result       instance where estimated body kinematics will be stored.
2718      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2719      *                                  matrices are not NED frame valid.
2720      */
2721     public static void estimateKinematics(
2722             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2723             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
2724             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
2725         estimateKinematics(timeInterval, c, oldC, velocity.getVn(), velocity.getVe(), velocity.getVd(),
2726                 oldVelocity.getVn(), oldVelocity.getVe(), oldVelocity.getVd(), latitude, height, oldLatitude, oldHeight,
2727                 result);
2728     }
2729 
2730     /**
2731      * Estimates body kinematics (specific force applied to a body and its angular rates)
2732      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2733      *
2734      * @param timeInterval time interval between epochs.
2735      * @param c            body-to-NED coordinate transformation.
2736      * @param oldC         previous body-to-NED coordinate transformation.
2737      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2738      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2739      *                     down.
2740      * @param latitude     current latitude expressed in radians (rad).
2741      * @param height       current height expressed in meters (m).
2742      * @param oldLatitude  previous latitude expressed in radians (rad).
2743      * @param oldHeight    previous height expressed in meters (m).
2744      * @param result       instance where estimated body kinematics will be stored.
2745      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2746      *                                  matrices are not NED frame valid.
2747      */
2748     public static void estimateKinematics(
2749             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2750             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
2751             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
2752         estimateKinematics(convertTime(timeInterval), c, oldC, velocity, oldVelocity, latitude, height,
2753                 oldLatitude, oldHeight, result);
2754     }
2755 
2756     /**
2757      * Estimates body kinematics (specific force applied to a body and its angular rates)
2758      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2759      *
2760      * @param timeInterval time interval between epochs expressed in seconds (s).
2761      * @param c            body-to-NED coordinate transformation.
2762      * @param oldC         previous body-to-NED coordinate transformation.
2763      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2764      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2765      *                     down.
2766      * @param latitude     current latitude.
2767      * @param height       current height.
2768      * @param oldLatitude  previous latitude.
2769      * @param oldHeight    previous height.
2770      * @param result       instance where estimated body kinematics will be stored.
2771      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2772      *                                  matrices are not NED frame valid.
2773      */
2774     public static void estimateKinematics(
2775             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2776             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
2777             final Angle oldLatitude, final Distance oldHeight, final BodyKinematics result) {
2778         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, convertAngle(latitude), convertDistance(height),
2779                 convertAngle(oldLatitude), convertDistance(oldHeight), result);
2780     }
2781 
2782     /**
2783      * Estimates body kinematics (specific force applied to a body and its angular rates)
2784      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2785      *
2786      * @param timeInterval time interval between epochs expressed in seconds (s).
2787      * @param c            body-to-NED coordinate transformation.
2788      * @param oldC         previous body-to-NED coordinate transformation.
2789      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2790      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2791      *                     down.
2792      * @param latitude     current latitude.
2793      * @param height       current height.
2794      * @param oldLatitude  previous latitude.
2795      * @param oldHeight    previous height.
2796      * @param result       instance where estimated body kinematics will be stored.
2797      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2798      *                                  matrices are not NED frame valid.
2799      */
2800     public static void estimateKinematics(
2801             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2802             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
2803             final Angle oldLatitude, final Distance oldHeight, final BodyKinematics result) {
2804         estimateKinematics(convertTime(timeInterval), c, oldC, velocity, oldVelocity, latitude, height,
2805                 oldLatitude, oldHeight, result);
2806     }
2807 
2808     /**
2809      * Estimates body kinematics (specific force applied to a body and its angular rates)
2810      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2811      *
2812      * @param timeInterval time interval between epochs expressed in seconds (s).
2813      * @param c            body-to-NED coordinate transformation.
2814      * @param oldC         previous body-to-NED coordinate transformation.
2815      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2816      *                     north, east, and down and expressed in meters per second (m/s).
2817      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2818      *                     north, east, and down and expressed in meters per second (m/s).
2819      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2820      *                     north, east, and down and expressed in meters per second (m/s).
2821      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2822      *                     along north, east, and down and expressed in meters per second (m/s).
2823      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2824      *                     along north, east, and down and expressed in meters per second (m/s).
2825      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2826      *                     along north, east, and down and expressed in meters per second (m/s).
2827      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2828      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2829      * @param result       instance where estimated body kinematics will be stored.
2830      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2831      *                                  matrices are not NED frame valid.
2832      */
2833     public static void estimateKinematics(
2834             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2835             final double vn, final double ve, final double vd,
2836             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
2837             final NEDPosition oldPosition, final BodyKinematics result) {
2838         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd,
2839                 position.getLatitude(), position.getHeight(), oldPosition.getLatitude(), oldPosition.getHeight(),
2840                 result);
2841     }
2842 
2843     /**
2844      * Estimates body kinematics (specific force applied to a body and its angular rates)
2845      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2846      *
2847      * @param timeInterval time interval between epochs.
2848      * @param c            body-to-NED coordinate transformation.
2849      * @param oldC         previous body-to-NED coordinate transformation.
2850      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2851      *                     north, east, and down and expressed in meters per second (m/s).
2852      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2853      *                     north, east, and down and expressed in meters per second (m/s).
2854      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2855      *                     north, east, and down and expressed in meters per second (m/s).
2856      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2857      *                     along north, east, and down and expressed in meters per second (m/s).
2858      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2859      *                     along north, east, and down and expressed in meters per second (m/s).
2860      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2861      *                     along north, east, and down and expressed in meters per second (m/s).
2862      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2863      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2864      * @param result       instance where estimated body kinematics will be stored.
2865      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2866      *                                  matrices are not NED frame valid.
2867      */
2868     public static void estimateKinematics(
2869             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2870             final double vn, final double ve, final double vd,
2871             final double oldVn, final double oldVe, final double oldVd,
2872             final NEDPosition position, final NEDPosition oldPosition, final BodyKinematics result) {
2873         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition,
2874                 result);
2875     }
2876 
2877     /**
2878      * Estimates body kinematics (specific force applied to a body and its angular rates)
2879      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2880      *
2881      * @param timeInterval time interval between epochs expressed in seconds (s).
2882      * @param c            body-to-NED coordinate transformation.
2883      * @param oldC         previous body-to-NED coordinate transformation.
2884      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2885      *                     north, east, and down.
2886      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2887      *                     north, east, and down.
2888      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2889      *                     north, east, and down.
2890      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2891      *                     along north, east, and down.
2892      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2893      *                     along north, east, and down.
2894      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2895      *                     along north, east, and down.
2896      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2897      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2898      * @param result       instance where estimated body kinematics will be stored.
2899      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2900      *                                  matrices are not NED frame valid.
2901      */
2902     public static void estimateKinematics(
2903             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2904             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
2905             final NEDPosition position, final NEDPosition oldPosition, final BodyKinematics result) {
2906         estimateKinematics(timeInterval, c, oldC, convertSpeed(vn), convertSpeed(ve), convertSpeed(vd),
2907                 convertSpeed(oldVn), convertSpeed(oldVe), convertSpeed(oldVd), position, oldPosition, result);
2908     }
2909 
2910     /**
2911      * Estimates body kinematics (specific force applied to a body and its angular rates)
2912      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2913      *
2914      * @param timeInterval time interval between epochs.
2915      * @param c            body-to-NED coordinate transformation.
2916      * @param oldC         previous body-to-NED coordinate transformation.
2917      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
2918      *                     north, east, and down.
2919      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
2920      *                     north, east, and down.
2921      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
2922      *                     north, east, and down.
2923      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2924      *                     along north, east, and down.
2925      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
2926      *                     along north, east, and down.
2927      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
2928      *                     along north, east, and down.
2929      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2930      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2931      * @param result       instance where estimated body kinematics will be stored.
2932      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2933      *                                  matrices are not NED frame valid.
2934      */
2935     public static void estimateKinematics(
2936             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2937             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
2938             final NEDPosition position, final NEDPosition oldPosition, final BodyKinematics result) {
2939         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition,
2940                 result);
2941     }
2942 
2943     /**
2944      * Estimates body kinematics (specific force applied to a body and its angular rates)
2945      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2946      *
2947      * @param timeInterval time interval between epochs expressed in seconds (s).
2948      * @param c            body-to-NED coordinate transformation.
2949      * @param oldC         previous body-to-NED coordinate transformation.
2950      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2951      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2952      *                     down.
2953      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2954      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2955      * @param result       instance where estimated body kinematics will be stored.
2956      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2957      *                                  matrices are not NED frame valid.
2958      */
2959     public static void estimateKinematics(
2960             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2961             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
2962             final NEDPosition oldPosition, final BodyKinematics result) {
2963         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, position.getLatitude(), position.getHeight(),
2964                 oldPosition.getLatitude(), oldPosition.getHeight(), result);
2965     }
2966 
2967     /**
2968      * Estimates body kinematics (specific force applied to a body and its angular rates)
2969      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2970      *
2971      * @param timeInterval time interval between epochs.
2972      * @param c            body-to-NED coordinate transformation.
2973      * @param oldC         previous body-to-NED coordinate transformation.
2974      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
2975      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
2976      *                     down.
2977      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
2978      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
2979      * @param result       instance where estimated body kinematics will be stored.
2980      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
2981      *                                  matrices are not NED frame valid.
2982      */
2983     public static void estimateKinematics(
2984             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
2985             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
2986             final NEDPosition oldPosition, final BodyKinematics result) {
2987         estimateKinematics(convertTime(timeInterval), c, oldC, velocity, oldVelocity, position, oldPosition, result);
2988     }
2989 
2990     /**
2991      * Estimates body kinematics (specific force applied to a body and its angular rates)
2992      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
2993      *
2994      * @param timeInterval time interval between epochs expressed in seconds (s).
2995      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
2996      * @param oldC         previous body-to-NED coordinate transformation.
2997      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
2998      *                     along north, east, and down and expressed in meters per second (m/s).
2999      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3000      *                     along north, east, and down and expressed in meters per second (m/s).
3001      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3002      *                     along north, east, and down and expressed in meters per second (m/s).
3003      * @param oldLatitude  previous latitude expressed in radians (rad).
3004      * @param oldHeight    previous height expressed in meters (m).
3005      * @param result       instance where estimated body kinematics will be stored.
3006      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3007      *                                  matrices are not NED frame valid.
3008      */
3009     public static void estimateKinematics(
3010             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3011             final double oldVn, final double oldVe, final double oldVd,
3012             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
3013         estimateKinematics(timeInterval, frame.getCoordinateTransformation(), oldC,
3014                 frame.getVn(), frame.getVe(), frame.getVd(), oldVn, oldVe, oldVd,
3015                 frame.getLatitude(), frame.getHeight(), oldLatitude, oldHeight, result);
3016     }
3017 
3018     /**
3019      * Estimates body kinematics (specific force applied to a body and its angular rates)
3020      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3021      *
3022      * @param timeInterval time interval between epochs.
3023      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3024      * @param oldC         previous body-to-NED coordinate transformation.
3025      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3026      *                     along north, east, and down and expressed in meters per second (m/s).
3027      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3028      *                     along north, east, and down and expressed in meters per second (m/s).
3029      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3030      *                     along north, east, and down and expressed in meters per second (m/s).
3031      * @param oldLatitude  previous latitude expressed in radians (rad).
3032      * @param oldHeight    previous height expressed in meters (m).
3033      * @param result       instance where estimated body kinematics will be stored.
3034      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3035      *                                  matrices are not NED frame valid.
3036      */
3037     public static void estimateKinematics(
3038             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3039             final double oldVn, final double oldVe, final double oldVd,
3040             final double oldLatitude, final double oldHeight, final BodyKinematics result) {
3041         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight, result);
3042     }
3043 
3044     /**
3045      * Estimates body kinematics (specific force applied to a body and its angular rates)
3046      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3047      *
3048      * @param timeInterval time interval between epochs expressed in seconds (s).
3049      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3050      * @param oldC         previous body-to-NED coordinate transformation.
3051      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3052      *                     down.
3053      * @param oldLatitude  previous latitude expressed in radians (rad).
3054      * @param oldHeight    previous height expressed in meters (m).
3055      * @param result       instance where estimated body kinematics will be stored.
3056      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3057      *                                  matrices are not NED frame valid.
3058      */
3059     public static void estimateKinematics(
3060             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3061             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight,
3062             final BodyKinematics result) {
3063         estimateKinematics(timeInterval, frame, oldC, oldVelocity.getVn(), oldVelocity.getVe(), oldVelocity.getVd(),
3064                 oldLatitude, oldHeight, result);
3065     }
3066 
3067     /**
3068      * Estimates body kinematics (specific force applied to a body and its angular rates)
3069      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3070      *
3071      * @param timeInterval time interval between epochs.
3072      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3073      * @param oldC         previous body-to-NED coordinate transformation.
3074      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3075      *                     down.
3076      * @param oldLatitude  previous latitude expressed in radians (rad).
3077      * @param oldHeight    previous height expressed in meters (m).
3078      * @param result       instance where estimated body kinematics will be stored.
3079      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3080      *                                  matrices are not NED frame valid.
3081      */
3082     public static void estimateKinematics(
3083             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3084             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight,
3085             final BodyKinematics result) {
3086         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
3087     }
3088 
3089     /**
3090      * Estimates body kinematics (specific force applied to a body and its angular rates)
3091      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3092      *
3093      * @param timeInterval time interval between epochs expressed in seconds (s).
3094      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3095      * @param oldC         previous body-to-NED coordinate transformation.
3096      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3097      *                     down.
3098      * @param oldLatitude  previous latitude.
3099      * @param oldHeight    previous height.
3100      * @param result       instance where estimated body kinematics will be stored.
3101      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3102      *                                  matrices are not NED frame valid.
3103      */
3104     public static void estimateKinematics(
3105             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3106             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight,
3107             final BodyKinematics result) {
3108         estimateKinematics(timeInterval, frame, oldC, oldVelocity,
3109                 convertAngle(oldLatitude), convertDistance(oldHeight), result);
3110     }
3111 
3112     /**
3113      * Estimates body kinematics (specific force applied to a body and its angular rates)
3114      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3115      *
3116      * @param timeInterval time interval between epochs.
3117      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3118      * @param oldC         previous body-to-NED coordinate transformation.
3119      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3120      *                     down.
3121      * @param oldLatitude  previous latitude.
3122      * @param oldHeight    previous height.
3123      * @param result       instance where estimated body kinematics will be stored.
3124      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3125      *                                  matrices are not NED frame valid.
3126      */
3127     public static void estimateKinematics(
3128             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3129             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight,
3130             final BodyKinematics result) {
3131         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
3132     }
3133 
3134     /**
3135      * Estimates body kinematics (specific force applied to a body and its angular rates)
3136      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3137      *
3138      * @param timeInterval time interval between epochs expressed in seconds (s).
3139      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3140      * @param oldC         previous body-to-NED coordinate transformation.
3141      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3142      *                     along north, east, and down and expressed in meters per second (m/s).
3143      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3144      *                     along north, east, and down and expressed in meters per second (m/s).
3145      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3146      *                     along north, east, and down and expressed in meters per second (m/s).
3147      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3148      * @param result       instance where estimated body kinematics will be stored.
3149      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3150      *                                  matrices are not NED frame valid.
3151      */
3152     public static void estimateKinematics(
3153             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3154             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition,
3155             final BodyKinematics result) {
3156         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd,
3157                 oldPosition.getLatitude(), oldPosition.getHeight(), result);
3158     }
3159 
3160     /**
3161      * Estimates body kinematics (specific force applied to a body and its angular rates)
3162      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3163      *
3164      * @param timeInterval time interval between epochs.
3165      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3166      * @param oldC         previous body-to-NED coordinate transformation.
3167      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3168      *                     along north, east, and down and expressed in meters per second (m/s).
3169      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3170      *                     along north, east, and down and expressed in meters per second (m/s).
3171      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3172      *                     along north, east, and down and expressed in meters per second (m/s).
3173      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3174      * @param result       instance where estimated body kinematics will be stored.
3175      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3176      *                                  matrices are not NED frame valid.
3177      */
3178     public static void estimateKinematics(
3179             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3180             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition,
3181             final BodyKinematics result) {
3182         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
3183     }
3184 
3185     /**
3186      * Estimates body kinematics (specific force applied to a body and its angular rates)
3187      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3188      *
3189      * @param timeInterval time interval between epochs expressed in seconds (s).
3190      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3191      * @param oldC         previous body-to-NED coordinate transformation.
3192      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3193      *                     along north, east, and down.
3194      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3195      *                     along north, east, and down.
3196      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3197      *                     along north, east, and down.
3198      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3199      * @param result       instance where estimated body kinematics will be stored.
3200      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3201      *                                  matrices are not NED frame valid.
3202      */
3203     public static void estimateKinematics(
3204             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3205             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition,
3206             final BodyKinematics result) {
3207         estimateKinematics(timeInterval, frame, oldC, convertSpeed(oldVn), convertSpeed(oldVe), convertSpeed(oldVd),
3208                 oldPosition, result);
3209     }
3210 
3211     /**
3212      * Estimates body kinematics (specific force applied to a body and its angular rates)
3213      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3214      *
3215      * @param timeInterval time interval between epochs expressed in seconds (s).
3216      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3217      * @param oldC         previous body-to-NED coordinate transformation.
3218      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3219      *                     along north, east, and down.
3220      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3221      *                     along north, east, and down.
3222      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3223      *                     along north, east, and down.
3224      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3225      * @param result       instance where estimated body kinematics will be stored.
3226      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3227      *                                  matrices are not NED frame valid.
3228      */
3229     public static void estimateKinematics(
3230             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3231             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition,
3232             final BodyKinematics result) {
3233         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
3234     }
3235 
3236     /**
3237      * Estimates body kinematics (specific force applied to a body and its angular rates)
3238      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3239      *
3240      * @param timeInterval time interval between epochs expressed in seconds (s).
3241      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3242      * @param oldC         previous body-to-NED coordinate transformation.
3243      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3244      *                     down.
3245      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3246      * @param result       instance where estimated body kinematics will be stored.
3247      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3248      *                                  matrices are not NED frame valid.
3249      */
3250     public static void estimateKinematics(
3251             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3252             final NEDVelocity oldVelocity, final NEDPosition oldPosition, final BodyKinematics result) {
3253         estimateKinematics(timeInterval, frame, oldC, oldVelocity.getVn(), oldVelocity.getVe(), oldVelocity.getVd(),
3254                 oldPosition, result);
3255     }
3256 
3257     /**
3258      * Estimates body kinematics (specific force applied to a body and its angular rates)
3259      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3260      *
3261      * @param timeInterval time interval between epochs.
3262      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3263      * @param oldC         previous body-to-NED coordinate transformation.
3264      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3265      *                     down.
3266      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
3267      * @param result       instance where estimated body kinematics will be stored.
3268      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3269      *                                  matrices are not NED frame valid.
3270      */
3271     public static void estimateKinematics(
3272             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
3273             final NEDVelocity oldVelocity, final NEDPosition oldPosition, final BodyKinematics result) {
3274         estimateKinematics(convertTime(timeInterval), frame, oldC, oldVelocity, oldPosition, result);
3275     }
3276 
3277     /**
3278      * Estimates body kinematics (specific force applied to a body and its angular rates)
3279      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3280      *
3281      * @param timeInterval time interval between epochs expressed in seconds (s).
3282      * @param c            body-to-NED coordinate transformation.
3283      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3284      *                     north, east, and down and expressed in meters per second (m/s).
3285      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3286      *                     north, east, and down and expressed in meters per second (m/s).
3287      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3288      *                     north, east, and down and expressed in meters per second (m/s).
3289      * @param latitude     current latitude expressed in radians (rad).
3290      * @param height       current height expressed in meters (m).
3291      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3292      * @param result       instance where estimated body kinematics will be stored.
3293      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3294      *                                  matrices are not NED frame valid.
3295      */
3296     public static void estimateKinematics(
3297             final double timeInterval, final CoordinateTransformation c,
3298             final double vn, final double ve, final double vd, final double latitude, final double height,
3299             final NEDFrame oldFrame, final BodyKinematics result) {
3300         estimateKinematics(timeInterval, c, oldFrame.getCoordinateTransformation(), vn, ve, vd,
3301                 oldFrame.getVn(), oldFrame.getVe(), oldFrame.getVd(), latitude, height,
3302                 oldFrame.getLatitude(), oldFrame.getHeight(), result);
3303     }
3304 
3305     /**
3306      * Estimates body kinematics (specific force applied to a body and its angular rates)
3307      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3308      *
3309      * @param timeInterval time interval between epochs.
3310      * @param c            body-to-NED coordinate transformation.
3311      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3312      *                     north, east, and down and expressed in meters per second (m/s).
3313      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3314      *                     north, east, and down and expressed in meters per second (m/s).
3315      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3316      *                     north, east, and down and expressed in meters per second (m/s).
3317      * @param latitude     current latitude expressed in radians (rad).
3318      * @param height       current height expressed in meters (m).
3319      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3320      * @param result       instance where estimated body kinematics will be stored.
3321      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3322      *                                  matrices are not NED frame valid.
3323      */
3324     public static void estimateKinematics(
3325             final Time timeInterval, final CoordinateTransformation c,
3326             final double vn, final double ve, final double vd, final double latitude, final double height,
3327             final NEDFrame oldFrame, final BodyKinematics result) {
3328         estimateKinematics(convertTime(timeInterval), c, vn, ve, vd, latitude, height, oldFrame, result);
3329     }
3330 
3331     /**
3332      * Estimates body kinematics (specific force applied to a body and its angular rates)
3333      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3334      *
3335      * @param timeInterval time interval between epochs expressed in seconds (s).
3336      * @param c            body-to-NED coordinate transformation.
3337      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3338      * @param latitude     current latitude expressed in radians (rad).
3339      * @param height       current height expressed in meters (m).
3340      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3341      * @param result       instance where estimated body kinematics will be stored.
3342      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3343      *                                  matrices are not NED frame valid.
3344      */
3345     public static void estimateKinematics(
3346             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3347             final double latitude, final double height, final NEDFrame oldFrame, final BodyKinematics result) {
3348         estimateKinematics(timeInterval, c, velocity.getVn(), velocity.getVe(), velocity.getVd(), latitude, height,
3349                 oldFrame, result);
3350     }
3351 
3352     /**
3353      * Estimates body kinematics (specific force applied to a body and its angular rates)
3354      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3355      *
3356      * @param timeInterval time interval between epochs.
3357      * @param c            body-to-NED coordinate transformation.
3358      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3359      * @param latitude     current latitude expressed in radians (rad).
3360      * @param height       current height expressed in meters (m).
3361      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3362      * @param result       instance where estimated body kinematics will be stored.
3363      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3364      *                                  matrices are not NED frame valid.
3365      */
3366     public static void estimateKinematics(
3367             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3368             final double latitude, final double height, final NEDFrame oldFrame, final BodyKinematics result) {
3369         estimateKinematics(convertTime(timeInterval), c, velocity, latitude, height, oldFrame, result);
3370     }
3371 
3372     /**
3373      * Estimates body kinematics (specific force applied to a body and its angular rates)
3374      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3375      *
3376      * @param timeInterval time interval between epochs expressed in seconds (s).
3377      * @param c            body-to-NED coordinate transformation.
3378      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3379      * @param latitude     current latitude.
3380      * @param height       current height.
3381      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3382      * @param result       instance where estimated body kinematics will be stored.
3383      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3384      *                                  matrices are not NED frame valid.
3385      */
3386     public static void estimateKinematics(
3387             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3388             final Angle latitude, final Distance height, final NEDFrame oldFrame, final BodyKinematics result) {
3389         estimateKinematics(timeInterval, c, velocity, convertAngle(latitude), convertDistance(height), oldFrame,
3390                 result);
3391     }
3392 
3393     /**
3394      * Estimates body kinematics (specific force applied to a body and its angular rates)
3395      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3396      *
3397      * @param timeInterval time interval between epochs.
3398      * @param c            body-to-NED coordinate transformation.
3399      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3400      * @param latitude     current latitude.
3401      * @param height       current height.
3402      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3403      * @param result       instance where estimated body kinematics will be stored.
3404      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3405      *                                  matrices are not NED frame valid.
3406      */
3407     public static void estimateKinematics(
3408             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3409             final Angle latitude, final Distance height, final NEDFrame oldFrame, final BodyKinematics result) {
3410         estimateKinematics(convertTime(timeInterval), c, velocity, latitude, height, oldFrame, result);
3411     }
3412 
3413     /**
3414      * Estimates body kinematics (specific force applied to a body and its angular rates)
3415      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3416      *
3417      * @param timeInterval time interval between epochs expressed in seconds (s).
3418      * @param c            body-to-NED coordinate transformation.
3419      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3420      *                     north, east, and down and expressed in meters per second (m/s).
3421      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3422      *                     north, east, and down and expressed in meters per second (m/s).
3423      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3424      *                     north, east, and down and expressed in meters per second (m/s).
3425      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3426      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3427      * @param result       instance where estimated body kinematics will be stored.
3428      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3429      *                                  matrices are not NED frame valid.
3430      */
3431     public static void estimateKinematics(
3432             final double timeInterval, final CoordinateTransformation c,
3433             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame,
3434             final BodyKinematics result) {
3435         estimateKinematics(timeInterval, c, vn, ve, vd, position.getLatitude(), position.getHeight(), oldFrame, result);
3436     }
3437 
3438     /**
3439      * Estimates body kinematics (specific force applied to a body and its angular rates)
3440      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3441      *
3442      * @param timeInterval time interval between epochs.
3443      * @param c            body-to-NED coordinate transformation.
3444      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3445      *                     north, east, and down and expressed in meters per second (m/s).
3446      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3447      *                     north, east, and down and expressed in meters per second (m/s).
3448      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3449      *                     north, east, and down and expressed in meters per second (m/s).
3450      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3451      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3452      * @param result       instance where estimated body kinematics will be stored.
3453      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3454      *                                  matrices are not NED frame valid.
3455      */
3456     public static void estimateKinematics(
3457             final Time timeInterval, final CoordinateTransformation c,
3458             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame,
3459             final BodyKinematics result) {
3460         estimateKinematics(convertTime(timeInterval), c, vn, ve, vd, position, oldFrame, result);
3461     }
3462 
3463     /**
3464      * Estimates body kinematics (specific force applied to a body and its angular rates)
3465      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3466      *
3467      * @param timeInterval time interval between epochs expressed in seconds (s).
3468      * @param c            body-to-NED coordinate transformation.
3469      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3470      *                     north, east, and down.
3471      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3472      *                     north, east, and down.
3473      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3474      *                     north, east, and down.
3475      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3476      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3477      * @param result       instance where estimated body kinematics will be stored.
3478      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3479      *                                  matrices are not NED frame valid.
3480      */
3481     public static void estimateKinematics(
3482             final double timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
3483             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
3484         estimateKinematics(timeInterval, c, convertSpeed(vn), convertSpeed(ve), convertSpeed(vd), position, oldFrame,
3485                 result);
3486     }
3487 
3488     /**
3489      * Estimates body kinematics (specific force applied to a body and its angular rates)
3490      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3491      *
3492      * @param timeInterval time interval between epochs.
3493      * @param c            body-to-NED coordinate transformation.
3494      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3495      *                     north, east, and down.
3496      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3497      *                     north, east, and down.
3498      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3499      *                     north, east, and down.
3500      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3501      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3502      * @param result       instance where estimated body kinematics will be stored.
3503      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3504      *                                  matrices are not NED frame valid.
3505      */
3506     public static void estimateKinematics(
3507             final Time timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
3508             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
3509         estimateKinematics(convertTime(timeInterval), c, vn, ve, vd, position, oldFrame, result);
3510     }
3511 
3512     /**
3513      * Estimates body kinematics (specific force applied to a body and its angular rates)
3514      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3515      *
3516      * @param timeInterval time interval between epochs expressed in seconds (s).
3517      * @param c            body-to-NED coordinate transformation.
3518      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3519      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3520      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3521      * @param result       instance where estimated body kinematics will be stored.
3522      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3523      *                                  matrices are not NED frame valid.
3524      */
3525     public static void estimateKinematics(
3526             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3527             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
3528         estimateKinematics(timeInterval, c, velocity, position.getLatitude(), position.getHeight(), oldFrame, result);
3529     }
3530 
3531     /**
3532      * Estimates body kinematics (specific force applied to a body and its angular rates)
3533      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3534      *
3535      * @param timeInterval time interval between epochs.
3536      * @param c            body-to-NED coordinate transformation.
3537      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3538      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
3539      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3540      * @param result       instance where estimated body kinematics will be stored.
3541      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3542      *                                  matrices are not NED frame valid.
3543      */
3544     public static void estimateKinematics(
3545             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
3546             final NEDPosition position, final NEDFrame oldFrame, final BodyKinematics result) {
3547         estimateKinematics(convertTime(timeInterval), c, velocity, position, oldFrame, result);
3548     }
3549 
3550     /**
3551      * Estimates body kinematics (specific force applied to a body and its angular rates)
3552      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3553      *
3554      * @param timeInterval time interval between epochs expressed in seconds (s).
3555      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3556      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3557      * @param result       instance where estimated body kinematics will be stored.
3558      * @throws IllegalArgumentException if provided time interval is negative.
3559      */
3560     public static void estimateKinematics(
3561             final double timeInterval, final NEDFrame frame, final NEDFrame oldFrame, final BodyKinematics result) {
3562         estimateKinematics(timeInterval, frame.getCoordinateTransformation(),
3563                 frame.getVn(), frame.getVe(), frame.getVd(), frame.getLatitude(), frame.getHeight(), oldFrame, result);
3564     }
3565 
3566     /**
3567      * Estimates body kinematics (specific force applied to a body and its angular rates)
3568      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3569      *
3570      * @param timeInterval time interval between epochs.
3571      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
3572      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
3573      * @param result       instance where estimated body kinematics will be stored.
3574      * @throws IllegalArgumentException if provided time interval is negative.
3575      */
3576     public static void estimateKinematics(
3577             final Time timeInterval, final NEDFrame frame, final NEDFrame oldFrame, final BodyKinematics result) {
3578         estimateKinematics(convertTime(timeInterval), frame, oldFrame, result);
3579     }
3580 
3581     /**
3582      * Estimates body kinematics (specific force applied to a body and its angular rates)
3583      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3584      *
3585      * @param timeInterval time interval between epochs expressed in seconds (s).
3586      * @param c            body-to-NED coordinate transformation.
3587      * @param oldC         previous body-to-NED coordinate transformation.
3588      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3589      *                     north, east, and down.
3590      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3591      *                     north, east, and down.
3592      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3593      *                     north, east, and down.
3594      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3595      *                     along north, east, and down.
3596      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3597      *                     along north, east, and down.
3598      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3599      *                     along north, east, and down.
3600      * @param latitude     current latitude expressed in radians (rad).
3601      * @param height       current height expressed in meters (m).
3602      * @param oldLatitude  previous latitude expressed in radians (rad).
3603      * @param oldHeight    previous height expressed in meters (m).
3604      * @param result       instance where estimated body kinematics will be stored.
3605      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3606      *                                  matrices are not NED frame valid.
3607      */
3608     public static void estimateKinematics(
3609             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3610             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
3611             final double latitude, final double height, final double oldLatitude, final double oldHeight,
3612             final BodyKinematics result) {
3613         estimateKinematics(timeInterval, c, oldC, convertSpeed(vn), convertSpeed(ve), convertSpeed(vd),
3614                 convertSpeed(oldVn), convertSpeed(oldVe), convertSpeed(oldVd), latitude, height, oldLatitude, oldHeight,
3615                 result);
3616     }
3617 
3618     /**
3619      * Estimates body kinematics (specific force applied to a body and its angular rates)
3620      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3621      *
3622      * @param timeInterval time interval between epochs.
3623      * @param c            body-to-NED coordinate transformation.
3624      * @param oldC         previous body-to-NED coordinate transformation.
3625      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3626      *                     north, east, and down.
3627      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3628      *                     north, east, and down.
3629      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3630      *                     north, east, and down.
3631      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3632      *                     along north, east, and down.
3633      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3634      *                     along north, east, and down.
3635      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3636      *                     along north, east, and down.
3637      * @param latitude     current latitude expressed in radians (rad).
3638      * @param height       current height expressed in meters (m).
3639      * @param oldLatitude  previous latitude expressed in radians (rad).
3640      * @param oldHeight    previous height expressed in meters (m).
3641      * @param result       instance where estimated body kinematics will be stored.
3642      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3643      *                                  matrices are not NED frame valid.
3644      */
3645     public static void estimateKinematics(
3646             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3647             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
3648             final double latitude, final double height, final double oldLatitude, final double oldHeight,
3649             final BodyKinematics result) {
3650         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3651                 oldLatitude, oldHeight, result);
3652     }
3653 
3654     /**
3655      * Estimates body kinematics (specific force applied to a body and its angular rates)
3656      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3657      *
3658      * @param timeInterval time interval between epochs expressed in seconds (s).
3659      * @param c            body-to-NED coordinate transformation.
3660      * @param oldC         previous body-to-NED coordinate transformation.
3661      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3662      *                     north, east, and down and expressed in meters per second (m/s).
3663      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3664      *                     north, east, and down and expressed in meters per second (m/s).
3665      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3666      *                     north, east, and down and expressed in meters per second (m/s).
3667      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3668      *                     along north, east, and down and expressed in meters per second (m/s).
3669      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3670      *                     along north, east, and down and expressed in meters per second (m/s).
3671      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3672      *                     along north, east, and down and expressed in meters per second (m/s).
3673      * @param latitude     current latitude.
3674      * @param height       current height expressed in meters (m).
3675      * @param oldLatitude  previous latitude.
3676      * @param oldHeight    previous height expressed in meters (m).
3677      * @param result       instance where estimated body kinematics will be stored.
3678      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3679      *                                  matrices are not NED frame valid.
3680      */
3681     public static void estimateKinematics(
3682             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3683             final double vn, final double ve, final double vd,
3684             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
3685             final Angle oldLatitude, final double oldHeight, final BodyKinematics result) {
3686         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, convertAngle(latitude), height,
3687                 convertAngle(oldLatitude), oldHeight, result);
3688     }
3689 
3690     /**
3691      * Estimates body kinematics (specific force applied to a body and its angular rates)
3692      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3693      *
3694      * @param timeInterval time interval between epochs.
3695      * @param c            body-to-NED coordinate transformation.
3696      * @param oldC         previous body-to-NED coordinate transformation.
3697      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3698      *                     north, east, and down and expressed in meters per second (m/s).
3699      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3700      *                     north, east, and down and expressed in meters per second (m/s).
3701      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3702      *                     north, east, and down and expressed in meters per second (m/s).
3703      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3704      *                     along north, east, and down and expressed in meters per second (m/s).
3705      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3706      *                     along north, east, and down and expressed in meters per second (m/s).
3707      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3708      *                     along north, east, and down and expressed in meters per second (m/s).
3709      * @param latitude     current latitude.
3710      * @param height       current height expressed in meters (m).
3711      * @param oldLatitude  previous latitude.
3712      * @param oldHeight    previous height expressed in meters (m).
3713      * @param result       instance where estimated body kinematics will be stored.
3714      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3715      *                                  matrices are not NED frame valid.
3716      */
3717     public static void estimateKinematics(
3718             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3719             final double vn, final double ve, final double vd,
3720             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
3721             final Angle oldLatitude, final double oldHeight, final BodyKinematics result) {
3722         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3723                 oldLatitude, oldHeight, result);
3724     }
3725 
3726     /**
3727      * Estimates body kinematics (specific force applied to a body and its angular rates)
3728      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3729      *
3730      * @param timeInterval time interval between epochs expressed in seconds (s).
3731      * @param c            body-to-NED coordinate transformation.
3732      * @param oldC         previous body-to-NED coordinate transformation.
3733      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3734      *                     north, east, and down and expressed in meters per second (m/s).
3735      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3736      *                     north, east, and down and expressed in meters per second (m/s).
3737      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3738      *                     north, east, and down and expressed in meters per second (m/s).
3739      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3740      *                     along north, east, and down and expressed in meters per second (m/s).
3741      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3742      *                     along north, east, and down and expressed in meters per second (m/s).
3743      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3744      *                     along north, east, and down and expressed in meters per second (m/s).
3745      * @param latitude     current latitude expressed in radians (rad).
3746      * @param height       current height.
3747      * @param oldLatitude  previous latitude expressed in radians (rad).
3748      * @param oldHeight    previous height.
3749      * @param result       instance where estimated body kinematics will be stored.
3750      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3751      *                                  matrices are not NED frame valid.
3752      */
3753     public static void estimateKinematics(
3754             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3755             final double vn, final double ve, final double vd,
3756             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
3757             final double oldLatitude, final Distance oldHeight, final BodyKinematics result) {
3758         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, convertDistance(height),
3759                 oldLatitude, convertDistance(oldHeight), result);
3760     }
3761 
3762     /**
3763      * Estimates body kinematics (specific force applied to a body and its angular rates)
3764      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3765      *
3766      * @param timeInterval time interval between epochs.
3767      * @param c            body-to-NED coordinate transformation.
3768      * @param oldC         previous body-to-NED coordinate transformation.
3769      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3770      *                     north, east, and down and expressed in meters per second (m/s).
3771      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3772      *                     north, east, and down and expressed in meters per second (m/s).
3773      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3774      *                     north, east, and down and expressed in meters per second (m/s).
3775      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3776      *                     along north, east, and down and expressed in meters per second (m/s).
3777      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3778      *                     along north, east, and down and expressed in meters per second (m/s).
3779      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3780      *                     along north, east, and down and expressed in meters per second (m/s).
3781      * @param latitude     current latitude expressed in radians (rad).
3782      * @param height       current height.
3783      * @param oldLatitude  previous latitude expressed in radians (rad).
3784      * @param oldHeight    previous height.
3785      * @param result       instance where estimated body kinematics will be stored.
3786      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3787      *                                  matrices are not NED frame valid.
3788      */
3789     public static void estimateKinematics(
3790             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3791             final double vn, final double ve, final double vd,
3792             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
3793             final double oldLatitude, final Distance oldHeight, final BodyKinematics result) {
3794         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3795                 oldLatitude, oldHeight, result);
3796     }
3797 
3798     /**
3799      * Estimates body kinematics (specific force applied to a body and its angular rates)
3800      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3801      *
3802      * @param timeInterval time interval between epochs expressed in seconds (s).
3803      * @param c            body-to-NED coordinate transformation.
3804      * @param oldC         previous body-to-NED coordinate transformation.
3805      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3806      *                     north, east, and down.
3807      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3808      *                     north, east, and down.
3809      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3810      *                     north, east, and down.
3811      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3812      *                     along north, east, and down.
3813      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3814      *                     along north, east, and down.
3815      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3816      *                     along north, east, and down.
3817      * @param latitude     current latitude.
3818      * @param height       current height.
3819      * @param oldLatitude  previous latitude.
3820      * @param oldHeight    previous height.
3821      * @param result       instance where estimated body kinematics will be stored.
3822      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3823      *                                  matrices are not NED frame valid.
3824      */
3825     public static void estimateKinematics(
3826             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3827             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
3828             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight,
3829             final BodyKinematics result) {
3830         estimateKinematics(timeInterval, c, oldC, convertSpeed(vn), convertSpeed(ve), convertSpeed(vd),
3831                 convertSpeed(oldVn), convertSpeed(oldVe), convertSpeed(oldVd),
3832                 convertAngle(latitude), convertDistance(height), convertAngle(oldLatitude), convertDistance(oldHeight),
3833                 result);
3834     }
3835 
3836     /**
3837      * Estimates body kinematics (specific force applied to a body and its angular rates)
3838      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3839      *
3840      * @param timeInterval time interval between epochs.
3841      * @param c            body-to-NED coordinate transformation.
3842      * @param oldC         previous body-to-NED coordinate transformation.
3843      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3844      *                     north, east, and down.
3845      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3846      *                     north, east, and down.
3847      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3848      *                     north, east, and down.
3849      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3850      *                     along north, east, and down.
3851      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3852      *                     along north, east, and down.
3853      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3854      *                     along north, east, and down.
3855      * @param latitude     current latitude.
3856      * @param height       current height.
3857      * @param oldLatitude  previous latitude.
3858      * @param oldHeight    previous height.
3859      * @param result       instance where estimated body kinematics will be stored.
3860      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3861      *                                  matrices are not NED frame valid.
3862      */
3863     public static void estimateKinematics(
3864             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3865             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
3866             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight,
3867             final BodyKinematics result) {
3868         estimateKinematics(convertTime(timeInterval), c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3869                 oldLatitude, oldHeight, result);
3870     }
3871 
3872     /**
3873      * Estimates body kinematics (specific force applied to a body and its angular rates)
3874      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3875      *
3876      * @param timeInterval time interval between epochs expressed in seconds (s).
3877      * @param c            body-to-NED coordinate transformation.
3878      * @param oldC         previous body-to-NED coordinate transformation.
3879      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3880      *                     north, east, and down and expressed in meters per second (m/s).
3881      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3882      *                     north, east, and down and expressed in meters per second (m/s).
3883      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3884      *                     north, east, and down and expressed in meters per second (m/s).
3885      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3886      *                     along north, east, and down and expressed in meters per second (m/s).
3887      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3888      *                     along north, east, and down and expressed in meters per second (m/s).
3889      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3890      *                     along north, east, and down and expressed in meters per second (m/s).
3891      * @param latitude     current latitude expressed in radians (rad).
3892      * @param height       current height expressed in meters (m).
3893      * @param oldLatitude  previous latitude expressed in radians (rad).
3894      * @param oldHeight    previous height expressed in meters (m).
3895      * @return a new body kinematics instance.
3896      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3897      *                                  matrices are not NED frame valid.
3898      */
3899     public static BodyKinematics estimateKinematicsAndReturnNew(
3900             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3901             final double vn, final double ve, final double vd,
3902             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
3903             final double oldLatitude, final double oldHeight) {
3904         final var result = new BodyKinematics();
3905         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3906                 oldLatitude, oldHeight, result);
3907         return result;
3908     }
3909 
3910     /**
3911      * Estimates body kinematics (specific force applied to a body and its angular rates)
3912      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3913      *
3914      * @param timeInterval time interval between epochs.
3915      * @param c            body-to-NED coordinate transformation.
3916      * @param oldC         previous body-to-NED coordinate transformation.
3917      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
3918      *                     north, east, and down and expressed in meters per second (m/s).
3919      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
3920      *                     north, east, and down and expressed in meters per second (m/s).
3921      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
3922      *                     north, east, and down and expressed in meters per second (m/s).
3923      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
3924      *                     along north, east, and down and expressed in meters per second (m/s).
3925      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
3926      *                     along north, east, and down and expressed in meters per second (m/s).
3927      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
3928      *                     along north, east, and down and expressed in meters per second (m/s).
3929      * @param latitude     current latitude expressed in radians (rad).
3930      * @param height       current height expressed in meters (m).
3931      * @param oldLatitude  previous latitude expressed in radians (rad).
3932      * @param oldHeight    previous height expressed in meters (m).
3933      * @return a new body kinematics instance.
3934      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3935      *                                  matrices are not NED frame valid.
3936      */
3937     public static BodyKinematics estimateKinematicsAndReturnNew(
3938             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3939             final double vn, final double ve, final double vd,
3940             final double oldVn, final double oldVe, final double oldVd, final double latitude, final double height,
3941             final double oldLatitude, final double oldHeight) {
3942         final var result = new BodyKinematics();
3943         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
3944                 oldLatitude, oldHeight, result);
3945         return result;
3946     }
3947 
3948     /**
3949      * Estimates body kinematics (specific force applied to a body and its angular rates)
3950      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3951      *
3952      * @param timeInterval time interval between epochs expressed in seconds (s).
3953      * @param c            body-to-NED coordinate transformation.
3954      * @param oldC         previous body-to-NED coordinate transformation.
3955      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3956      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3957      *                     down.
3958      * @param latitude     current latitude expressed in radians (rad).
3959      * @param height       current height expressed in meters (m).
3960      * @param oldLatitude  previous latitude expressed in radians (rad).
3961      * @param oldHeight    previous height expressed in meters (m).
3962      * @return a new body kinematics instance.
3963      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3964      *                                  matrices are not NED frame valid.
3965      */
3966     public static BodyKinematics estimateKinematicsAndReturnNew(
3967             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3968             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
3969             final double oldLatitude, final double oldHeight) {
3970         final var result = new BodyKinematics();
3971         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
3972                 result);
3973         return result;
3974     }
3975 
3976     /**
3977      * Estimates body kinematics (specific force applied to a body and its angular rates)
3978      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
3979      *
3980      * @param timeInterval time interval between epochs.
3981      * @param c            body-to-NED coordinate transformation.
3982      * @param oldC         previous body-to-NED coordinate transformation.
3983      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
3984      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
3985      *                     down.
3986      * @param latitude     current latitude expressed in radians (rad).
3987      * @param height       current height expressed in meters (m).
3988      * @param oldLatitude  previous latitude expressed in radians (rad).
3989      * @param oldHeight    previous height expressed in meters (m).
3990      * @return a new body kinematics instance.
3991      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
3992      *                                  matrices are not NED frame valid.
3993      */
3994     public static BodyKinematics estimateKinematicsAndReturnNew(
3995             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
3996             final NEDVelocity velocity, final NEDVelocity oldVelocity, final double latitude, final double height,
3997             final double oldLatitude, final double oldHeight) {
3998         final var result = new BodyKinematics();
3999         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
4000                 result);
4001         return result;
4002     }
4003 
4004     /**
4005      * Estimates body kinematics (specific force applied to a body and its angular rates)
4006      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4007      *
4008      * @param timeInterval time interval between epochs expressed in seconds (s).
4009      * @param c            body-to-NED coordinate transformation.
4010      * @param oldC         previous body-to-NED coordinate transformation.
4011      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4012      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4013      *                     down.
4014      * @param latitude     current latitude.
4015      * @param height       current height.
4016      * @param oldLatitude  previous latitude.
4017      * @param oldHeight    previous height.
4018      * @return a new body kinematics instance.
4019      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4020      *                                  matrices are not NED frame valid.
4021      */
4022     public static BodyKinematics estimateKinematicsAndReturnNew(
4023             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4024             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
4025             final Angle oldLatitude, final Distance oldHeight) {
4026         final var result = new BodyKinematics();
4027         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
4028                 result);
4029         return result;
4030     }
4031 
4032     /**
4033      * Estimates body kinematics (specific force applied to a body and its angular rates)
4034      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4035      *
4036      * @param timeInterval time interval between epochs.
4037      * @param c            body-to-NED coordinate transformation.
4038      * @param oldC         previous body-to-NED coordinate transformation.
4039      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4040      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4041      *                     down.
4042      * @param latitude     current latitude.
4043      * @param height       current height.
4044      * @param oldLatitude  previous latitude.
4045      * @param oldHeight    previous height.
4046      * @return a new body kinematics instance.
4047      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4048      *                                  matrices are not NED frame valid.
4049      */
4050     public static BodyKinematics estimateKinematicsAndReturnNew(
4051             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4052             final NEDVelocity velocity, final NEDVelocity oldVelocity, final Angle latitude, final Distance height,
4053             final Angle oldLatitude, final Distance oldHeight) {
4054         final var result = new BodyKinematics();
4055         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, latitude, height, oldLatitude, oldHeight,
4056                 result);
4057         return result;
4058     }
4059 
4060     /**
4061      * Estimates body kinematics (specific force applied to a body and its angular rates)
4062      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4063      *
4064      * @param timeInterval time interval between epochs expressed in seconds (s).
4065      * @param c            body-to-NED coordinate transformation.
4066      * @param oldC         previous body-to-NED coordinate transformation.
4067      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4068      *                     north, east, and down and expressed in meters per second (m/s).
4069      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4070      *                     north, east, and down and expressed in meters per second (m/s).
4071      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4072      *                     north, east, and down and expressed in meters per second (m/s).
4073      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4074      *                     along north, east, and down and expressed in meters per second (m/s).
4075      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4076      *                     along north, east, and down and expressed in meters per second (m/s).
4077      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4078      *                     along north, east, and down and expressed in meters per second (m/s).
4079      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4080      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4081      * @return a new body kinematics instance.
4082      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4083      *                                  matrices are not NED frame valid.
4084      */
4085     public static BodyKinematics estimateKinematicsAndReturnNew(
4086             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4087             final double vn, final double ve, final double vd,
4088             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
4089             final NEDPosition oldPosition) {
4090         final var result = new BodyKinematics();
4091         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
4092         return result;
4093     }
4094 
4095     /**
4096      * Estimates body kinematics (specific force applied to a body and its angular rates)
4097      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4098      *
4099      * @param timeInterval time interval between epochs.
4100      * @param c            body-to-NED coordinate transformation.
4101      * @param oldC         previous body-to-NED coordinate transformation.
4102      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4103      *                     north, east, and down and expressed in meters per second (m/s).
4104      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4105      *                     north, east, and down and expressed in meters per second (m/s).
4106      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4107      *                     north, east, and down and expressed in meters per second (m/s).
4108      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4109      *                     along north, east, and down and expressed in meters per second (m/s).
4110      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4111      *                     along north, east, and down and expressed in meters per second (m/s).
4112      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4113      *                     along north, east, and down and expressed in meters per second (m/s).
4114      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4115      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4116      * @return a new body kinematics instance.
4117      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4118      *                                  matrices are not NED frame valid.
4119      */
4120     public static BodyKinematics estimateKinematicsAndReturnNew(
4121             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4122             final double vn, final double ve, final double vd,
4123             final double oldVn, final double oldVe, final double oldVd, final NEDPosition position,
4124             final NEDPosition oldPosition) {
4125         final var result = new BodyKinematics();
4126         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
4127         return result;
4128     }
4129 
4130     /**
4131      * Estimates body kinematics (specific force applied to a body and its angular rates)
4132      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4133      *
4134      * @param timeInterval time interval between epochs expressed in seconds (s).
4135      * @param c            body-to-NED coordinate transformation.
4136      * @param oldC         previous body-to-NED coordinate transformation.
4137      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4138      *                     north, east, and down.
4139      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4140      *                     north, east, and down.
4141      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4142      *                     north, east, and down.
4143      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4144      *                     along north, east, and down.
4145      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4146      *                     along north, east, and down.
4147      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4148      *                     along north, east, and down.
4149      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4150      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4151      * @return a new body kinematics instance.
4152      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4153      *                                  matrices are not NED frame valid.
4154      */
4155     public static BodyKinematics estimateKinematicsAndReturnNew(
4156             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4157             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
4158             final NEDPosition position, final NEDPosition oldPosition) {
4159         final var result = new BodyKinematics();
4160         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
4161         return result;
4162     }
4163 
4164     /**
4165      * Estimates body kinematics (specific force applied to a body and its angular rates)
4166      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4167      *
4168      * @param timeInterval time interval between epochs.
4169      * @param c            body-to-NED coordinate transformation.
4170      * @param oldC         previous body-to-NED coordinate transformation.
4171      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4172      *                     north, east, and down.
4173      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4174      *                     north, east, and down.
4175      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4176      *                     north, east, and down.
4177      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4178      *                     along north, east, and down.
4179      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4180      *                     along north, east, and down.
4181      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4182      *                     along north, east, and down.
4183      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4184      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4185      * @return a new body kinematics instance.
4186      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4187      *                                  matrices are not NED frame valid.
4188      */
4189     public static BodyKinematics estimateKinematicsAndReturnNew(
4190             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4191             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
4192             final NEDPosition position, final NEDPosition oldPosition) {
4193         final var result = new BodyKinematics();
4194         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, position, oldPosition, result);
4195         return result;
4196     }
4197 
4198     /**
4199      * Estimates body kinematics (specific force applied to a body and its angular rates)
4200      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4201      *
4202      * @param timeInterval time interval between epochs expressed in seconds (s).
4203      * @param c            body-to-NED coordinate transformation.
4204      * @param oldC         previous body-to-NED coordinate transformation.
4205      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4206      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4207      *                     down.
4208      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4209      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4210      * @return a new body kinematics instance.
4211      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4212      *                                  matrices are not NED frame valid.
4213      */
4214     public static BodyKinematics estimateKinematicsAndReturnNew(
4215             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4216             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
4217             final NEDPosition oldPosition) {
4218         final var result = new BodyKinematics();
4219         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition, result);
4220         return result;
4221     }
4222 
4223     /**
4224      * Estimates body kinematics (specific force applied to a body and its angular rates)
4225      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4226      *
4227      * @param timeInterval time interval between epochs.
4228      * @param c            body-to-NED coordinate transformation.
4229      * @param oldC         previous body-to-NED coordinate transformation.
4230      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4231      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4232      *                     down.
4233      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4234      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4235      * @return a new body kinematics instance.
4236      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4237      *                                  matrices are not NED frame valid.
4238      */
4239     public static BodyKinematics estimateKinematicsAndReturnNew(
4240             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4241             final NEDVelocity velocity, final NEDVelocity oldVelocity, final NEDPosition position,
4242             final NEDPosition oldPosition) {
4243         final var result = new BodyKinematics();
4244         estimateKinematics(timeInterval, c, oldC, velocity, oldVelocity, position, oldPosition, result);
4245         return result;
4246     }
4247 
4248     /**
4249      * Estimates body kinematics (specific force applied to a body and its angular rates)
4250      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4251      *
4252      * @param timeInterval time interval between epochs expressed in seconds (s).
4253      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4254      * @param oldC         previous body-to-NED coordinate transformation.
4255      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4256      *                     along north, east, and down and expressed in meters per second (m/s).
4257      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4258      *                     along north, east, and down and expressed in meters per second (m/s).
4259      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4260      *                     along north, east, and down and expressed in meters per second (m/s).
4261      * @param oldLatitude  previous latitude expressed in radians (rad).
4262      * @param oldHeight    previous height expressed in meters (m).
4263      * @return a new body kinematics instance.
4264      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4265      *                                  matrices are not NED frame valid.
4266      */
4267     public static BodyKinematics estimateKinematicsAndReturnNew(
4268             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4269             final double oldVn, final double oldVe, final double oldVd,
4270             final double oldLatitude, final double oldHeight) {
4271         final var result = new BodyKinematics();
4272         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight, result);
4273         return result;
4274     }
4275 
4276     /**
4277      * Estimates body kinematics (specific force applied to a body and its angular rates)
4278      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4279      *
4280      * @param timeInterval time interval between epochs.
4281      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4282      * @param oldC         previous body-to-NED coordinate transformation.
4283      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4284      *                     along north, east, and down and expressed in meters per second (m/s).
4285      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4286      *                     along north, east, and down and expressed in meters per second (m/s).
4287      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4288      *                     along north, east, and down and expressed in meters per second (m/s).
4289      * @param oldLatitude  previous latitude expressed in radians (rad).
4290      * @param oldHeight    previous height expressed in meters (m).
4291      * @return a new body kinematics instance.
4292      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4293      *                                  matrices are not NED frame valid.
4294      */
4295     public static BodyKinematics estimateKinematicsAndReturnNew(
4296             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4297             final double oldVn, final double oldVe, final double oldVd,
4298             final double oldLatitude, final double oldHeight) {
4299         final var result = new BodyKinematics();
4300         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldLatitude, oldHeight, result);
4301         return result;
4302     }
4303 
4304     /**
4305      * Estimates body kinematics (specific force applied to a body and its angular rates)
4306      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4307      *
4308      * @param timeInterval time interval between epochs expressed in seconds (s).
4309      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4310      * @param oldC         previous body-to-NED coordinate transformation.
4311      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4312      *                     down.
4313      * @param oldLatitude  previous latitude expressed in radians (rad).
4314      * @param oldHeight    previous height expressed in meters (m).
4315      * @return a new body kinematics instance.
4316      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4317      *                                  matrices are not NED frame valid.
4318      */
4319     public static BodyKinematics estimateKinematicsAndReturnNew(
4320             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4321             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight) {
4322         final var result = new BodyKinematics();
4323         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
4324         return result;
4325     }
4326 
4327     /**
4328      * Estimates body kinematics (specific force applied to a body and its angular rates)
4329      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4330      *
4331      * @param timeInterval time interval between epochs.
4332      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4333      * @param oldC         previous body-to-NED coordinate transformation.
4334      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4335      *                     down.
4336      * @param oldLatitude  previous latitude expressed in radians (rad).
4337      * @param oldHeight    previous height expressed in meters (m).
4338      * @return a new body kinematics instance.
4339      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4340      *                                  matrices are not NED frame valid.
4341      */
4342     public static BodyKinematics estimateKinematicsAndReturnNew(
4343             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4344             final NEDVelocity oldVelocity, final double oldLatitude, final double oldHeight) {
4345         final var result = new BodyKinematics();
4346         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
4347         return result;
4348     }
4349 
4350     /**
4351      * Estimates body kinematics (specific force applied to a body and its angular rates)
4352      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4353      *
4354      * @param timeInterval time interval between epochs expressed in seconds (s).
4355      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4356      * @param oldC         previous body-to-NED coordinate transformation.
4357      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4358      *                     down.
4359      * @param oldLatitude  previous latitude.
4360      * @param oldHeight    previous height.
4361      * @return a new body kinematics instance.
4362      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4363      *                                  matrices are not NED frame valid.
4364      */
4365     public static BodyKinematics estimateKinematicsAndReturnNew(
4366             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4367             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight) {
4368         final var result = new BodyKinematics();
4369         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
4370         return result;
4371     }
4372 
4373     /**
4374      * Estimates body kinematics (specific force applied to a body and its angular rates)
4375      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4376      *
4377      * @param timeInterval time interval between epochs.
4378      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4379      * @param oldC         previous body-to-NED coordinate transformation.
4380      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4381      *                     down.
4382      * @param oldLatitude  previous latitude.
4383      * @param oldHeight    previous height.
4384      * @return a new body kinematics instance.
4385      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4386      *                                  matrices are not NED frame valid.
4387      */
4388     public static BodyKinematics estimateKinematicsAndReturnNew(
4389             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4390             final NEDVelocity oldVelocity, final Angle oldLatitude, final Distance oldHeight) {
4391         final var result = new BodyKinematics();
4392         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldLatitude, oldHeight, result);
4393         return result;
4394     }
4395 
4396     /**
4397      * Estimates body kinematics (specific force applied to a body and its angular rates)
4398      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4399      *
4400      * @param timeInterval time interval between epochs expressed in seconds (s).
4401      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4402      * @param oldC         previous body-to-NED coordinate transformation.
4403      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4404      *                     along north, east, and down and expressed in meters per second (m/s).
4405      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4406      *                     along north, east, and down and expressed in meters per second (m/s).
4407      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4408      *                     along north, east, and down and expressed in meters per second (m/s).
4409      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4410      * @return a new body kinematics instance.
4411      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4412      *                                  matrices are not NED frame valid.
4413      */
4414     public static BodyKinematics estimateKinematicsAndReturnNew(
4415             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4416             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition) {
4417         final var result = new BodyKinematics();
4418         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
4419         return result;
4420     }
4421 
4422     /**
4423      * Estimates body kinematics (specific force applied to a body and its angular rates)
4424      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4425      *
4426      * @param timeInterval time interval between epochs.
4427      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4428      * @param oldC         previous body-to-NED coordinate transformation.
4429      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4430      *                     along north, east, and down and expressed in meters per second (m/s).
4431      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4432      *                     along north, east, and down and expressed in meters per second (m/s).
4433      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4434      *                     along north, east, and down and expressed in meters per second (m/s).
4435      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4436      * @return a new body kinematics instance.
4437      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4438      *                                  matrices are not NED frame valid.
4439      */
4440     public static BodyKinematics estimateKinematicsAndReturnNew(
4441             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4442             final double oldVn, final double oldVe, final double oldVd, final NEDPosition oldPosition) {
4443         final var result = new BodyKinematics();
4444         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
4445         return result;
4446     }
4447 
4448     /**
4449      * Estimates body kinematics (specific force applied to a body and its angular rates)
4450      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4451      *
4452      * @param timeInterval time interval between epochs expressed in seconds (s).
4453      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4454      * @param oldC         previous body-to-NED coordinate transformation.
4455      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4456      *                     along north, east, and down.
4457      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4458      *                     along north, east, and down.
4459      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4460      *                     along north, east, and down.
4461      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4462      * @return a new body kinematics instance.
4463      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4464      *                                  matrices are not NED frame valid.
4465      */
4466     public static BodyKinematics estimateKinematicsAndReturnNew(
4467             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4468             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition) {
4469         final var result = new BodyKinematics();
4470         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
4471         return result;
4472     }
4473 
4474     /**
4475      * Estimates body kinematics (specific force applied to a body and its angular rates)
4476      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4477      *
4478      * @param timeInterval time interval between epochs.
4479      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4480      * @param oldC         previous body-to-NED coordinate transformation.
4481      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4482      *                     along north, east, and down.
4483      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4484      *                     along north, east, and down.
4485      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4486      *                     along north, east, and down.
4487      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4488      * @return a new body kinematics instance.
4489      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4490      *                                  matrices are not NED frame valid.
4491      */
4492     public static BodyKinematics estimateKinematicsAndReturnNew(
4493             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4494             final Speed oldVn, final Speed oldVe, final Speed oldVd, final NEDPosition oldPosition) {
4495         final var result = new BodyKinematics();
4496         estimateKinematics(timeInterval, frame, oldC, oldVn, oldVe, oldVd, oldPosition, result);
4497         return result;
4498     }
4499 
4500     /**
4501      * Estimates body kinematics (specific force applied to a body and its angular rates)
4502      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4503      *
4504      * @param timeInterval time interval between epochs expressed in seconds (s).
4505      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4506      * @param oldC         previous body-to-NED coordinate transformation.
4507      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4508      *                     down.
4509      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4510      * @return a new body kinematics instance.
4511      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4512      *                                  matrices are not NED frame valid.
4513      */
4514     public static BodyKinematics estimateKinematicsAndReturnNew(
4515             final double timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4516             final NEDVelocity oldVelocity, final NEDPosition oldPosition) {
4517         final var result = new BodyKinematics();
4518         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldPosition, result);
4519         return result;
4520     }
4521 
4522     /**
4523      * Estimates body kinematics (specific force applied to a body and its angular rates)
4524      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4525      *
4526      * @param timeInterval time interval between epochs.
4527      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4528      * @param oldC         previous body-to-NED coordinate transformation.
4529      * @param oldVelocity  previous velocity of body frame with respect NED frame, resolved along north, east and
4530      *                     down.
4531      * @param oldPosition  previous curvilinear position expressed in terms of latitude, longitude and height.
4532      * @return a new body kinematics instance.
4533      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4534      *                                  matrices are not NED frame valid.
4535      */
4536     public static BodyKinematics estimateKinematicsAndReturnNew(
4537             final Time timeInterval, final NEDFrame frame, final CoordinateTransformation oldC,
4538             final NEDVelocity oldVelocity, final NEDPosition oldPosition) {
4539         final var result = new BodyKinematics();
4540         estimateKinematics(timeInterval, frame, oldC, oldVelocity, oldPosition, result);
4541         return result;
4542     }
4543 
4544     /**
4545      * Estimates body kinematics (specific force applied to a body and its angular rates)
4546      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4547      *
4548      * @param timeInterval time interval between epochs expressed in seconds (s).
4549      * @param c            body-to-NED coordinate transformation.
4550      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4551      *                     north, east, and down and expressed in meters per second (m/s).
4552      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4553      *                     north, east, and down and expressed in meters per second (m/s).
4554      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4555      *                     north, east, and down and expressed in meters per second (m/s).
4556      * @param latitude     current latitude expressed in radians (rad).
4557      * @param height       current height expressed in meters (m).
4558      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4559      * @return a new body kinematics instance.
4560      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4561      *                                  matrices are not NED frame valid.
4562      */
4563     public static BodyKinematics estimateKinematicsAndReturnNew(
4564             final double timeInterval, final CoordinateTransformation c,
4565             final double vn, final double ve, final double vd, final double latitude, final double height,
4566             final NEDFrame oldFrame) {
4567         final var result = new BodyKinematics();
4568         estimateKinematics(timeInterval, c, vn, ve, vd, latitude, height, oldFrame, result);
4569         return result;
4570     }
4571 
4572     /**
4573      * Estimates body kinematics (specific force applied to a body and its angular rates)
4574      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4575      *
4576      * @param timeInterval time interval between epochs.
4577      * @param c            body-to-NED coordinate transformation.
4578      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4579      *                     north, east, and down and expressed in meters per second (m/s).
4580      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4581      *                     north, east, and down and expressed in meters per second (m/s).
4582      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4583      *                     north, east, and down and expressed in meters per second (m/s).
4584      * @param latitude     current latitude expressed in radians (rad).
4585      * @param height       current height expressed in meters (m).
4586      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4587      * @return a new body kinematics instance.
4588      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4589      *                                  matrices are not NED frame valid.
4590      */
4591     public static BodyKinematics estimateKinematicsAndReturnNew(
4592             final Time timeInterval, final CoordinateTransformation c,
4593             final double vn, final double ve, final double vd, final double latitude, final double height,
4594             final NEDFrame oldFrame) {
4595         final var result = new BodyKinematics();
4596         estimateKinematics(timeInterval, c, vn, ve, vd, latitude, height, oldFrame, result);
4597         return result;
4598     }
4599 
4600     /**
4601      * Estimates body kinematics (specific force applied to a body and its angular rates)
4602      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4603      *
4604      * @param timeInterval time interval between epochs expressed in seconds (s).
4605      * @param c            body-to-NED coordinate transformation.
4606      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4607      * @param latitude     current latitude expressed in radians (rad).
4608      * @param height       current height expressed in meters (m).
4609      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4610      * @return a new body kinematics instance.
4611      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4612      *                                  matrices are not NED frame valid.
4613      */
4614     public static BodyKinematics estimateKinematicsAndReturnNew(
4615             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4616             final double latitude, final double height, final NEDFrame oldFrame) {
4617         final var result = new BodyKinematics();
4618         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
4619         return result;
4620     }
4621 
4622     /**
4623      * Estimates body kinematics (specific force applied to a body and its angular rates)
4624      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4625      *
4626      * @param timeInterval time interval between epochs.
4627      * @param c            body-to-NED coordinate transformation.
4628      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4629      * @param latitude     current latitude expressed in radians (rad).
4630      * @param height       current height expressed in meters (m).
4631      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4632      * @return a new body kinematics instance.
4633      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4634      *                                  matrices are not NED frame valid.
4635      */
4636     public static BodyKinematics estimateKinematicsAndReturnNew(
4637             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4638             final double latitude, final double height, final NEDFrame oldFrame) {
4639         final var result = new BodyKinematics();
4640         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
4641         return result;
4642     }
4643 
4644     /**
4645      * Estimates body kinematics (specific force applied to a body and its angular rates)
4646      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4647      *
4648      * @param timeInterval time interval between epochs expressed in seconds (s).
4649      * @param c            body-to-NED coordinate transformation.
4650      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4651      * @param latitude     current latitude.
4652      * @param height       current height.
4653      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4654      * @return a new body kinematics instance.
4655      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4656      *                                  matrices are not NED frame valid.
4657      */
4658     public static BodyKinematics estimateKinematicsAndReturnNew(
4659             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4660             final Angle latitude, final Distance height, final NEDFrame oldFrame) {
4661         final var result = new BodyKinematics();
4662         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
4663         return result;
4664     }
4665 
4666     /**
4667      * Estimates body kinematics (specific force applied to a body and its angular rates)
4668      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4669      *
4670      * @param timeInterval time interval between epochs.
4671      * @param c            body-to-NED coordinate transformation.
4672      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4673      * @param latitude     current latitude.
4674      * @param height       current height.
4675      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4676      * @return a new body kinematics instance.
4677      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4678      *                                  matrices are not NED frame valid.
4679      */
4680     public static BodyKinematics estimateKinematicsAndReturnNew(
4681             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4682             final Angle latitude, final Distance height, final NEDFrame oldFrame) {
4683         final var result = new BodyKinematics();
4684         estimateKinematics(timeInterval, c, velocity, latitude, height, oldFrame, result);
4685         return result;
4686     }
4687 
4688     /**
4689      * Estimates body kinematics (specific force applied to a body and its angular rates)
4690      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4691      *
4692      * @param timeInterval time interval between epochs expressed in seconds (s).
4693      * @param c            body-to-NED coordinate transformation.
4694      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4695      *                     north, east, and down and expressed in meters per second (m/s).
4696      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4697      *                     north, east, and down and expressed in meters per second (m/s).
4698      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4699      *                     north, east, and down and expressed in meters per second (m/s).
4700      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4701      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4702      * @return a new body kinematics instance.
4703      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4704      *                                  matrices are not NED frame valid.
4705      */
4706     public static BodyKinematics estimateKinematicsAndReturnNew(
4707             final double timeInterval, final CoordinateTransformation c,
4708             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame) {
4709         final var result = new BodyKinematics();
4710         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
4711         return result;
4712     }
4713 
4714     /**
4715      * Estimates body kinematics (specific force applied to a body and its angular rates)
4716      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4717      *
4718      * @param timeInterval time interval between epochs.
4719      * @param c            body-to-NED coordinate transformation.
4720      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4721      *                     north, east, and down and expressed in meters per second (m/s).
4722      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4723      *                     north, east, and down and expressed in meters per second (m/s).
4724      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4725      *                     north, east, and down and expressed in meters per second (m/s).
4726      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4727      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4728      * @return a new body kinematics instance.
4729      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4730      *                                  matrices are not NED frame valid.
4731      */
4732     public static BodyKinematics estimateKinematicsAndReturnNew(
4733             final Time timeInterval, final CoordinateTransformation c,
4734             final double vn, final double ve, final double vd, final NEDPosition position, final NEDFrame oldFrame) {
4735         final var result = new BodyKinematics();
4736         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
4737         return result;
4738     }
4739 
4740     /**
4741      * Estimates body kinematics (specific force applied to a body and its angular rates)
4742      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4743      *
4744      * @param timeInterval time interval between epochs expressed in seconds (s).
4745      * @param c            body-to-NED coordinate transformation.
4746      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4747      *                     north, east, and down.
4748      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4749      *                     north, east, and down.
4750      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4751      *                     north, east, and down.
4752      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4753      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4754      * @return a new body kinematics instance.
4755      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4756      *                                  matrices are not NED frame valid.
4757      */
4758     public static BodyKinematics estimateKinematicsAndReturnNew(
4759             final double timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
4760             final NEDPosition position, final NEDFrame oldFrame) {
4761         final var result = new BodyKinematics();
4762         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
4763         return result;
4764     }
4765 
4766     /**
4767      * Estimates body kinematics (specific force applied to a body and its angular rates)
4768      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4769      *
4770      * @param timeInterval time interval between epochs.
4771      * @param c            body-to-NED coordinate transformation.
4772      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4773      *                     north, east, and down.
4774      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4775      *                     north, east, and down.
4776      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4777      *                     north, east, and down.
4778      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4779      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4780      * @return a new body kinematics instance.
4781      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4782      *                                  matrices are not NED frame valid.
4783      */
4784     public static BodyKinematics estimateKinematicsAndReturnNew(
4785             final Time timeInterval, final CoordinateTransformation c, final Speed vn, final Speed ve, final Speed vd,
4786             final NEDPosition position, final NEDFrame oldFrame) {
4787         final var result = new BodyKinematics();
4788         estimateKinematics(timeInterval, c, vn, ve, vd, position, oldFrame, result);
4789         return result;
4790     }
4791 
4792     /**
4793      * Estimates body kinematics (specific force applied to a body and its angular rates)
4794      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4795      *
4796      * @param timeInterval time interval between epochs expressed in seconds (s).
4797      * @param c            body-to-NED coordinate transformation.
4798      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4799      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4800      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4801      * @return a new body kinematics instance.
4802      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4803      *                                  matrices are not NED frame valid.
4804      */
4805     public static BodyKinematics estimateKinematicsAndReturnNew(
4806             final double timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4807             final NEDPosition position, final NEDFrame oldFrame) {
4808         final var result = new BodyKinematics();
4809         estimateKinematics(timeInterval, c, velocity, position, oldFrame, result);
4810         return result;
4811     }
4812 
4813     /**
4814      * Estimates body kinematics (specific force applied to a body and its angular rates)
4815      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4816      *
4817      * @param timeInterval time interval between epochs.
4818      * @param c            body-to-NED coordinate transformation.
4819      * @param velocity     velocity of body frame with respect NED frame, resolved along north, east and down.
4820      * @param position     current curvilinear position expressed in terms of latitude, longitude and height.
4821      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4822      * @return a new body kinematics instance.
4823      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4824      *                                  matrices are not NED frame valid.
4825      */
4826     public static BodyKinematics estimateKinematicsAndReturnNew(
4827             final Time timeInterval, final CoordinateTransformation c, final NEDVelocity velocity,
4828             final NEDPosition position, final NEDFrame oldFrame) {
4829         final var result = new BodyKinematics();
4830         estimateKinematics(timeInterval, c, velocity, position, oldFrame, result);
4831         return result;
4832     }
4833 
4834     /**
4835      * Estimates body kinematics (specific force applied to a body and its angular rates)
4836      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4837      *
4838      * @param timeInterval time interval between epochs expressed in seconds (s).
4839      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4840      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4841      * @return a new body kinematics instance.
4842      * @throws IllegalArgumentException if provided time interval is negative.
4843      */
4844     public static BodyKinematics estimateKinematicsAndReturnNew(
4845             final double timeInterval, final NEDFrame frame, final NEDFrame oldFrame) {
4846         final var result = new BodyKinematics();
4847         estimateKinematics(timeInterval, frame, oldFrame, result);
4848         return result;
4849     }
4850 
4851     /**
4852      * Estimates body kinematics (specific force applied to a body and its angular rates)
4853      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4854      *
4855      * @param timeInterval time interval between epochs.
4856      * @param frame        NED frame containing current position, velocity and body-to-NED coordinate transformation.
4857      * @param oldFrame     NED frame containing previous position, velocity and body-to-NED coordinate transformation.
4858      * @return a new body kinematics instance.
4859      * @throws IllegalArgumentException if provided time interval is negative.
4860      */
4861     public static BodyKinematics estimateKinematicsAndReturnNew(
4862             final Time timeInterval, final NEDFrame frame, final NEDFrame oldFrame) {
4863         final var result = new BodyKinematics();
4864         estimateKinematics(timeInterval, frame, oldFrame, result);
4865         return result;
4866     }
4867 
4868     /**
4869      * Estimates body kinematics (specific force applied to a body and its angular rates)
4870      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4871      *
4872      * @param timeInterval time interval between epochs expressed in seconds (s).
4873      * @param c            body-to-NED coordinate transformation.
4874      * @param oldC         previous body-to-NED coordinate transformation.
4875      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4876      *                     north, east, and down.
4877      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4878      *                     north, east, and down.
4879      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4880      *                     north, east, and down.
4881      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4882      *                     along north, east, and down.
4883      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4884      *                     along north, east, and down.
4885      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4886      *                     along north, east, and down.
4887      * @param latitude     current latitude expressed in radians (rad).
4888      * @param height       current height expressed in meters (m).
4889      * @param oldLatitude  previous latitude expressed in radians (rad).
4890      * @param oldHeight    previous height expressed in meters (m).
4891      * @return a new body kinematics instance.
4892      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4893      *                                  matrices are not NED frame valid.
4894      */
4895     public static BodyKinematics estimateKinematicsAndReturnNew(
4896             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4897             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
4898             final double latitude, final double height, final double oldLatitude, final double oldHeight) {
4899         final var result = new BodyKinematics();
4900         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
4901                 oldLatitude, oldHeight, result);
4902         return result;
4903     }
4904 
4905     /**
4906      * Estimates body kinematics (specific force applied to a body and its angular rates)
4907      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4908      *
4909      * @param timeInterval time interval between epochs.
4910      * @param c            body-to-NED coordinate transformation.
4911      * @param oldC         previous body-to-NED coordinate transformation.
4912      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4913      *                     north, east, and down.
4914      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4915      *                     north, east, and down.
4916      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4917      *                     north, east, and down.
4918      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4919      *                     along north, east, and down.
4920      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4921      *                     along north, east, and down.
4922      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4923      *                     along north, east, and down.
4924      * @param latitude     current latitude expressed in radians (rad).
4925      * @param height       current height expressed in meters (m).
4926      * @param oldLatitude  previous latitude expressed in radians (rad).
4927      * @param oldHeight    previous height expressed in meters (m).
4928      * @return a new body kinematics instance.
4929      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4930      *                                  matrices are not NED frame valid.
4931      */
4932     public static BodyKinematics estimateKinematicsAndReturnNew(
4933             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4934             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
4935             final double latitude, final double height, final double oldLatitude, final double oldHeight) {
4936         final var result = new BodyKinematics();
4937         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
4938                 oldLatitude, oldHeight, result);
4939         return result;
4940     }
4941 
4942     /**
4943      * Estimates body kinematics (specific force applied to a body and its angular rates)
4944      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4945      *
4946      * @param timeInterval time interval between epochs expressed in seconds (s).
4947      * @param c            body-to-NED coordinate transformation.
4948      * @param oldC         previous body-to-NED coordinate transformation.
4949      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4950      *                     north, east, and down and expressed in meters per second (m/s).
4951      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4952      *                     north, east, and down and expressed in meters per second (m/s).
4953      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4954      *                     north, east, and down and expressed in meters per second (m/s).
4955      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4956      *                     along north, east, and down and expressed in meters per second (m/s).
4957      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4958      *                     along north, east, and down and expressed in meters per second (m/s).
4959      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4960      *                     along north, east, and down and expressed in meters per second (m/s).
4961      * @param latitude     current latitude.
4962      * @param height       current height expressed in meters (m).
4963      * @param oldLatitude  previous latitude.
4964      * @param oldHeight    previous height expressed in meters (m).
4965      * @return a new body kinematics instance.
4966      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
4967      *                                  matrices are not NED frame valid.
4968      */
4969     public static BodyKinematics estimateKinematicsAndReturnNew(
4970             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
4971             final double vn, final double ve, final double vd,
4972             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
4973             final Angle oldLatitude, final double oldHeight) {
4974         final var result = new BodyKinematics();
4975         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
4976                 oldLatitude, oldHeight, result);
4977         return result;
4978     }
4979 
4980     /**
4981      * Estimates body kinematics (specific force applied to a body and its angular rates)
4982      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
4983      *
4984      * @param timeInterval time interval between epochs.
4985      * @param c            body-to-NED coordinate transformation.
4986      * @param oldC         previous body-to-NED coordinate transformation.
4987      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
4988      *                     north, east, and down and expressed in meters per second (m/s).
4989      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
4990      *                     north, east, and down and expressed in meters per second (m/s).
4991      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
4992      *                     north, east, and down and expressed in meters per second (m/s).
4993      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
4994      *                     along north, east, and down and expressed in meters per second (m/s).
4995      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
4996      *                     along north, east, and down and expressed in meters per second (m/s).
4997      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
4998      *                     along north, east, and down and expressed in meters per second (m/s).
4999      * @param latitude     current latitude.
5000      * @param height       current height expressed in meters (m).
5001      * @param oldLatitude  previous latitude.
5002      * @param oldHeight    previous height expressed in meters (m).
5003      * @return a new body kinematics instance.
5004      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
5005      *                                  matrices are not NED frame valid.
5006      */
5007     public static BodyKinematics estimateKinematicsAndReturnNew(
5008             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
5009             final double vn, final double ve, final double vd,
5010             final double oldVn, final double oldVe, final double oldVd, final Angle latitude, final double height,
5011             final Angle oldLatitude, final double oldHeight) {
5012         final var result = new BodyKinematics();
5013         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
5014                 oldLatitude, oldHeight, result);
5015         return result;
5016     }
5017 
5018     /**
5019      * Estimates body kinematics (specific force applied to a body and its angular rates)
5020      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
5021      *
5022      * @param timeInterval time interval between epochs expressed in seconds (s).
5023      * @param c            body-to-NED coordinate transformation.
5024      * @param oldC         previous body-to-NED coordinate transformation.
5025      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
5026      *                     north, east, and down and expressed in meters per second (m/s).
5027      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
5028      *                     north, east, and down and expressed in meters per second (m/s).
5029      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
5030      *                     north, east, and down and expressed in meters per second (m/s).
5031      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
5032      *                     along north, east, and down and expressed in meters per second (m/s).
5033      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
5034      *                     along north, east, and down and expressed in meters per second (m/s).
5035      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
5036      *                     along north, east, and down and expressed in meters per second (m/s).
5037      * @param latitude     current latitude expressed in radians (rad).
5038      * @param height       current height.
5039      * @param oldLatitude  previous latitude expressed in radians (rad).
5040      * @param oldHeight    previous height.
5041      * @return a new body kinematics instance.
5042      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
5043      *                                  matrices are not NED frame valid.
5044      */
5045     public static BodyKinematics estimateKinematicsAndReturnNew(
5046             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
5047             final double vn, final double ve, final double vd,
5048             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
5049             final double oldLatitude, final Distance oldHeight) {
5050         final var result = new BodyKinematics();
5051         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
5052                 oldLatitude, oldHeight, result);
5053         return result;
5054     }
5055 
5056     /**
5057      * Estimates body kinematics (specific force applied to a body and its angular rates)
5058      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
5059      *
5060      * @param timeInterval time interval between epochs.
5061      * @param c            body-to-NED coordinate transformation.
5062      * @param oldC         previous body-to-NED coordinate transformation.
5063      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
5064      *                     north, east, and down and expressed in meters per second (m/s).
5065      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
5066      *                     north, east, and down and expressed in meters per second (m/s).
5067      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
5068      *                     north, east, and down and expressed in meters per second (m/s).
5069      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
5070      *                     along north, east, and down and expressed in meters per second (m/s).
5071      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
5072      *                     along north, east, and down and expressed in meters per second (m/s).
5073      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
5074      *                     along north, east, and down and expressed in meters per second (m/s).
5075      * @param latitude     current latitude expressed in radians (rad).
5076      * @param height       current height.
5077      * @param oldLatitude  previous latitude expressed in radians (rad).
5078      * @param oldHeight    previous height.
5079      * @return a new body kinematics instance.
5080      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
5081      *                                  matrices are not NED frame valid.
5082      */
5083     public static BodyKinematics estimateKinematicsAndReturnNew(
5084             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
5085             final double vn, final double ve, final double vd,
5086             final double oldVn, final double oldVe, final double oldVd, final double latitude, final Distance height,
5087             final double oldLatitude, final Distance oldHeight) {
5088         final var result = new BodyKinematics();
5089         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
5090                 oldLatitude, oldHeight, result);
5091         return result;
5092     }
5093 
5094     /**
5095      * Estimates body kinematics (specific force applied to a body and its angular rates)
5096      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
5097      *
5098      * @param timeInterval time interval between epochs expressed in seconds (s).
5099      * @param c            body-to-NED coordinate transformation.
5100      * @param oldC         previous body-to-NED coordinate transformation.
5101      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
5102      *                     north, east, and down.
5103      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
5104      *                     north, east, and down.
5105      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
5106      *                     north, east, and down.
5107      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
5108      *                     along north, east, and down.
5109      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
5110      *                     along north, east, and down.
5111      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
5112      *                     along north, east, and down.
5113      * @param latitude     current latitude.
5114      * @param height       current height.
5115      * @param oldLatitude  previous latitude.
5116      * @param oldHeight    previous height.
5117      * @return a new body kinematics instance.
5118      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
5119      *                                  matrices are not NED frame valid.
5120      */
5121     public static BodyKinematics estimateKinematicsAndReturnNew(
5122             final double timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
5123             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
5124             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight) {
5125         final var result = new BodyKinematics();
5126         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
5127                 oldLatitude, oldHeight, result);
5128         return result;
5129     }
5130 
5131     /**
5132      * Estimates body kinematics (specific force applied to a body and its angular rates)
5133      * with respect NED frame and resolved along body-frame axes, averaged over time interval.
5134      *
5135      * @param timeInterval time interval between epochs.
5136      * @param c            body-to-NED coordinate transformation.
5137      * @param oldC         previous body-to-NED coordinate transformation.
5138      * @param vn           north coordinate of velocity of body frame with respect NED frame, resolved along
5139      *                     north, east, and down.
5140      * @param ve           east coordinate of velocity of body frame with respect NED frame, resolved along
5141      *                     north, east, and down.
5142      * @param vd           down coordinate of velocity of body frame with respect NED frame, resolved along
5143      *                     north, east, and down.
5144      * @param oldVn        north coordinate of previous velocity of body frame with respect NED frame, resolved
5145      *                     along north, east, and down.
5146      * @param oldVe        east coordinate of previous velocity of body frame with respect NED frame, resolved
5147      *                     along north, east, and down.
5148      * @param oldVd        down coordinate of previous velocity of body frame with respect NED frame, resolved
5149      *                     along north, east, and down.
5150      * @param latitude     current latitude.
5151      * @param height       current height.
5152      * @param oldLatitude  previous latitude.
5153      * @param oldHeight    previous height.
5154      * @return a new body kinematics instance.
5155      * @throws IllegalArgumentException if provided time interval is negative or coordinate transformation
5156      *                                  matrices are not NED frame valid.
5157      */
5158     public static BodyKinematics estimateKinematicsAndReturnNew(
5159             final Time timeInterval, final CoordinateTransformation c, final CoordinateTransformation oldC,
5160             final Speed vn, final Speed ve, final Speed vd, final Speed oldVn, final Speed oldVe, final Speed oldVd,
5161             final Angle latitude, final Distance height, final Angle oldLatitude, final Distance oldHeight) {
5162         final var result = new BodyKinematics();
5163         estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd, latitude, height,
5164                 oldLatitude, oldHeight, result);
5165         return result;
5166     }
5167 
5168     /**
5169      * Converts a time instance into seconds.
5170      *
5171      * @param time time to be converted.
5172      * @return time value expressed in seconds.
5173      */
5174     private static double convertTime(final Time time) {
5175         return TimeConverter.convert(time.getValue().doubleValue(), time.getUnit(), TimeUnit.SECOND);
5176     }
5177 
5178     /**
5179      * Converts a speed instance into meters per second.
5180      *
5181      * @param speed speed to be converted.
5182      * @return speed value expressed in meters per second.
5183      */
5184     private static double convertSpeed(final Speed speed) {
5185         return SpeedConverter.convert(speed.getValue().doubleValue(), speed.getUnit(), SpeedUnit.METERS_PER_SECOND);
5186     }
5187 
5188     /**
5189      * Converts an angle instance into radians.
5190      *
5191      * @param angle angle to be converted.
5192      * @return angle value expressed in radians.
5193      */
5194     private static double convertAngle(final Angle angle) {
5195         return AngleConverter.convert(angle.getValue().doubleValue(), angle.getUnit(), AngleUnit.RADIANS);
5196     }
5197 
5198     /**
5199      * Converts a distance instance into meters.
5200      *
5201      * @param distance distance to be converted.
5202      * @return distance value expressed in meters.
5203      */
5204     private static double convertDistance(final Distance distance) {
5205         return DistanceConverter.convert(distance.getValue().doubleValue(), distance.getUnit(), DistanceUnit.METER);
5206     }
5207 }