Question about footprint of satellite

Hi everyone!
I suppose that the FOV of satellite sensor is a CircularFieldOfView, and use the code below to get footprint of a “IRIDIUM 33 DEB” satellite, then project the geo coordinates of satellite and its footprint in a map (“http://geojson.io/”), finally I get an odd shape, is this result reliable and explainable?
Thanks for your help!

// http://celestrak.com/NORAD/elements/iridium-33-debris.txt
// IRIDIUM 33 DEB
TLE tle = new TLE("1 45263U 98067RG  21335.84087988  .00103863  00000+0  61462-3 0  9998",
		"2 45263  51.6329 192.2747 0007610 178.5415 181.5609 15.77243459101598");
		
// predict
final TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle);
AbsoluteDate target = new AbsoluteDate(new Date(), TimeScalesFactory.getUTC());
SpacecraftState state = propagator.propagate(target);
Vector3D satPoint = state.getPVCoordinates().getPosition();
GeodeticPoint geoPoint = PredictorConstants.DEFAULT_EARTH_SHAPE.transform(satPoint, state.getFrame(), state.getDate());
System.out.println(geoPoint);

Transform inertToBody = state.getFrame().getTransformTo(PredictorConstants.DEFAULT_EARTH_FRAME, state.getDate());
Transform fovToBody = new Transform(state.getDate(),
		state.toTransform().getInverse(),
		inertToBody);
		
CircularFieldOfView cfov =
		new CircularFieldOfView(Vector3D.PLUS_K, FastMath.toRadians(50.), 0.);
		
List<List<GeodeticPoint>> footprint =
			cfov.getFootprint(fovToBody, (OneAxisEllipsoid) PredictorConstants.DEFAULT_EARTH_SHAPE, 0.1);

List<GeodeticPoint> list = footprint.get(0);
for (GeodeticPoint point : list) {
	System.out.println("[" + FastMath.toDegrees(point.getLongitude()) + "," +
			FastMath.toDegrees(point.getLatitude()) + "],");
}

json text:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [113.07182298326427,-12.342019568725561]
      },
      "properties": {
        "name": "satellite"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
			[117.6993800695659,-7.584567916175941],
			[118.73805459190787,-6.97353416864909],
			[120.05492415645402,-6.107675035594789],
			[121.8844309122897,-4.784870910623522],
			[124.9784026585672,-2.357233909213772],
			[132.84712000327167,4.1518444877641585],
			[132.89883965574288,4.090332696974968],
			[132.86649944589735,4.128840039995505],
			[132.75528577736083,4.26014433155005],
			[132.56677028972135,4.47884427566922],
			[132.299391501756,4.7809768894624565],
			[131.9487054269734,5.163598743028034],
			[131.507476019043,5.6243084824505845],
			[130.9656697730183,6.160669918277297],
			[130.31042796069687,6.769482502575947],
			[129.5261174044207,7.445840850628113],
			[128.59460902912434,8.181935064488604],
			[127.49600128566449,8.96558510014482],
			[126.21007836214771,9.778599855789986],
			[124.7188276705155,10.595231051639535],
			[123.01024888317153,11.381256164749528],
			[121.08333974914787,12.094503028604695],
			[118.95345149548903,12.68771956229346],
			[116.65630098246292,13.114281276117733],
			[114.24835554068747,13.336114273592477],
			[111.80188930771804,13.33171288910553],
			[109.39507706111522,13.101252933893594],
			[107.10005540406158,12.666559890355073],
			[104.97305714855631,12.065944499556316],
			[103.04952760282453,11.346163331226471],
			[101.3445627922306,10.554503635418557],
			[99.85695348640962,9.733101421062262],
			[98.57455031406091,8.916101230926083],
			[97.47924450659295,8.129156082937072],
			[96.55076534975454,7.3903611172501975],
			[95.76918524067794,6.711809066294774],
			[95.11636735402087,6.101235375931133],
			[94.5766811534158,5.563484971320186],
			[94.13727544016182,5.101711523990826],
			[93.78812548382074,4.718316959705376],
			[93.52200292117095,4.41568002234779],
			[93.33446888644917,4.1967325585876205],
			[93.2239635442791,4.065436890403054],
			[93.19205616997674,4.027205133251739],
			[93.24392657202394,4.089283131227428],
			[101.14985442631179,-2.40978850714944],
			[104.24289643988173,-4.8199832605888195],
			[106.07389598964531,-6.134404155692671],
			[107.39220888393274,-6.994737160364975],
			[108.43207613507316,-7.601632361767556],
			[109.30024413540099,-8.04568849719423],
			[110.05511616791678,-8.375347366824144],
			[110.73260619812541,-8.619095276813841],
			[111.3568348584809,-8.794596767884917],
			[111.94528768059466,-8.913007568027826],
			[112.51161529455777,-8.981186168127632],
			[113.0673329382344,-9.002860576034285],
			[113.62299464286843,-8.979201679483088],
			[114.18915230223664,-8.908995068056775],
			[114.77731456796842,-8.788464740235154],
			[115.40112050676281,-8.610694143972655],
			[116.07803823118498,-8.36445101619402],
			[116.83216401623169,-8.03196129789524]
        ]
      },
      "properties": {
        "prop0": "value0",
        "prop1": 0.0
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [100.0, 0.0],
            [101.0, 0.0],
            [101.0, 1.0],
            [100.0, 1.0],
            [100.0, 0.0]
          ]
        ]
      },
      "properties": {
        "prop0": "value0",
        "prop1": {
          "this": "that"
        }
      }
    }
  ]
}

Yes, the result is expected. The FOV is defined with respect to spacecraft frame (i.e. satellite body frame), and takes into account the attitude. As you did not register any AttitudeProvider, you get the default attitude, which is aligned with inertial frame.
You should probably register something like NadirPointing attitude provider or something more specific to Iridium if needed.

1 Like