EM Tracker HFluxPerI Derivation
All of the following can be found at (or derived from) https://en.wikipedia.org/wiki/Magnetic_dipole and in classical-electromagnetics textbooks.
We assume that, at the working frequency or frequencies, the wavelength is large compared to the distance between transmitter coil trio and receiver coil trio. This is the quasi-static approximation, which permits us to ignore radiation fields.
We assume that each coil is so small that its shape does not matter, only its size times its number of turns. This is the dipole approximation. Each coil has an effective-area vector, Aeff_vect (measured in square meters) which completely describes a dipole coil's quasi-static magnetic properties.
Consider a single transmitter coil, with effective-area vector Aeff_tmtr_vect. We pass a current Itmtr (measured in amperes) through the transmitter coil, which causes the coil to emit a vector magnetic field Hvect (measured in amperes per meter) which varies depending upon where we observe the magnetic field.
Let Rvect (measured in meters) be the vector from the transmitter coil to the position of the magnetic-field observer. The magnetic field at the observation point is Hvect(Rvect).
We can write Rvect as the product of its scalar magnitude, Rmag (measured in meters), and a unit vector Runit_vect (unitless) in the direction of Rvect:
Rvect = Rmag Runit_vect
The vector magnetic field Hvect (measured in amperes per meter) at the observation point is then:
Hvect(Rvect) = (Itmtr / (4 pi Rmag^3)) (3 Runit_vect (Runit_vect .dotproduct. Aeff_tmtr_vect) - Aeff_tmtr_vect)
This can be written more compactly (being a little free with the notation) as:
Hvect(Rvect) = (Itmtr / (4 pi Rmag^3)) ((3 Runit_vect Runit_vect .dotproduct.) -1) Aeff_tmtr_vect
Place a dipole receiver coil (with effective-area vector Aeff_rcvr_vect measured in square meters) at the observation point Rvect. Scalar HFlux (measured in amperes times meters) through the receiver coil is defined as:
HFlux(Rvect) = Aeff_rcvr_vect .dotproduct. Hvect(Rvect)
Substituting for Hvect(Rvect) gives:
Hflux(Rvect) = Aeff_rcvr_vect .dotproduct. (Itmtr / (4 pi Rmag^3)) ((3 Runit_vect Runit_vect .dotproduct.) -1) Aeff_tmtr_vect
Dividing by the transmitter current Itmtr, gives scalar HFluxPerI (measured in meters):
HFluxPerI(Rvect) = (1 / (4 pi Rmag^3)) Aeff_rcvr_vect .dotproduct. ((3 Runit_vect Runit_vect .dotproduct.) -1) Aeff_tmtr_vect
HFluxPerI is a purely geometrical property of the coils and their relationship in space.
If we replace Rvect with -Rvect, Rmag is unchanged, Runit_vect is replaced by -Runit_vect, and HFluxPerI is unchanged. This is the hemisphere ambiguity.
If we swap Aeff_rcvr_vect and Aeff_tmtr_vect, HFluxPerI is unchanged. This is electromagnetic reciprocity.
The induced voltage Vrcvr (measured in volts) across the receiver coil is:
Vrcvr(t) = -d/dt(Uo HFluxPerI Itmtr(t))
Uo = pi 4e-07 volts*seconds/(amperes*meters) is the magnetic permeability of free space, usually called mu-nought.
If Itmtr(t) is sinusoidal at frequency F, and the receiver is moving slowly or not at all with respect to the transmitter, we have:
Itmtr(t) = Itmtr_peak sin(2 pi F t)
Vrcvr(t) = Vrcvr_peak cos(2 pi F t)
Vrcvr_peak = -Uo HFluxPerI Itmtr_peak 2 pi F
The minus sign comes from the electromagnetics of induced voltages.
So far, we have considered one transmitter coil and one receiver coil, deriving the receiver HFluxPerI scalar:
HFluxPerI(Rvect) = (1 / (4 pi Rmag^3)) Aeff_rcvr_vect .dotproduct. ((3 Runit_vect Runit_vect .dotproduct.) -1) Aeff_tmtr_vect
Next, we expand this to three receiver coils and three transmitter coils. Scalar HFluxPerI becomes a 3x3 matrix. Vector Aeff_rcvr_vect becomes the product of two 3x3 matrices:
Aeff_rcvr_mat Rcvr_rotation_mat
Vector Aeff_tmtr_vect becomes the product of two 3x3 matrices:
Tmtr_rotation_mat Aeff_tmtr_mat
Assume we are working in a coordinate system where Runit_vect = (1,0,0). This leaves a free choice of rotations about Runit_vec, called "position roll" in Raab's 1981 paper and in the Raab, Blood, Steiner, Jones 1979 paper. Position roll drops out when converting the two rotation matrices to receiver position and orientation.
The parenthetical expression containing Runit_vect becomes a 3x3 matrix Ro. In a coordinate system where Runit_vect = (1,0,0), Ro is:
(+2, +0, +0)
(+0, -1, +0) = Ro
(+0, +0, -1)
For comparison, the identity matrix I is:
(+1, +0, +0)
(+0, +1, +0) = I
(+0, +0, +1)
Putting it all together, we get:
HFluxPerI_mat = (1/(4 pi Rmag^3)) Aeff_rcvr_mat Rcvr_rotation_mat Ro Tmtr_rotation_mat Aeff_tmtr_mat
Multiplying both sides by 4 pi Rmag^3 gives:
HFluxPerI_mat 4 pi Rmag^3 = Aeff_rcvr_mat Rcvr_rotation_mat Ro Tmtr_rotation_mat Aeff_tmtr_mat
Multiplying both sides by the inverses of the Aeff matrices gives:
Aeff_Rcvr_mat_inverse HFluxPerI_mat 4 pi Rmag^3 Aeff_tmtr_mag_inverse = Rcvr_rotation_mat Ro Tmtr_rotation_mat
HFluxPerI is measured by the tracker electronics.
Aeff_rcvr_mat is known from the receiver coil characterization process.
Aeff_tmtr_mat is known from the transmitter coil characterization process.
Calculating the sum of the squares of the nine elements in HFluxPerI, permits calculating Rmag independently of the rotation matrices. This needs more detail here, see the Raab and Raab Blood Steiner Jones papers.
The left side is thus known. The tracker position-and-orientation algorithm does the equivalent of calculating the two rotation matrices from the known left side and the known Ro. Note that if Ro were the identity matrix, the two rotation matrices could not be calculated separately.