AFSim仿真系统 --- 系统简解_11 行为与行为树

行为与行为树

行为树是一种人工智能技术,它使用户能够快速创建灵活的行为体,这些行为体包含各种战术模块,称为“行为”或“行为节点”。通过连接节点,可以将这些节点以多样且相互关联的方式组合在一起以定义行为。

快速入门

一个行为可以如下定义:

behavior report
   precondition
      return true;
   end_precondition

   execute
      WsfPlatform plat = PLATFORM;
      writeln(plat.Name(), " Report: Status - OK");
   end_execute
end_behavior

report 行为可以在任务处理器的行为树中实现如下:

processor TASK_MANAGER WSF_TASK_PROCESSOR
   update_interval 10 sec
   behavior_tree
      selector
         behavior_node report
      end_selector
   end_behavior_tree
end_processor

任何实现该处理器的平台或平台类型都将把状态消息 OK 报告到控制台和模拟日志中。该行为仅在前置条件返回 true 时被选择——选择器将逐个检查每个行为节点的前置条件,并仅执行第一个前置条件返回 true 的行为。替代的行为控制机制包括序列、并行、优先选择器和加权随机。可以将这些组合并串联使用,以创建任意复杂的行为树。

进一步探讨

注意:以下步骤假设“simple_flight”场景已存在,如在处理器中所述。

添加行为

要将行为添加到 simple_flight 场景,执行以下步骤:

  1. 在 simple_flight 目录中创建一个名为 behaviors.txt 的新文本文件。

  2. 在 track_processor.txt 中添加以下代码行:

    include_once behaviors.txt 

3 后续步骤中实现的行为使用 aux_data,这是一个 AFSIM 命令,可用于为特定平台或平台类型定义自定义变量,以便在任意数量的应用中使用。为了确保行为正常工作,必须在 CARGO_AIRCRAFT 的平台类型定义中添加以下 aux_data 命令块:

aux_data
   struct CARGO_AUX_DATA
      bool collisionExpected = false
      bool offRoute = false
      double lastKnownDistance = -1
   end_struct
end_aux_data

4 此外,应该在同一平台类型的移动器定义中添加爬升率限制。这将确保飞机在合理范围内改变俯仰角。更新 CARGO_AIRCRAFT 移动器定义以反映以下内容:

mover WSF_AIR_MOVER
   update_interval 3 sec
   maximum_flight_path_angle     10 deg
end_mover

   5  打开 behaviors.txt

   6  将以下行为块添加到 behaviors.txt

       第一个行为定义如下,将是货运飞机的默认行为——在平台的 AIR_RADAR 未检测到轨迹时执行。

behavior report_all_clear
   precondition
      WsfLocalTrackList trackList = PLATFORM.TrackList("track_proc");
      return trackList.Empty();
   end_precondition

   execute
      WsfPlatform plat = PLATFORM;
      writeln(plat.Name(), " Report: All Clear");
      if (plat.AuxDataBool("offRoute"))
      {
         plat.ReturnToRoute();
         writeln("\t - Returning to route\n");
         plat.SetAuxData("offRoute", false);
      }
   end_execute
end_behavior

    下一个行为将在任何平台的 AIR_RADAR 检测到轨迹时执行。在执行过程中,它检查该轨迹是否表示存在一平台在碰撞轨迹上。通过比较轨迹的纬度和高度与自身的纬度和高度,来确定是否可能发生碰撞。然后,它使用 aux_data 随着时间的推移来确定轨迹是否正在接近。如果它们处于相同的纬度和高度并且正在接近,则任务处理器生成一个警告——碰撞是预期的,并将该信息提供给平台的 aux data。

behavior report_entity_detected
   precondition
      WsfLocalTrackList trackList = PLATFORM.TrackList("track_proc");
      return !trackList.Empty();
   end_precondition

   execute
      WsfPlatform plat = PLATFORM;
      writeln(plat.Name(), " Report: Entity Detected");

      WsfLocalTrackList trackList = plat.TrackList("track_proc");
      foreach (WsfTrack t in trackList)
      {
         if (plat.Altitude() == t.Altitude())
         {
            double lastDist = plat.AuxDataDouble("lastKnownDistance");
            double currDist = plat.GroundRangeTo(t.CurrentLocation());
            if (lastDist == -1 || lastDist > currDist)
            {
               plat.SetAuxData("lastKnownDistance", currDist);
               writeln("\t - WARNING: Collision Expected!\n");
               plat.SetAuxData("collisionExpected", true);
            }
         }
      }
   end_execute
end_behavior

第三个也是最后一个行为仅在已知平台处于碰撞轨迹上时执行。当此行为被执行时,平台会指示自己在有限范围内随机改变高度。在改变高度后,系统恢复到正常状态,并保持该高度,直到轨迹不再被检测到,此时平台将返回到指定航路。

behavior reroute
   precondition
      WsfPlatform plat = PLATFORM;
      bool collisionExpected = PLATFORM.AuxDataBool("collisionExpected");
      if (collisionExpected)
      {
         writeln(plat.Name(), " Report: Rerouting...");
      }
      return collisionExpected;
   end_precondition

   execute
      WsfPlatform plat = PLATFORM;
      double altDelta = 100 * Math.Ceil(RANDOM.Uniform(0, 30) - 20);
      plat.GoToAltitude(plat.Altitude() + altDelta);
      writeln("\t - New Target Altitude = ", plat.Altitude() + altDelta, "m\n");
      plat.SetAuxData("collisionExpected", false);
      plat.SetAuxData("offRoute", true);
  end_execute
end_behavior


添加行为树


这些行为的顺序对于它们的正确执行至关重要。

   1   可以在 CARGO_TASK_MANAGER 处理器定义块中实现行为树,如下所示:

behavior_tree  
   selector  
      behavior_node report_all_clear  
      behavior_node reroute  
      behavior_node report_entity_detected  
   end_selector  
end_behavior_tree  


  2  通过这些新增功能,货运飞机现在能够在彼此之间自主调整航线。请在 Warlock 中模拟 simple_flight。

 3   将时间推进到 1000 秒(就在飞机彼此足够接近以进行检测之前)。

 4  观察控制台输出中报告的消息,因为平台独立地确定行动方案。将此与它们调整后的飞行轨迹进行比较。

飞行路径应反映类似于以下内容的结果:

 
回顾


随着场景规模的增加,提供此模块中每个更改文件的完整版本已不再实际。如有需要,完整版本将可以在 demos/simple_flight 中找到以备参考。

在此模块中,为 simple_flight 场景添加了一个新文件 behaviors.txt,并对 cargo_aircraft.txt 和 track_processor.txt 进行了更改。

 

track_processor.txt

# track_processor.txt
# A component of the simple_flight demo

include_once behaviors.txt

processor TRACK_MANAGER WSF_TRACK_PROCESSOR
   master_track_processor
   purge_interval 10 sec
   report_interval 3 sec
end_processor

processor CARGO_TASK_MANAGER WSF_TASK_PROCESSOR
   update_interval 10 sec
   behavior_tree
      selector
         behavior_node report_all_clear
         behavior_node reroute
         behavior_node report_entity_detected
      end_selector
   end_behavior_tree
end_processor

cargo_aircraft.txt (platform type)

# cargo_aircraft.txt
# A component of the simple_flight demo
include_once track_processor.txt

...

platform_type CARGO_AIRCRAFT WSF_PLATFORM
   icon c130
   spatial_domain air
   category cargo

   mover WSF_AIR_MOVER
      update_interval 3 sec
      maximum_flight_path_angle     10 deg
   end_mover

   radar_signature CARGO_AIRCRAFT_RADAR_SIG

   add sensor cargo_radar AIR_RADAR
      internal_link track_proc
   end_sensor

   add processor track_proc TRACK_MANAGER
      internal_link task_mgr
   end_processor

   add processor task_mgr CARGO_TASK_MANAGER
   end_processor

   aux_data
      struct CARGO_AUX_DATA
         bool collisionExpected = false
         bool offRoute = false
         double lastKnownDistance = -1
      end_struct
   end_aux_data
end_platform_type


总结


       行为提供了通过 AFSIM 提供的高级能力的一个小部分视图。通过这些新增功能,任意数量的平台可以在直接感知的基础上被自动化为独立工作。当行为和处理器与通信设备连接时,AFSIM 的能力将进一步扩展。

猜你喜欢

转载自blog.csdn.net/zhanglixin999/article/details/142941582