# Transforming geodetic points to spacecraft body frame

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?

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

1 Like

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:

• I entered the geodetic coordinates of the polygon I wish to get at the initial date-time. I want to get the blue FoV drawn in the figure.
• I convert these geodetic coordinates to the spacecraft frame thanks to the code you have provided.
• Then entered these â€śconvertedâ€ť coordinates to the `SphericalPolygonsSet` which is required inside the PolygonalFieldOfView method.
• Finally checking the FoV if I did it correct or not. The output FoV appears to be something like the red FoV I have depicted above.

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)
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.

Hi @MaximeJ and @Echulion ,

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 !