Hello Orekit community,
Is there a way to transform a set of geodetic points to spacecraft body frame at the specific time so that i can obtain satellite field of view?
Thanks in advance
Suleyman
Hello Orekit community,
Is there a way to transform a set of geodetic points to spacecraft body frame at the specific time so that i can obtain satellite field of view?
Thanks in advance
Suleyman
Hello @saltinisik,
What you’re trying to achieve looks very much like what @Echulion already asked for at the end of this thread.
Am I right @Echulion ?
I will try to answer, hoping that I can help the both of you.
Suppose you have a SpacecraftState state
and a GeodeticPoint geoPoint
.
// Get the reference frame of the SpacecraftState (the inertial frame where the orbit is computed)
Frame refFrame = state.getFrame();
// Get the position of the SpacecraftState in ref frame
Vector3D satPosInRefFrame = state.getPVCoordinates().getPosition();
// Get its date
AbsoluteDate date = state.getDate();
// Get the attitude of the spacecraft (a rotation from reference frame to "satellite" frame)
Attitude attitude = state.getAttitude();
// Get the underlying topocentric frame of the geodetic point
TopocentricFrame topoFrame = new TopocentricFrame(earth, geoPoint, "topoFrame");
// Get the geodetic point position in reference frame
Vector3D geoPointInRefFrame = topoFrame.getPVCoordinates(date, refFrame).getPosition();
// Let O be the center of frame, S the satellite and P the geodetic point
// Compute satellite to geodetic point vector: SP = - OS + OP
Vector3D sat2GeoPoint = geoPointInRefFrame.subtract(satPosInRefFrame);
// Normalize the vector and rotate it using the attitude
Vector3D geoPointDirectionInSatFrame = attitude.getRotation().applyTo(sat2GeoPoint.normalize());
With this you should have the geodetic point direction in satellite frame (i.e. a unit vector pointing to the geodetic point with respect to the satellite position and attitude).
Is that what you are looking for ?
Maxime
Hello @MaximeJ,
Yes you are definitely right. The problem defined here is really similar to what I am trying to achieve. I implemented the code you’ve shared in my ipynb. notebook. I believe this algorithm is correct and this should give us the the points in the frame of the spacecraft.
Yet… Still, for some reason the polygonal shape differs from what I wish to see. Here is a visual depiction of what I am seeing:
SphericalPolygonsSet
which is required inside the PolygonalFieldOfView method.So it is both scaled down and moved diagonally. I think this is something related to frame conversions, but then again the code you have provided should’ve solved this issue. So this is rather peculiar and I am at lost to be honest.
Hi @Echulion,
Maybe the code I gave you is not perfect, I wrote this very quickly.
Could you provide a code with what you have and what you expect ?
Greetings @MaximeJ ,
I’ve been trying different stuff in the meantime and the thing is, the problem is actually solved! I have done a very trivial fix to correct this issue but before diving into that, I would like to thank you sincerely, for your lasting support in this problem
First of all, the algorithm you have provided above works perfectly well. This is what should be done to convert geodetic points to spacecraft frame. In the case of creating a PolygonalFieldOfView
one must use this algorithm as well since we are supposed to create this polygon in the s/c frame.
Before using this algorithm one must define the polygon in clockwise manner. This solved the issue for me.
What was my mistake: I though we should define the polygon FoV just as we defined the area-of-interest on the surface of earth, which is in counter clockwise manner. This was the culprit.
Since the problem is solved here, I will adress this post in the other one.
Thanks again!
Greetings @Echulion,
I’m glad to see you managed to solve your problem. And you are very welcome for the help !
Interesting, did you find an explanation in Hipparchus javadoc or did you come up with this through trial and error ?
No, I did not find any explanation in Hipparchus javadoc, although when defining a zone on the surface of the earth, “counter clockwise manner” is mentioned couple times, that is why I assumed drawing the polygonal FoV would be similar.
In the other post, I’ve mentioned a code snipped about checking the initial footprint within the propagation:
initialCartesianOrbit = CartesianOrbit(SGP4_pv, ECI, initialDate, Mu_earth)
state = SpacecraftState(initialCartesianOrbit, satellite_mass)
inertToBody = state.getFrame().getTransformTo(earth.getBodyFrame(), state.getDate())
fovToBody = Transform(state.getDate(),
state.toTransform().getInverse(),
inertToBody)
footprint = imagerFOV1.getFootprint(fovToBody, earth, radians(10.0))
footPrintList.append(footprint)
After applying your algorithm, this bit gave me lat/long coordinates very close to what I have aimed to get at the first place… And I noticed that they were somewhat in backwards order. Then, I tried to enter the geodetic point set I have in clockwise order, and voilà ! Issue is solved with trial and error, per se.
First of all thank you for the code that you snipped both of you @MaximeJ and @Echulion , i tried my code with your solutions and it works perfect for me.
Thank you very much orekit community, whenever i stuck any problem, this forum always helped me!
Suleyman
You’re very welcome @saltinisik, we’re always happy to help !