2960 lines
259 KiB
Plaintext
2960 lines
259 KiB
Plaintext
|
||
================================================================================
|
||
指令 #1 - 运行 #1 - 2025-12-03 17:09:32
|
||
HTTP状态: 200
|
||
原始指令: 起飞
|
||
模式类型: 简单模式
|
||
尝试次数: 1
|
||
响应时间: 2.46秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
你是一个无人机简单指令执行规划器。你的任务:当用户给出“简单指令”(单一原子动作即可完成)时,输出一个严格的JSON对象。
|
||
|
||
输出要求(必须遵守):
|
||
- 只输出一个JSON对象,不要任何解释或多余文本。
|
||
- JSON结构:
|
||
{"root":{"type":"action","name":"<action_name>","params":{...}}}
|
||
- root节点必须是action类型节点,不能是控制流节点。
|
||
|
||
示例:
|
||
- “起飞到10米” → {"root":{"type":"action","name":"takeoff","params":{"altitude":10.0}}}
|
||
- “移动到(120,80,20)” → {"root":{"type":"action","name":"fly_to_waypoint","params":{"x":120.0,"y":80.0,"z":20.0,"acceptance_radius":2.0}}}
|
||
- “飞机自检” → {"root":{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}}}
|
||
|
||
—— 可用节点定义——
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name": "takeoff", "description": "无人机从当前位置垂直起飞到指定的海拔高度。", "params": {"altitude": "float, 目标海拔高度(米),范围[1, 100],默认为2"}},
|
||
{"name": "land", "description": "降落无人机。可选择当前位置或返航点降落。", "params": {"mode": "string, 可选值: 'current'(当前位置), 'home'(返航点)"}},
|
||
{"name": "fly_to_waypoint", "description": "导航至一个指定坐标点。使用相对坐标系(x,y,z),单位为米。", "params": {"x": "float", "y": "float", "z": "float", "acceptance_radius": "float, 可选,默认2.0"}},
|
||
{"name": "move_direction", "description": "按指定方向直线移动。方向可为绝对方位或相对机体朝向。", "params": {"direction": "string: north|south|east|west|forward|backward|left|right", "distance": "float[1,10000], 可选, 不指定则持续移动"}},
|
||
{"name": "orbit_around_point", "description": "以给定中心点为中心,等速圆周飞行指定圈数。", "params": {"center_x": "float", "center_y": "float", "center_z": "float", "radius": "float[5,1000]", "laps": "int[1,20]", "clockwise": "boolean, 可选, 默认true", "speed_mps": "float[0.5,15], 可选", "gimbal_lock": "boolean, 可选, 默认true"}},
|
||
{"name": "orbit_around_target", "description": "以目标为中心,等速圆周飞行指定圈数(需已有目标)。", "params": {"target_class": "string, 取值同object_detect列表", "description": "string, 可选", "radius": "float[5,1000]", "laps": "int[1,20]", "clockwise": "boolean, 可选, 默认true", "speed_mps": "float[0.5,15], 可选", "gimbal_lock": "boolean, 可选, 默认true"}},
|
||
{"name": "loiter", "description": "在当前位置上空悬停一段时间或直到条件触发。", "params": {"duration": "float, 可选[1,600]", "until_condition": "string, 可选"}},
|
||
{"name": "object_detect", "description": "识别特定目标对象。一般是用户提到的需要检测的目标;如果用户给出了需要探索的目标的优先级,比如蓝色球危险性大于红色球大于绿色球,需要检测最危险的球,此处应给出检测优先级,描述应当为 '蓝>红>绿'", "params": {"target_class": "string, 要识别的目标类别,必须为以下值之一: balloon,person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic_light, fire_hydrant, stop_sign, parking_meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, sports_ball, kite, baseball_bat, baseball_glove, skateboard, surfboard, tennis_racket, bottle, wine_glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, hot_dog, pizza, donut, cake, chair, couch, potted_plant, bed, dining_table, toilet, tv, laptop, mouse, remote, keyboard, cell_phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy_bear, hair_drier, toothbrush", "description": "string, 可选", "count": "int, 可选, 默认1"}},
|
||
{"name": "strike_target", "description": "对已识别目标进行打击。", "params": {"target_class": "string", "description": "string, 可选", "count": "int, 可选, 默认1"}},
|
||
{"name": "battle_damage_assessment", "description": "战损评估。", "params": {"target_class": "string", "assessment_time": "float[5-60], 默认15.0"}},
|
||
{"name": "search_pattern", "description": "按模式搜索。", "params": {"pattern_type": "string: spiral|grid", "center_x": "float", "center_y": "float", "center_z": "float", "radius": "float[5,1000]", "target_class": "string", "description": "string, 可选", "count": "int, 可选, 默认1"}},
|
||
{"name": "track_object", "description": "持续跟踪目标。", "params": {"target_class": "string, 取值同object_detect列表", "description": "string, 可选", "track_time": "float[1,600], 默认30.0", "min_confidence": "float[0.5-1.0], 默认0.7", "safe_distance": "float[2-50], 默认10.0"}},
|
||
{"name": "deliver_payload", "description": "投放物资。", "params": {"payload_type": "string", "release_altitude": "float[2,100], 默认5.0"}},
|
||
{"name": "preflight_checks", "description": "飞行前系统自检。", "params": {"check_level": "string: basic|comprehensive"}},
|
||
{"name": "emergency_return", "description": "执行紧急返航程序。", "params": {"reason": "string"}}
|
||
],
|
||
"conditions": [
|
||
{"name": "battery_above", "description": "电池电量高于阈值。", "params": {"threshold": "float[0.0,1.0]"}},
|
||
{"name": "at_waypoint", "description": "在指定坐标容差范围内。", "params": {"x": "float", "y": "float", "z": "float", "tolerance": "float, 可选, 默认3.0"}},
|
||
{"name": "object_detected", "description": "检测到特定目标。", "params": {"target_class": "string", "description": "string, 可选", "count": "int, 可选, 默认1"}},
|
||
{"name": "target_destroyed", "description": "目标已被摧毁。", "params": {"target_class": "string", "description": "string, 可选", "confidence": "float[0.5-1.0], 默认0.8"}},
|
||
{"name": "time_elapsed", "description": "时间经过。", "params": {"duration": "float[1,2700]"}},
|
||
{"name": "gps_status", "description": "GPS状态良好。", "params": {"min_satellites": "int[6,15], 默认10"}}
|
||
]
|
||
}
|
||
```
|
||
|
||
—— 参数约束——
|
||
- takeoff.altitude: [1, 100]
|
||
- fly_to_waypoint.z: [1, 5000]
|
||
- fly_to_waypoint.x,y: [-10000, 10000]
|
||
- search_pattern.radius: [5, 1000]
|
||
- move_direction.distance: [1, 10000]
|
||
- orbit_around_point.radius: [5, 1000]
|
||
- orbit_around_target.radius: [5, 1000]
|
||
- orbit_around_point/target.laps: [1, 20]
|
||
- orbit_around_point/target.speed_mps: [0.5, 15]
|
||
- 若参考知识提供坐标,必须使用并裁剪到约束范围内
|
||
|
||
—— 口令转化规则(环绕类)——
|
||
- “环绕X米Y圈” → 若有目标上下文则使用 `orbit_around_target`,否则根据是否给出中心坐标选择 `orbit_around_point`;`radius=X`,`laps=Y`,默认 `clockwise=true`,`gimbal_lock=true`
|
||
- “顺时针/逆时针” → `clockwise=true/false`
|
||
- “等速” → 若未给速度则 `speed_mps` 采用默认值(例如3.0);若口令指明速度,裁剪到[0.5,15]
|
||
- “以(x,y,z)为中心”/“当前位置为中心” → 选择 `orbit_around_point` 并填充 `center_x/center_y/center_z`
|
||
|
||
=== User Prompt ===
|
||
起飞
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_is_action: ✅
|
||
root_no_children: ✅
|
||
root_has_name: ✅
|
||
no_mode_field: ✅
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 2.0
|
||
}
|
||
},
|
||
"plan_id": "42903026-b02b-4089-859d-aec5cfa2435e",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n你是一个无人机简单指令执行规划器。你的任务:当用户给出“简单指令”(单一原子动作即可完成)时,输出一个严格的JSON对象。\n\n输出要求(必须遵守):\n- 只输出一个JSON对象,不要任何解释或多余文本。\n- JSON结构:\n{\"root\":{\"type\":\"action\",\"name\":\"<action_name>\",\"params\":{...}}}\n- root节点必须是action类型节点,不能是控制流节点。\n\n示例:\n- “起飞到10米” → {\"root\":{\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}}}\n- “移动到(120,80,20)” → {\"root\":{\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":120.0,\"y\":80.0,\"z\":20.0,\"acceptance_radius\":2.0}}}\n- “飞机自检” → {\"root\":{\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}}}\n\n—— 可用节点定义——\n```json\n{\n \"actions\": [\n {\"name\": \"takeoff\", \"description\": \"无人机从当前位置垂直起飞到指定的海拔高度。\", \"params\": {\"altitude\": \"float, 目标海拔高度(米),范围[1, 100],默认为2\"}},\n {\"name\": \"land\", \"description\": \"降落无人机。可选择当前位置或返航点降落。\", \"params\": {\"mode\": \"string, 可选值: 'current'(当前位置), 'home'(返航点)\"}},\n {\"name\": \"fly_to_waypoint\", \"description\": \"导航至一个指定坐标点。使用相对坐标系(x,y,z),单位为米。\", \"params\": {\"x\": \"float\", \"y\": \"float\", \"z\": \"float\", \"acceptance_radius\": \"float, 可选,默认2.0\"}},\n {\"name\": \"move_direction\", \"description\": \"按指定方向直线移动。方向可为绝对方位或相对机体朝向。\", \"params\": {\"direction\": \"string: north|south|east|west|forward|backward|left|right\", \"distance\": \"float[1,10000], 可选, 不指定则持续移动\"}},\n {\"name\": \"orbit_around_point\", \"description\": \"以给定中心点为中心,等速圆周飞行指定圈数。\", \"params\": {\"center_x\": \"float\", \"center_y\": \"float\", \"center_z\": \"float\", \"radius\": \"float[5,1000]\", \"laps\": \"int[1,20]\", \"clockwise\": \"boolean, 可选, 默认true\", \"speed_mps\": \"float[0.5,15], 可选\", \"gimbal_lock\": \"boolean, 可选, 默认true\"}},\n {\"name\": \"orbit_around_target\", \"description\": \"以目标为中心,等速圆周飞行指定圈数(需已有目标)。\", \"params\": {\"target_class\": \"string, 取值同object_detect列表\", \"description\": \"string, 可选\", \"radius\": \"float[5,1000]\", \"laps\": \"int[1,20]\", \"clockwise\": \"boolean, 可选, 默认true\", \"speed_mps\": \"float[0.5,15], 可选\", \"gimbal_lock\": \"boolean, 可选, 默认true\"}},\n {\"name\": \"loiter\", \"description\": \"在当前位置上空悬停一段时间或直到条件触发。\", \"params\": {\"duration\": \"float, 可选[1,600]\", \"until_condition\": \"string, 可选\"}},\n {\"name\": \"object_detect\", \"description\": \"识别特定目标对象。一般是用户提到的需要检测的目标;如果用户给出了需要探索的目标的优先级,比如蓝色球危险性大于红色球大于绿色球,需要检测最危险的球,此处应给出检测优先级,描述应当为 '蓝>红>绿'\", \"params\": {\"target_class\": \"string, 要识别的目标类别,必须为以下值之一: balloon,person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic_light, fire_hydrant, stop_sign, parking_meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, sports_ball, kite, baseball_bat, baseball_glove, skateboard, surfboard, tennis_racket, bottle, wine_glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, hot_dog, pizza, donut, cake, chair, couch, potted_plant, bed, dining_table, toilet, tv, laptop, mouse, remote, keyboard, cell_phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy_bear, hair_drier, toothbrush\", \"description\": \"string, 可选\", \"count\": \"int, 可选, 默认1\"}},\n {\"name\": \"strike_target\", \"description\": \"对已识别目标进行打击。\", \"params\": {\"target_class\": \"string\", \"description\": \"string, 可选\", \"count\": \"int, 可选, 默认1\"}},\n {\"name\": \"battle_damage_assessment\", \"description\": \"战损评估。\", \"params\": {\"target_class\": \"string\", \"assessment_time\": \"float[5-60], 默认15.0\"}},\n {\"name\": \"search_pattern\", \"description\": \"按模式搜索。\", \"params\": {\"pattern_type\": \"string: spiral|grid\", \"center_x\": \"float\", \"center_y\": \"float\", \"center_z\": \"float\", \"radius\": \"float[5,1000]\", \"target_class\": \"string\", \"description\": \"string, 可选\", \"count\": \"int, 可选, 默认1\"}},\n {\"name\": \"track_object\", \"description\": \"持续跟踪目标。\", \"params\": {\"target_class\": \"string, 取值同object_detect列表\", \"description\": \"string, 可选\", \"track_time\": \"float[1,600], 默认30.0\", \"min_confidence\": \"float[0.5-1.0], 默认0.7\", \"safe_distance\": \"float[2-50], 默认10.0\"}},\n {\"name\": \"deliver_payload\", \"description\": \"投放物资。\", \"params\": {\"payload_type\": \"string\", \"release_altitude\": \"float[2,100], 默认5.0\"}},\n {\"name\": \"preflight_checks\", \"description\": \"飞行前系统自检。\", \"params\": {\"check_level\": \"string: basic|comprehensive\"}},\n {\"name\": \"emergency_return\", \"description\": \"执行紧急返航程序。\", \"params\": {\"reason\": \"string\"}}\n ],\n \"conditions\": [\n {\"name\": \"battery_above\", \"description\": \"电池电量高于阈值。\", \"params\": {\"threshold\": \"float[0.0,1.0]\"}},\n {\"name\": \"at_waypoint\", \"description\": \"在指定坐标容差范围内。\", \"params\": {\"x\": \"float\", \"y\": \"float\", \"z\": \"float\", \"tolerance\": \"float, 可选, 默认3.0\"}},\n {\"name\": \"object_detected\", \"description\": \"检测到特定目标。\", \"params\": {\"target_class\": \"string\", \"description\": \"string, 可选\", \"count\": \"int, 可选, 默认1\"}},\n {\"name\": \"target_destroyed\", \"description\": \"目标已被摧毁。\", \"params\": {\"target_class\": \"string\", \"description\": \"string, 可选\", \"confidence\": \"float[0.5-1.0], 默认0.8\"}},\n {\"name\": \"time_elapsed\", \"description\": \"时间经过。\", \"params\": {\"duration\": \"float[1,2700]\"}},\n {\"name\": \"gps_status\", \"description\": \"GPS状态良好。\", \"params\": {\"min_satellites\": \"int[6,15], 默认10\"}}\n ]\n}\n```\n\n—— 参数约束——\n- takeoff.altitude: [1, 100]\n- fly_to_waypoint.z: [1, 5000]\n- fly_to_waypoint.x,y: [-10000, 10000]\n- search_pattern.radius: [5, 1000]\n- move_direction.distance: [1, 10000]\n- orbit_around_point.radius: [5, 1000]\n- orbit_around_target.radius: [5, 1000]\n- orbit_around_point/target.laps: [1, 20]\n- orbit_around_point/target.speed_mps: [0.5, 15]\n- 若参考知识提供坐标,必须使用并裁剪到约束范围内\n\n—— 口令转化规则(环绕类)——\n- “环绕X米Y圈” → 若有目标上下文则使用 `orbit_around_target`,否则根据是否给出中心坐标选择 `orbit_around_point`;`radius=X`,`laps=Y`,默认 `clockwise=true`,`gimbal_lock=true`\n- “顺时针/逆时针” → `clockwise=true/false`\n- “等速” → 若未给速度则 `speed_mps` 采用默认值(例如3.0);若口令指明速度,裁剪到[0.5,15]\n- “以(x,y,z)为中心”/“当前位置为中心” → 选择 `orbit_around_point` 并填充 `center_x/center_y/center_z`\n\n=== User Prompt ===\n起飞\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #2 - 运行 #1 - 2025-12-03 17:09:43
|
||
HTTP状态: 200
|
||
原始指令: 起飞后移动到学生宿舍上方降落
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 10.02秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞后移动到学生宿舍上方降落
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "loiter",
|
||
"params": {
|
||
"duration": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "86238ad2-e275-4d50-905c-175bd2f26fd0",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞后移动到学生宿舍上方降落\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #3 - 运行 #1 - 2025-12-03 17:09:56
|
||
HTTP状态: 200
|
||
原始指令: 起飞后移动到学生宿舍上方查找蓝色的车
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 12.42秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞后移动到学生宿舍上方查找蓝色的车
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 50.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "d8345bc3-b70f-41d7-b9fc-3e4898d7409e",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞后移动到学生宿舍上方查找蓝色的车\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #4 - 运行 #1 - 2025-12-03 17:10:10
|
||
HTTP状态: 200
|
||
原始指令: 起飞后移动到学生宿舍上方寻找蓝色的车
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 12.86秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞后移动到学生宿舍上方寻找蓝色的车
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 50.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "29b5ee20-c809-4511-af08-80a85240c729",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞后移动到学生宿舍上方寻找蓝色的车\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #5 - 运行 #1 - 2025-12-03 17:10:21
|
||
HTTP状态: 200
|
||
原始指令: 起飞后移动到学生宿舍上方检测蓝色的车
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 10.44秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞后移动到学生宿舍上方检测蓝色的车
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "object_detect",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "5e7eb8c7-287a-469a-b6c0-a4102c1b0dac",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞后移动到学生宿舍上方检测蓝色的车\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #6 - 运行 #1 - 2025-12-03 17:10:34
|
||
HTTP状态: 200
|
||
原始指令: 飞到学生宿舍上方查找蓝色的车
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 11.75秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
飞到学生宿舍上方查找蓝色的车
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 50.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "ef3d1981-1d51-433d-b2f4-2e92838075fd",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n飞到学生宿舍上方查找蓝色的车\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #7 - 运行 #1 - 2025-12-03 17:11:08
|
||
HTTP状态: 200
|
||
原始指令: 飞到学生宿舍上方查找蓝色车辆并进行打击
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 32.89秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
飞到学生宿舍上方查找蓝色车辆并进行打击
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 50.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "d8fc4658-08af-4910-89c4-b029c9a5daa0",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n飞到学生宿舍上方查找蓝色车辆并进行打击\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #8 - 运行 #1 - 2025-12-03 17:11:42
|
||
HTTP状态: 200
|
||
原始指令: 起飞后移动到学生宿舍上方搜索蓝色车辆,并进行打击
|
||
模式类型: 未知模式
|
||
尝试次数: 1
|
||
响应时间: 33.29秒
|
||
结果: ❌ 失败
|
||
错误信息: None
|
||
|
||
部分响应数据:
|
||
{
|
||
"error": "在3次尝试后,仍未能生成一个有效的Pytree。"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #9 - 运行 #1 - 2025-12-03 17:11:56
|
||
HTTP状态: 200
|
||
原始指令: 起飞到学生宿舍上方搜索被困人员,并为被困人员投递救援物资
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 12.31秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞到学生宿舍上方搜索被困人员,并为被困人员投递救援物资
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "object_detect",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "(被困人员)"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "(被困人员)"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "(被困人员)",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "deliver_payload",
|
||
"params": {
|
||
"payload_type": "rescue_kit",
|
||
"release_altitude": 5.0
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "7fbf0091-f7d3-4c3a-a6b7-4c0bfd4df66e",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞到学生宿舍上方搜索被困人员,并为被困人员投递救援物资\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #10 - 运行 #1 - 2025-12-03 17:12:09
|
||
HTTP状态: 200
|
||
原始指令: 飞到学生宿舍上方搜索方圆10米范围内的蓝色车辆
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 12.20秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
飞到学生宿舍上方搜索方圆10米范围内的蓝色车辆
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 10.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "3ae0b258-b7e4-460c-9cfe-4b224266edc4",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n飞到学生宿舍上方搜索方圆10米范围内的蓝色车辆\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #11 - 运行 #1 - 2025-12-03 17:12:23
|
||
HTTP状态: 200
|
||
原始指令: 飞到学生宿舍上方搜索半径为10米区域范围内的蓝色车辆
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 12.81秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
飞到学生宿舍上方搜索半径为10米区域范围内的蓝色车辆
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "search_pattern",
|
||
"params": {
|
||
"pattern_type": "grid",
|
||
"center_x": 5.0,
|
||
"center_y": 3.0,
|
||
"center_z": 2.0,
|
||
"radius": 10.0,
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "strike_target",
|
||
"params": {
|
||
"target_class": "car",
|
||
"description": "蓝色"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "2acb84cf-c89e-460d-a4d9-8d1edb4ee69a",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n飞到学生宿舍上方搜索半径为10米区域范围内的蓝色车辆\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|
||
|
||
================================================================================
|
||
指令 #12 - 运行 #1 - 2025-12-03 17:12:35
|
||
HTTP状态: 200
|
||
原始指令: 起飞到学生宿舍搜索有没有被困人员,然后抛洒救援物资
|
||
模式类型: 复杂模式
|
||
尝试次数: 1
|
||
响应时间: 11.07秒
|
||
结果: ✅ 成功
|
||
|
||
📝 组织后的Prompt:
|
||
=== System Prompt ===
|
||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}},
|
||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}},
|
||
{"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}},
|
||
{"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||
{"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}},
|
||
{"name":"emergency_return","params":{"reason":"string"}}
|
||
],
|
||
"conditions": [
|
||
{"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}},
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}},
|
||
{"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}},
|
||
{"name":"time_elapsed","params":{"duration":"[1,2700]秒"}},
|
||
{"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致);
|
||
2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);
|
||
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
|
||
|
||
|
||
## 三、行为树固定结构(通用不变,确保安全验证)
|
||
根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {"policy": "all_success"},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
// 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):
|
||
{"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值)
|
||
{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}},
|
||
{"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标
|
||
{"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}},
|
||
{"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {"memory": true},
|
||
"children": [
|
||
{"type":"condition","name":"battery_above","params":{"threshold":0.3}},
|
||
{"type":"condition","name":"gps_status","params":{"min_satellites":8}},
|
||
{
|
||
"type":"Sequence",
|
||
"name":"EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}},
|
||
{"type":"action","name":"land","params":{"mode":"home"}}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## 四、优先级排序任务通用示例
|
||
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
|
||
| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |
|
||
|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|
|
||
| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` |
|
||
| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` |
|
||
|
||
|
||
## 五、高频错误规避(确保验证通过)
|
||
1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;
|
||
2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;
|
||
3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`);
|
||
4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);
|
||
5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。
|
||
|
||
|
||
## 六、输出要求
|
||
仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。
|
||
|
||
|
||
【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。
|
||
|
||
=== User Prompt ===
|
||
起飞到学生宿舍搜索有没有被困人员,然后抛洒救援物资
|
||
|
||
---
|
||
参考知识:
|
||
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
|
||
在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。
|
||
|
||
在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。
|
||
|
||
在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。
|
||
---
|
||
|
||
验证结果:
|
||
is_dict: ✅
|
||
has_root: ✅
|
||
has_plan_id: ✅
|
||
has_visualization_url: ✅
|
||
root_has_children: ✅
|
||
no_mode_field: ✅
|
||
leaf_nodes_valid: ✅
|
||
has_safety: ✅
|
||
⚠️ 无效动作节点: ['track_object']
|
||
|
||
完整API响应:
|
||
{
|
||
"root": {
|
||
"type": "Parallel",
|
||
"name": "MissionWithSafety",
|
||
"params": {
|
||
"policy": "all_success"
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "preflight_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "fly_to_waypoint",
|
||
"params": {
|
||
"x": 5.0,
|
||
"y": 3.0,
|
||
"z": 2.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "object_detect",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "被困在学生宿舍"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "被困在学生宿舍"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "track_object",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "被困在学生宿舍",
|
||
"track_time": 30.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "deliver_payload",
|
||
"params": {
|
||
"payload_type": "rescue_kit",
|
||
"release_altitude": 5.0
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "Selector",
|
||
"name": "SafetyMonitor",
|
||
"params": {
|
||
"memory": true
|
||
},
|
||
"children": [
|
||
{
|
||
"type": "condition",
|
||
"name": "battery_above",
|
||
"params": {
|
||
"threshold": 0.3
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "gps_status",
|
||
"params": {
|
||
"min_satellites": 8
|
||
}
|
||
},
|
||
{
|
||
"type": "Sequence",
|
||
"name": "EmergencyHandler",
|
||
"params": {},
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "emergency_return",
|
||
"params": {
|
||
"reason": "safety_breach"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "home"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "c05d46c9-1b1b-4c8d-b64b-86b76d0c4099",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n起飞到学生宿舍搜索有没有被困人员,然后抛洒救援物资\n\n---\n参考知识:\n以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:\n在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在 (x:5, y:3, z:2)。\n\n在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在 (x:15, y:-8.5, z:1.2)。\n\n在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在 (x:10, y:-10, z:2)。\n---"
|
||
}
|