行为与行为树
行为树是一种人工智能技术,它使用户能够快速创建灵活的行为体,这些行为体包含各种战术模块,称为“行为”或“行为节点”。通过连接节点,可以将这些节点以多样且相互关联的方式组合在一起以定义行为。
快速入门
一个行为可以如下定义:
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 场景,执行以下步骤:
-
在 simple_flight 目录中创建一个名为
behaviors.txt
的新文本文件。 -
在
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 的能力将进一步扩展。