顶层设计描述了各个库及其之间的交互。为了清晰起见,这里没有显示对应于Hipparchus库的最低级别。
以下序列和类图显示了三个最重要的功能:库的初始化、直接定位和反向定位。最后一个类图是关于数字高程模型加载的重点。
Rugged库的用户负责提供其主程序和特定任务的数字高程模型加载器,以实现Rugged TileUpdater接口的类形式。他还创建一个包含像素视线几何的LineSensor。然后,他创建一个顶层Rugged类的实例,并将创建的对象以及算法、椭球体和坐标系选择的选项提供给它。
Rugged实例将存储所有内容,并创建定义配置的各种对象(从用户提供的标识符创建算法、椭球体和坐标系)。对于不是空间飞行动力学专家的常规用户来说,使用简单的枚举类型来表示坐标系或椭球体可以提供更简单的接口。对于专家用户,如果预定义的标识符不能满足其需求,用户还可以直接创建这些对象并将它们传递给Rugged。如下图所示,可以向单个Rugged实例添加多个线传感器,这旨在计算相关性网格,当预计需要精确组合来自两个不同传感器的图像时。
直接定位是应用程序调用的次数很多的方法,每个传感器线路调用一次。应用程序只向配置的Rugged实例提供与图像处理相关的数据,例如线路号,然后期望得到与传感器线路中每个像素对应的地面点的大地坐标。Rugged实例将会将帧之间的转换委托给一个内部的SpacecraftToObservedBody转换器,将笛卡尔坐标和大地坐标之间的转换委托给一个内部的ExtendedEllipsoid对象,将与数字高程模型的相交计算委托给用户在配置时选择的算法。
独立像素的计算(轨道和姿态插值,地球坐标系到惯性坐标系的转换,转换组合)仅在初始化时设置的缓存组合变换提供程序中每个日期只执行一次,并且生成的变换应用于线路中的所有像素,从而节省了大量的计算能力。
最内层的循环是对每个像素的校正,它被分为与椭球体相交的视线和与数字高程模型相交。从内循环中调用任务特定接口以检索DEM原始数据,但由于Rugged库级别的缓存功能,预计只会触发很少的次数。
下图描述了用于瓦片选择的算法以及如何为一个瓦片调用底层相交算法(本例中为Duvenhage算法):
推荐的数字高程模型相交算法是Duvenhage算法。下图描述了它在Rugged库中的实现方式。
反向定位在应用程序中被大量调用,通常在某个地理参考系(如UTM)的规则网格上。应用程序只提供与图像处理相关的数据,即地面点的大地坐标,并期望得到相应像素的坐标(行号和像素号)。像素独立计算(轨道和姿态插值、地球坐标系到惯性坐标系的转换、转换组合)仅在每行执行一次,并在连续调用反向定位时进行缓存,从而大大提高性能。
计算分为几个步骤。首先使用专用求解器搜索点所属的行,该求解器利用了Orekit转换中自动包含的第一时间导数。因此,它可以建立目标点与平均传感器平面之间的角度模型,并且仅通过两次或三次迭代计算出该平面的精确交叉点,从而得到相应的行号。然后,使用Hipparchus中提供的通用求解器搜索该交叉点沿着行的位置。由于此时所有坐标已在航天器坐标系中已知,因此不需要进行转换,这个求解器可以非常快速地找到相应的像素。最后两个步骤是修正之前的结果,当行传感器中的各个像素实际上并不形成一条精确的直线时,以及当使用平均平面进行的先前计算不代表实际情况时,这一点可能很重要。这些最终的修正很容易进行,因为第一步实际上提供了一个Taylor展开,从而允许根据需要轻微调整结果。
数字高程模型在Rugged库中以非常低的级别使用,但在任务特定接口库中以较高的级别读取。为了允许较低层将加载的实现委托给较高层,并避免过多的调用,选择了以下设计。驱动原则是为DEM瓦片设置一个缓存,将最近使用的瓦片集保留在内存中,最多可自定义的瓦片数量,并在内存中的内容不覆盖感兴趣区域时请求新的瓦片。
缓存和瓦片本身在Rugged库级别上实现。加载器在任务特定接口级别上实现,通过实现TileUpdater接口来定义一个updateTile方法。当缓存调用此updateTile方法时,其中一个参数是一个UpdatableTile实例,必须对其进行更新。实现首先必须调用setGeometry方法一次,以设置瓦片的全局几何信息(参考纬度和经度、纬度步长、经度步长、栅格中的行数和列数),然后对栅格的每个元素调用setElevation方法。因此,加载器可以避免自己分配一个大数组,因为该数组无论如何都将由Tile重新分配。加载器只在API中看到接口,对底层使用的真实专用瓦片一无所知。不同的DEM交叉算法可以使用不同的瓦片实现,而不需要对任务特定接口进行任何更改。这种独立性的一个例子对应于Duvenhage算法,除了原始高程网格外,该瓦片还包含一个最小/最大kd树,因此在运行此算法时使用了专用的专用瓦片和相应的TileFactory。