I have three observations, instantiated as AngularRaDec objects in the topocentric J2000 frame (all from the same site for initial testing, but eventually I will need to support different ground-stations across observations). I am trying to use IODGooding for an initial IOD of a track in GEO, but I’m getting clearly wrong values back (e.g. negative semi-major axes with eccentricities > 100). I think it might be an issue with my frame or using the zenith vectors for the observer locations, but I’m hoping you can help. I tried a simpler example with the observers at the center of Earth like the testing code, and that worked for me.

I’m using the python wrapper, but I think this is just an issue with how I’m using the method rather than anything python specific. Code below. I’ve omitted the imports/constants for brevity, but can include if you think that might be the source of the issue.

mu = Constants.IERS2010_EARTH_MU

IOD = IodGooding(eme, mu)

# Transform observer positions from J2000 topocentric to EME

t1 = obs1.getStation().getBaseFrame().getTransformTo(eme, obs1.getDate())

obs_pos1 = t1.transformVector(obs1.getStation().getBaseFrame().zenith)

t2 = obs2.getStation().getBaseFrame().getTransformTo(eme, obs2.getDate())

obs_pos2 = t2.transformVector(obs2.getStation().getBaseFrame().zenith)

t3 = obs3.getStation().getBaseFrame().getTransformTo(eme, obs3.getDate())

obs_pos3 = t3.transformVector(obs3.getStation().getBaseFrame().zenith)

# Transform observation RaDecs to unit vectors

x1 = math.cos(obs1.getObservedValue()[0])*math.cos(obs1.getObservedValue()[1])

y1 = math.sin(obs1.getObservedValue()[0])*math.cos(obs1.getObservedValue()[1])

z1 = math.sin(obs1.getObservedValue()[1])

los_1 = Vector3D(x1, y1, z1)

x2 = math.cos(obs2.getObservedValue()[0])*math.cos(obs2.getObservedValue()[1])

y2 = math.sin(obs2.getObservedValue()[0])*math.cos(obs2.getObservedValue()[1])

z2 = math.sin(obs2.getObservedValue()[1])

los_2 = Vector3D(x2, y2, z2)

x3 = math.cos(obs3.getObservedValue()[0])*math.cos(obs3.getObservedValue()[1])

y3 = math.sin(obs3.getObservedValue()[0])*math.cos(obs3.getObservedValue()[1])

z3 = math.sin(obs3.getObservedValue()[1])

los_3 = Vector3D(x3, y3, z3)

date_1 = obs1.getDate()

date_2 = obs2.getDate()

date_3 = obs3.getDate()

geo_dist = 37000000.0 #meters

range_1 = geo_dist

range_3 = geo_dist

estimate = IOD.estimate(obs_pos1, obs_pos2, obs_pos3, los_1, date_1, los_2, date_2, los_3, date_3, range_1, range_3)

Could someone help point me to what I’m doing wrong?