Identify the axis in triaxial movement measurements

[V,q] = inv_axis(A) % Matlab & Octave
list <- inv_axis(data) #R

Identify the axis in triaxial movement measurements that varies the least, i.e., the invariant axis. Rotational and linear movement in some types of propulsion largely occur in 2 dimensions e.g., body rotation in cetacean caudal propulsion occurs around the animal's transverse axis. Likewise sychronized wing flaps in flight or pectoral swimming may generate acceleration in the longitudinal and dorso-ventral axes but much less in the transverse axis. This function identifies the direction of the axis that moves the least in a movement matrix.

Input var Description Units Default value
A/data is a triaxial sensor measurement axis e.g., from on accelerometer or magnetometer. N/A N/A
Output var Description Units
V is a 3×1 vector defining the least varying axis in A. N/A
q is the fraction of movement in the invariant axis. N/A
• Frame: The frame and unit of A do not matter.
• V is a direction vector so has a length of 1. V is defined in the same frame as A.
• A small number (e.g., <0.05) for q implies that very little movement occurs in this axis and so the movement is largely planar (i.e., two-dimensional). If the fraction is » 0.05, the motion in A is better described as three-dimensional. q is a fraction

### Matlab & Octave

s=sin(2*pi*0.1*(1:100)');
A=s*[0.9 -0.4 0.3]+s.^2*[0 0.2 0.1];
[V,q] = inv_axis(A)

### R

s <- matrix(sin(2*pi*0.1*c(1:100)), ncol=1)
A <- s %*% c(0.9, -0.4, 0.3) + s^2 %*% c(0, 0.2, 0.1)
inv_axis_out <- inv_axis(A)