跟踪基础
轨迹流 与WSF中的平台不同,轨迹并不是仿真中的实例实体。通常,轨迹是由一个平台上的传感器直接检测到另一个平台后产生的。如果一个平台通过传感器“看见”另一个平台,就会创建一个“轨迹”。这个创建的“轨迹”包含描述它是如何生成的、是哪个传感器创建的、目标是什么、目标位置在哪里等信息。每个轨迹都有关于“感知”的目标平台的真实信息和感知信息。
在平台上,传感器通常将其追踪信息发送到追踪处理器。为了简化,将追踪管理器和追踪处理器的组合定义为追踪处理器。追踪处理器中的追踪管理器存储追踪信息,并使追踪信息可供其他平台以及平台的任务处理器访问。追踪处理器在指定时间间隔内向指定的机载或机外方发送追踪更新。如果传感器不再提供追踪更新,追踪处理器可以融合追踪信息、提供原始追踪信息,甚至删除追踪信息。在某些情况下,追踪处理器也被称为“数据管理器”。
追踪处理器保留追踪信息以供任务处理器读取。在WSF中,任务处理器是可编程的,用户可以编写独特的平台脚本,根据追踪管理器/处理器中追踪列表内的追踪信息来制定行为。任务处理器由有限状态机组成(本文未涵盖该主题)。
重要的是要注意,任务处理器一次只能处理一个追踪。如果追踪管理器/处理器提供了多个追踪,则任务处理器内的状态机可能会多次发生。
追踪管理器与追踪处理器
每个处理追踪的平台都应该有一个追踪管理器。在平台级别,track_managerend_track_manager块为平台的主追踪列表配置追踪维护和融合。如果平台只有一个追踪处理器,那么它也应该是主追踪处理器,否则主追踪列表将无法通过脚本访问。当存在多个追踪处理器时,追踪管理器和追踪处理器之间的区别变得显而易见。如果平台有多个追踪处理器,则追踪处理器内的次级track_manager end_track_manager块会定义一个备用追踪列表,该列表与主追踪列表分开维护。在这个例子中,第二个追踪处理器仅从sensor2提供追踪,并会维护一个与主追踪列表不同的备用追踪列表。
连接传感器、通信和处理器以传递追踪
为了使平台上的对象(传感器、通信或处理器)能够向同一平台上的另一个对象提供或发送追踪,需要使用“internal_link”或“processor <处理器名称>”子命令。这些子命令指定源自此对象的消息应路由到同一平台上的指定通信或处理器对象。
为了将追踪传递至机外(至另一个平台),需要使用“report_to”或“external_link”。在所示示例中,名为“data_mgr”的追踪处理器没有与任务处理器的内部链接。这是因为WSF中的任务处理器可以隐式访问追踪管理器。此示例中的FIGHTER定义已简化,仅用于说明目的。
追踪名称和定义的类型
本地追踪
本地追踪是存储在追踪处理器本地追踪列表中的任何追踪。如果追踪处理器是主追踪处理器,则本地追踪列表与主追踪列表相同。
原始或非本地追踪
原始追踪是指经过预处理但尚未存储在处理器追踪列表中的追踪。这种追踪数据可能处于初步处理阶段,等待进一步验证或筛选,以确定是否应将其纳入系统的追踪列表中。
融合追踪
融合追踪是指已经过追踪管理器处理,并通过追踪算法进行关联和融合后的追踪。默认情况下,追踪管理器会先使用完美的关联算法,然后采用替换追踪融合方法来处理。虽然有多种追踪融合算法可供选择,但这超出了本文的讨论范围。融合追踪通过整合多个数据源的信息,提高了追踪的准确性和可靠性。
过滤追踪
传感器或追踪管理器可以使用卡尔曼滤波器、Alpha-Beta滤波器或Alpha-Beta-Gamma滤波器来过滤追踪。这些滤波器的作用是将测量的距离、方位角和仰角数据转换为X-Y-Z坐标位置,从而去除噪声和误差,提高追踪数据的准确性。
需要注意的是,上述定义之间并不是孤立的,它们之间存在一定的关系。例如,一个本地追踪在经过进一步处理后,也可能成为一个融合追踪。这取决于追踪数据的处理流程和系统的具体需求。
在任务处理器中使用追踪信息
如前所述,任务处理器是可编程的,用户可以通过创建WSF脚本来根据接收到的追踪信息创建平台行为。这些行为可能包括发射武器、修改路线、发送消息或根据追踪信息为下属分配任务等。在任务处理器中,WSF仅当脚本在状态机上下文中被调用时,才通过预定义的TRACK变量提供对当前正在操作的本地追踪的访问权限。简而言之,如果定义的脚本是on_update/on_initialize/on_message脚本的一部分,则TRACK变量不可供其他处理器、脚本或甚至任务处理器本身使用。脚本必须从状态机中特别调用才能使用TRACK变量。在任务处理器中使用TRACK变量的示例语句包括:
weapon.CueToTarget(TRACK); # command a weapon to cue to a TRACK return (TimeSinceWeaponLastTerminatedFor(TRACK.TrackId()) > 0.0); # return a boolean return (WeaponsActiveFor(TRACK.TrackId()) > 0); # return a boolean
在任务处理器外部使用追踪信息
在其他处理器和脚本(不在任务处理器内部)的情况下,追踪信息必须首先通过类型转换和分配一个使用复杂类型WsfTrack
的变量来提取。以下是使用复杂类型WsfTrack
进行类型转换和设置名为track
的变量的几个示例语句:
WsfTrack track = msg.Track(); # msg previously defined WsfTrack track = aPlatform.CurrentTargetTrack(); # aPlatform previously defined
脚本示例:设置轨迹变量并使用它:
WsfLocalTrackList trackList = PLATFORM.MasterTrackList(); if (trackList.TrackCount() > 0) { print("T=", TIME_NOW, " Turning sensor on"); WsfTrack track = trackList.TrackEntry(0); sar.CueToTrack(track); sar.TurnOn(); }
轨迹信息
根据轨迹的创建方式,可以提取关于轨迹的信息或“属性”。以下示例说明了如何在任务处理器中从轨迹数据中提取信息以设置变量(完整列表请参见WsfTrack):
string targetname = TRACK.TargetName(); # Gets target name (truth data) double targetlat = TRACK.Latitude(); # Gets target latitude double targetlon = TRACK.Longitude(); # Gets target longitude double lastupdate = TRACK.TimeSinceUpdated(); # Gets last track updated time string targettype = TRACK.TargetType(); # Gets target type (truth data) double reltgtalt = TRACK.Altitude() - PLATFORM.Altitude(); # Gets track alt less my alt double trackquality = TRACK.TrackQuality(); # Gets track quality int signalcount = TRACK.SignalCount(); # Gets how many times we detected this emitter
另请注意,除了WsfTrack之外,还有几种脚本类型可以访问轨迹信息。例如,WsfPlatform提供了几种提取轨迹信息的方法,如下所示:
double slantrangetotarget = PLATFORM.SlantRangeTo(TRACK); double relativebearingtotarget = RelativeBearingTo(TRACK);
追踪真实情况与感知
模拟中的追踪信息可以是基于真实情况,也可以是基于感知信息。关于追踪的感知信息包含传感器(位置)误差以及追踪速度误差。如果追踪是通过完美的几何传感器创建的,那么追踪位置信息也是基于真实情况而非感知。其他信息,如目标名称和类型,无论传感器是否提供完美的追踪位置,都将基于真实情况。
非传感器来源的追踪
之前提到,追踪通常是由传感器创建的。然而,追踪也可以通过其他方式创建。
预先通报的追踪
追踪可以在场景输入文件(track end_track 块)中创建。例如,轰炸机有一个目标位置(如建筑物或地对空导弹系统),这是平台在模拟开始前需要攻击的目标(或目标群)。预先通报的追踪代表了这些目标。显然,预先通报的追踪并不具备传感器生成的追踪所具有的所有属性。
由平台创建的追踪
在WSF(可能是指某种模拟或战争模拟框架)中,追踪可以通过一种称为MakeTrack()的方法从WsfTrack类型中创建。例如,编队飞行的指挥官可以创建所有下属平台的追踪:
oreach (WsfPlatform sub in PLATFORM.Subordinates("")) { WsfTrack track = sub.MakeTrack(); writeln("Platform: ", sub.Name()); writeln("Slant Range: ", PLATFORM.SlantRangeTo(track)); writeln("Ground Range: ", PLATFORM.GroundRangeTo(track)); }
在模拟层面创建追踪的另一种方式:
WsfTrack track = WsfSimulation.FindPlatform("target_1").MakeTrack(); # target_1 must exist
当然,可以创建一个平台的追踪:
WsfTrack track = PLATFORM.MakeTrack();
访问追踪信息的脚本类型
WsfTrack()
WsfTrack 是定义追踪的基础对象。已经给出了几个示例。
WsfTrackList()
脚本类型 WsfTrackList 保存了对所有 WsfTrack 对象的引用。
WsfLocalTrack()
WsfLocalTrack 代表处理器对追踪的本地感知,是一个或多个贡献 WsfTrack 对象的组合。贡献的追踪有时被称为“原始”追踪,并代表传感器或其他平台的产品。WsfLocalTrack 包含 WsfTrack 所有的信息,但还添加了额外的贡献者信息。预定义的 TRACK 变量是一个 WsfLocalTrack。
WsfLocalTrackList()
WsfLocalTrackList 是对 WsfLocalTrack 对象引用的容器。如果平台上只有一个追踪管理器且包含主追踪列表,则本地追踪列表将与主追踪列表相同。以下是如何访问该容器的示例:
(注意:由于这是一个示例说明,具体的访问代码将取决于你所使用的编程环境或框架。但通常,你会通过某种形式的遍历或查询来访问 WsfLocalTrackList 中的元素,从而获取或操作 WsfLocalTrack 对象。)
WsfLocalTrackList trackList = PLATFORM.MasterTrackList();
WsfTrackId()
WsfTrackId 对象用于标识由 WsfTrack 和 WsfLocalTrack 定义的追踪。每个追踪都有一个与之关联的追踪ID,用于唯一地识别追踪。要访问追踪ID,会使用 TrackId()(注意:这里可能是指获取追踪ID的某种方法或属性,但具体名称TrackId()
可能因实际框架或API而异)。示例用途可能包括:
WsfTrackId trackid = TRACK.TrackId(); WsfTrackId currenttargetid = PLATFORM.CurrentTarget();#CurrentTarget method from WsfPlatform
For further explanation of task processors, see Task Processor Primer.