本教程的目的是计算地球上一点的逆向定位,以便确定传感器像素及其关联的线条看到该点。
我们还将解释如何找到传感器看到地面点的日期,这是一种只关注日期的逆向定位。
Rugged的初始化与直接定位教程中的初始化类似,直到rugged初始化为止。
一旦Rugged初始化完成,可以计算由地理坐标定义的点的线号和像素号:
import org.orekit.bodies.GeodeticPoint;
import org.orekit.rugged.linesensor.SensorPixel;
GeodeticPoint gp = new GeodeticPoint(latitude, longitude, altitude);
SensorPixel sensorPixel = rugged.inverseLocation(sensorName, gp, minLine, maxLine);
其中minLine(maxLine)是搜索区间的最小线号(最大线号)。
逆向定位将给出传感器像素号和关联的线号,用于观察地面上的点。 如果点在指定的线号之间无法看到,则返回结果为null。在这种特殊情况下不会抛出异常。
类似地,可以计算仅由纬度和经度定义的点的线号和像素号。海拔将自动使用DEM确定。
SensorPixel sensorPixel = rugged.inverseLocation(sensorName, latitude, longitude, minLine, maxLine);
一旦Rugged初始化完成,可以计算传感器看到地球上一点的日期。
对于由地理坐标定义的点:
AbsoluteDate dateLine = rugged.dateLocation(sensorName, gp, minLine, maxLine);
类似地,对于仅由纬度和经度定义的点(使用DEM自动确定海拔):
AbsoluteDate dateLine = rugged.dateLocation(sensorName, latitude, longitude, minLine, maxLine);
Rugged提供了一种只使用卫星的位置-速度来确定线的非常粗略的估计方法。它假设位置-速度足够规则且没有空洞。
OneAxisEllipsoid oneAxisEllipsoid = ruggedBuilder.getEllipsoid();
Frame pvFrame = ruggedBuilder.getInertialFrame();
RoughVisibilityEstimator roughVisibilityEstimator= new RoughVisibilityEstimator(oneAxisEllipsoid, pvFrame, satellitePVList);
可以使用粗略可见性估计器计算近似线:
AbsoluteDate roughLineDate = roughVisibilityEstimator.estimateVisibility(gp);
double roughLine = lineSensor.getLine(roughLineDate);
结果永远不会为空,但如果地面点远离轨迹,可能与实际相差很远。使用这条粗略线,再加上一些余量(例如100),可以将最小/最大行作为反向定位的搜索边界,同时考虑传感器的最小和最大行:
int minLineRough = (int) FastMath.max(FastMath.floor(roughLine - margin), sensorMinLine);
int maxLineRough = (int) FastMath.min(FastMath.floor(roughLine + margin), sensorMaxLine);
然后可以计算反向定位:
SensorPixel sensorPixel = rugged.inverseLocation(sensorName, gp, minLineRough, maxLineRough);
源代码可在InverseLocation.java(src/tutorials下的fr.cs.examples包)中找到