Skip to content

An inconsistent definition of ground track and corridor in the tutorial

I think there is a mistake or at least an inconsistency in the Track_Corridor tutorial

Particularly, in the handleStep method of class CorridorHandler(PythonOrekitFixedStepHandler) (In [10]). I describe the problem as comments starting with PH: as following:

def handleStep(self, currentState, isLast):
        # compute sub-satellite track
        date    = currentState.getDate()
        pvInert = currentState.getPVCoordinates()
        t       = currentState.getFrame().getTransformTo(self.earth.getBodyFrame(), date)
        p       = t.transformPosition(pvInert.getPosition())  # Hao: here `p` is a Cartesian coordinate in ITRF
        v       = t.transformVector(pvInert.getVelocity())
        center  = self.earth.transform(p, self.earth.getBodyFrame(), date)  # Hao: here `center` is defined as a geocentric ground track point.
        
        # compute left and right corridor points
        # Hao: here `-p` points to geocentric, so `nadir` is defined as a geocentric direction but not a **geocentric** one. 
        #      This is inconsistent with `center` above.
        #      The geocentric `left` and `right` will then not centered at the geodetic `center`.
        nadir      = p.normalize().negate()
        crossTrack = p.crossProduct(v).normalize()
        leftLine   = Line(p, Vector3D(1.0, p, self.deltaR, nadir,  self.deltaC, crossTrack), 1.0)  # PH: line is defined w.r.t. the geocentric nadir
        left       = self.earth.getIntersectionPoint(leftLine, p, self.earth.getBodyFrame(), date)
        rightLine  = Line(p, Vector3D(1.0, p, self.deltaR, nadir, -self.deltaC, crossTrack), 1.0)
        right      = self.earth.getIntersectionPoint(rightLine, p, self.earth.getBodyFrame(), date)

My understanding about geodetic or geocentric nadir is based on this post: https://space.stackexchange.com/a/19729/28220

Based on your codes, my way to calculate the geodetic nadir direction is to construct a center point with 0 altitude, then calculate the normalized vector from center to p directly in ITRF, as following:

center = GeodeticPoint(center.latitude, center.longitude, 0.0)
center_cartesian= t.inverse.transformPosition(self.earth.transform(center))
nadir_geodetic = t.transformPosition(center_cartesian).subtract(p).normalize()

An alternative simplification is to use self.earth.projectToGround directly (not getting exactly identical results but within tolerance of about 10^-6 m):

center_cartesian = self.earth.projectToGround(pvInert.getPosition(), date, currentState.frame)
nadir_geodetic = t.transformPosition(center_cartesian).subtract(p).normalize()

I'm only about 80% sure about this clarification. So, I wish you could spend some time on further validating the issue.

Thanks, and happy holiday!