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!