Kinematics Estimators

This documentation was generated with the assistance of AI. Please report any inaccuracies.

Classes: NEDKinematicsEstimator, ECEFKinematicsEstimator, ECIKinematicsEstimator.

What these classes solve

A navigator integrates measured specific force and angular rate forward in time to obtain position, velocity, and attitude. The kinematics estimators solve the inverse problem: given two consecutive (attitude, velocity, position) navigation states, they compute the specific force and angular rate that an ideal IMU would have measured between them. This is exactly what the referenced MATLAB companion scripts (Kinematics_NED.m, Kinematics_ECEF.m, Kinematics_ECI.m) do, and it is the standard way to generate noise-free, synthetic IMU measurements for testing a navigator or calibrator against a known trajectory.

flowchart LR A["Known trajectory:\nattitude, velocity, position\nat consecutive epochs"] --> B["*KinematicsEstimator\n(this page)"] B --> C["Synthetic specific force f_ib\nand angular rate omega_ib"] C --> D["Navigator\n(integrates forward)"] D -->|should reproduce| A

Common structure

All three estimators follow the same four-step pattern described in Groves §5.1-5.3 (see [book-groves]), run in reverse:

  1. Angular rate: recover the attitude-increment rotation vector from the old and new body-to-reference coordinate transformation matrices (inverting the exponential attitude-update equation), then divide by the time interval.

  2. Specific force: difference the old and new velocities, subtract gravity/gravitation, and add back the Coriolis/transport-rate terms that the frame in question rotates with.

  3. Frame transformation: transform the specific force from the reference-frame resolving axes back to body-frame axes using the (precise, averaged) coordinate transformation matrix.

  4. Store the resulting BodyKinematics (specific force + angular rate), or a zero result if the time interval is zero.

ECIKinematicsEstimator

The ECI frame is inertial, so there is no Earth-rotation or transport-rate term. Specific force is simply the velocity change minus gravitation (equation family 5.11-5.14):

using ECIGravitationEstimator for , then transformed to body axes via the averaged attitude matrix (equations 5.77, 5.81, 5.84 style precise-form averaging).

ECEFKinematicsEstimator

The ECEF frame rotates with the Earth at rate , so a Coriolis term appears. Specific force resolved about ECEF axes is recovered from consecutive ECEF velocities and position using

where comes from ECEFGravityEstimator and is the skew-symmetric Earth-rotation matrix:

The attitude increment is recovered from (inverting the attitude-update equation 5.19/5.20), and the specific force is transformed back to body axes through the precise averaged coordinate transformation matrix of equation 5.63/5.81.

NEDKinematicsEstimator

The local-navigation (NED) frame adds a further transport-rate term on top of the Earth-rate term, because the NED axes themselves rotate as the body moves across the Earth’s surface (equation 5.37, using the meridian/transverse radii of curvature from RadiiOfCurvatureEstimator):



Specific force resolved about NED axes (equation 5.44/5.46 style):

using NEDGravityEstimator for , and the earlier-and-later Earth-rate/transport-rate terms averaged when recovering attitude increment and the average coordinate transformation matrix (as in equation 5.84/5.86).

double timeInterval = 1.0; // seconds between the two epochs

// body-to-NED attitude at the start and end of the interval
CoordinateTransformation oldC = new CoordinateTransformation(
        0.0, 0.0, 0.0, FrameType.LOCAL_NAVIGATION_FRAME, FrameType.BODY_FRAME);
CoordinateTransformation c = new CoordinateTransformation(
        0.01, 0.0, 0.02, FrameType.LOCAL_NAVIGATION_FRAME, FrameType.BODY_FRAME);

double latitude = Math.toRadians(41.3851);
double oldLatitude = latitude;
double height = 0.0;
double oldHeight = 0.0;

// NED velocity at the start and end of the interval (m/s)
double oldVn = 0.0, oldVe = 0.0, oldVd = 0.0;
double vn = 1.0, ve = 0.0, vd = 0.0;

BodyKinematics kinematics = new BodyKinematics();
NEDKinematicsEstimator.estimateKinematics(timeInterval, c, oldC, vn, ve, vd, oldVn, oldVe, oldVd,
        latitude, height, oldLatitude, oldHeight, kinematics);

double fx = kinematics.getFx(); // synthetic specific force (m/s^2)
double angularRateZ = kinematics.getAngularRateZ(); // synthetic angular rate (rad/s)

ECEFKinematicsEstimator.estimateKinematics(…​) and ECIKinematicsEstimator.estimateKinematics(…​) follow the same pattern, replacing latitude/height with Cartesian position and NED velocity with ECEF/ECI velocity, respectively.

Where to go next