当前位置: 首页 > news >正文

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

行为与行为树

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

快速入门

一个行为可以如下定义:

behavior reportpreconditionreturn true;end_preconditionexecuteWsfPlatform plat = PLATFORM;writeln(plat.Name(), " Report: Status - OK");end_execute
end_behavior

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

processor TASK_MANAGER WSF_TASK_PROCESSORupdate_interval 10 secbehavior_treeselectorbehavior_node reportend_selectorend_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_datastruct CARGO_AUX_DATAbool collisionExpected = falsebool offRoute = falsedouble lastKnownDistance = -1end_struct
end_aux_data

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

mover WSF_AIR_MOVERupdate_interval 3 secmaximum_flight_path_angle     10 deg
end_mover

   5  打开 behaviors.txt

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

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

behavior report_all_clearpreconditionWsfLocalTrackList trackList = PLATFORM.TrackList("track_proc");return trackList.Empty();end_preconditionexecuteWsfPlatform 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_detectedpreconditionWsfLocalTrackList trackList = PLATFORM.TrackList("track_proc");return !trackList.Empty();end_preconditionexecuteWsfPlatform 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 reroutepreconditionWsfPlatform plat = PLATFORM;bool collisionExpected = PLATFORM.AuxDataBool("collisionExpected");if (collisionExpected){writeln(plat.Name(), " Report: Rerouting...");}return collisionExpected;end_preconditionexecuteWsfPlatform 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 demoinclude_once behaviors.txtprocessor TRACK_MANAGER WSF_TRACK_PROCESSORmaster_track_processorpurge_interval 10 secreport_interval 3 sec
end_processorprocessor CARGO_TASK_MANAGER WSF_TASK_PROCESSORupdate_interval 10 secbehavior_treeselectorbehavior_node report_all_clearbehavior_node reroutebehavior_node report_entity_detectedend_selectorend_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_PLATFORMicon c130spatial_domain aircategory cargomover WSF_AIR_MOVERupdate_interval 3 secmaximum_flight_path_angle     10 degend_moverradar_signature CARGO_AIRCRAFT_RADAR_SIGadd sensor cargo_radar AIR_RADARinternal_link track_procend_sensoradd processor track_proc TRACK_MANAGERinternal_link task_mgrend_processoradd processor task_mgr CARGO_TASK_MANAGERend_processoraux_datastruct CARGO_AUX_DATAbool collisionExpected = falsebool offRoute = falsedouble lastKnownDistance = -1end_structend_aux_data
end_platform_type

 


总结


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


http://www.mrgr.cn/news/50489.html

相关文章:

  • 苹果研究员质疑大模型!我们测试了6款,发现了4大真相
  • 病毒感染时间 题解 MarsCode
  • CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR
  • GestaltMML——用于诊断罕见遗传疾病的多模态模型
  • 网站服务器监控:Lighttpd指标解读
  • numactl 设置 numa 内存分配规则
  • VUE项目基于源码实现可视化编程技术的探索
  • 【C语言教程】【常用类库】(十二)信号处理库 - <signal.h>
  • 【论文速读】字节跳动音乐生成模型 Seed-Music
  • keepalived实现高可用
  • Spark内置函数:字符串、日期和时间函数、聚合函数、数值函数、条件判断函数、窗口函数
  • YOLOv11改进策略【卷积层】| ECCV-2024 Histogram Transformer Block 适用于噪声大,图像质量低的检测任务
  • 学会分享是一种快乐的事情
  • 【保姆级】手把手带你用MyBatis Plus制作代码生成器
  • OpenCV高级图形用户界面(9)更改指定窗口的位置函数moveWindow()的使用
  • 护眼台灯哪个品牌更好?五款目前比较好用的护眼台灯
  • 今年双十一有什么值得买?高性价比好物推荐!
  • ubuntu安装docker及docker compose
  • Midjourney官宣网页版免费用!前谷歌大佬祭出AI生图2.0,全网惊艳实测
  • 代码随想录 -- 贪心 -- 摆动序列