Hi all. I’m new to Orekit and TLE files. Could you point me to where I could find how to extract and calculate azimuth and elevation from a reference point on Earth to a satellite using TLE file?
Hi @mpavelic
Welcome to the Orekit forum!
First, you have to initialize a TLE object knowing your TLE data. Here an example:
final String line1 = "1 37753U 11036A 12090.13205652 -.00000006 00000-0 00000+0 0 2272";
final String line2 = "2 37753 55.0032 176.5796 0004733 13.2285 346.8266 2.00565440 5153";
final TLE tle = new TLE(line1, line2);
Then, you can initialize a TLEPropagator
using the previous TLE
.
final TLEPropagator propagator = TLEPropagator.selectExtrapolator(
Knowing the coordinates of the station, you can create a GeodeticPoint
and then a TopocentricFrame
to access azimuth and elevation of the satellite. After creating the topocentric frame, you can use the methods getElevation()
and getAzimuth()
.
final GeodeticPoint point = new GeodeticPoint(latitudeInRadians, longitudeInRadians, altitudeInMeters);
final OneAxisEllispoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
Constants.WGS84_EARTH_FLATTENING,
FramesFactory.getITRF(IERSConventions.IERS_2010, true)))
final TopocentricFrame topo = new TopocentricFrame(earth, point, "topo");
// Satellite state at a desired epoch
SpacecraftState state = propagator.propagate(desiredEpoch);
// Compute azimuth and elevation
final double azimuth = topo.getAzimuth(state.getPosition(), state.getFrame, state.getDate);
final double elevation = topo.getElevation(state.getPosition(), state.getFrame, state.getDate);
You can find some other details in that post:
Best regards,
Bryan
Hi @bcazabonne. Thank you very much for fast response. One question. As far as I can see there is not method which getPosition() in SpacecraftState which is used for determinig azimuth and elevation.
Oh sorry ! I have just written this code snippet in the forum editor. To access the position you have to use state.getPVCoordinates().getPosition()
instead of state.getPosition()
.
Bryan
Hello
I am using an elevation detector to find passages over a ground station, then for each pass I calculate some intermediate points on the passage ground track, with elevation and azimuth.
The Problem is that the elevation and azimuth I get are wrong, the elevation is very often below zero, and the azimuth is not ok. I did the same using the Predict library and the points azimuth+elevation looks correct.
here is the code I use:
// ISS
String l1 = "1 25544U 98067A 22272.20280866 .00014743 00000+0 26227-3 0 9997";
String l2 = "2 25544 51.6449 181.2521 0002650 316.9525 197.4867 15.50381701361312";
double aoi_lat = 0;
double aoi_lon = 0;
double aoi_alt = 0;
// make TLE
TLE aOrkitTle = new TLE(l1, l2);
//
FactoryManagedFrame ITRF = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
Constants.WGS84_EARTH_FLATTENING,
ITRF);
// area of interest, lat lon point
GeodeticPoint aoiPoint = new GeodeticPoint(FastMath.toRadians(aoi_lat), FastMath.toRadians(aoi_lon), aoi_alt);
// to frame
final TopocentricFrame aoiTopoFrame = new TopocentricFrame(earth, aoiPoint, "AOI");
// tle propagator
TLEPropagator propagator = TLEPropagator.selectExtrapolator(aOrkitTle);
// now
AbsoluteDate abd = new AbsoluteDate(2022, 9, 29, 10, 23, 0.0, TimeScalesFactory.getUTC());
// get spacecraft state
SpacecraftState spacecraftState = propagator.propagate(abd);
//
PVCoordinates pvCoordinates = spacecraftState.getPVCoordinates(ITRF);
//
GeodeticPoint geodeticPoint = earth.transform(
pvCoordinates.getPosition(),
ITRF,
abd);
// lat lon of propagated point
double latitude = FastMath.toDegrees(geodeticPoint.getLatitude());
double longitude = FastMath.toDegrees(geodeticPoint.getLongitude());
// azimuth and elevation of propagated point
final double azimuth = FastMath.toDegrees(aoiTopoFrame.getAzimuth(pvCoordinates.getPosition(), spacecraftState.getFrame(), abd));
final double elevation = FastMath.toDegrees(aoiTopoFrame.getElevation(pvCoordinates.getPosition(), spacecraftState.getFrame(), abd));
System.out.println("Propagated at " + abd + ": lat=" + latitude + "; lon=" + longitude + "; azimuth=" + azimuth + "; elevation=" + elevation);
=> result:
Propagated at 2022-09-29T10:23:00.000Z: lat=-1.5944622459512572; lon=14.94036744327584; azimuth=266.9278983301713; elevation=-73.96827945877185
At this date the ISS is east of the AOI/observerpoint at lat:0 lon: 0, over congo. And the values shall be azimuth 96.1 and elevation 5.9
I cannot see what am I doing wrong…
Best regards
Gilles
I think you computed pvCooordinates in itrf frame but then passed them to getazimut stating they are in spacecraft state frame