# Building the ISS LVLH frame in ECEF/ITRF coordinates

I am trying to calculate the International Space Station (ISS) LVLH (Local-Vertical-Local-Horizontal) base vectors expressed in the ECEF/ITRF frame at a given time. The point is then to calculate the rotation matrix to rotate vectors in ECEF to LVLH (and vice-versa).

I have a procedure to do that, but I am not sure if it is done properly. So that's why I am asking help here to check what I am doing, presented next.

The ISS LVLH frame is defined as in the following picture:

Lets consider a specific time: 2019-Mar-24 00:31:53.135444 UTC.

First, the Skyfield library in Python is used to get the ISS position and its velocity vector for a specific time using the ITRF_position_velocity_error method of the sgp4lib.EarthSatellite class :

Longitude (deg), Latitude (deg), Altitude (km) : 55.34071583, 0.10055032, 408.59435164
Position unit vector (ITRF) : R == (0.56869428, 0.82254713, 0.00174319)
Velocity unit vector (ITRF) : V == (-0.47416977, 0.33092048, -0.81587662)

(The used TLE is :
1 25544U 98067A 19083.06129885 -.00367384 00000-0 -62017-2 0 9991
2 25544 51.6362 64.4008 0003657 146.0534 252.6576 15.52294152162032)

Then the LVLH X-Y-Z base vectors are calculated with :

Z = - R / ||R||
Y = Z X V
EDIT: should be : Y = Z X V / ||Z X V||
X = Y X Z

Which, in this case gives the values:

X = (-0.47480547, 0.33000101, -0.81587857)
Y = ( 0.67167383, -0.4631578 , -0.57821957)
Z = (-0.56869428, -0.82254713, -0.00174319)

Then, calculating the rotation matrix and inverting it is straightforward.

Is this method correct ?

Thanks in advance for the help.

Is this method correct ?

Not quite. You are assuming that $$\hat r$$ and $$\hat v$$ are orthogonal. A quick check shows that this is not quite the case. The ISS's orbit is not quite circular.

This means that while your $$\hat y$$ points in the right direction, it is not a unit vector. You can make it a unit vector by dividing by the magnitude. Then you can calculate $$\hat z = \hat x \times \hat y$$. Unfortunately, this also will not be a unit vector due to the vagaries of floating point arithmetic, but it will be very close.

Looks right to me to a first approximation.

One useful sanity check is that X comes out close to V (because the orbit is close to circular and thus V was already almost perpendicular to R to begin with).

Another is to note that the ISS was about to cross the equatorial plane (the ITRF $$z$$ coordinate of R is almost zero) and moving in a direction a little further south than southeast: V forms an angle of 54.67 degrees with this plane. This is larger than the 51.6° orbital inclination because the ITRF is co-rotating eastward with the Earth. The velocity unit vector expressed in an inertial frame would have a slightly larger component towards local east and would thus form a more acute angle with the equatorial plane.

However, I believe you'll have to compensate for this "aberration" effect to get the correct Y and then X. (Consider a LEO satellite in a circular polar orbit at the moment it crosses the equatorial plane from south to north. It will have the north celestial pole right in front of it: X = (0, 0, 1). But its V in terms of the ITRF will point a bit W of due north because the ITRF keeps moving eastward by roughly half a km/s above the equator, the precise value depending on the satellite's altitude.)