Files
DronePlanning/tools/api_test.log

2168 lines
274 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[2025-12-02 21:36:22] ================================================================================
[2025-12-02 21:36:22] --- API Test: Generate Plan ---
[2025-12-02 21:36:22] URL: http://127.0.0.1:8000/generate_plan
[2025-12-02 21:36:22] Sending Prompt: "已知目标检测红色气球危险性高于蓝色气球高于绿色气球飞往搜索区搜索并锁定危险性最高的气球对其跟踪30秒后进行打击操作"
[2025-12-02 21:36:22] ❌ TEST FAILED: Could not connect to the server.
Please make sure the backend service is running.
Error details: HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: /generate_plan (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f7d2dd27230>: Failed to establish a new connection: [Errno 111] Connection refused'))
[2025-12-02 21:36:22] ================================================================================
[2025-12-02 21:36:22]
[2025-12-02 21:38:38] ================================================================================
[2025-12-02 21:38:38] --- API Test: Generate Plan ---
[2025-12-02 21:38:38] URL: http://127.0.0.1:8000/generate_plan
[2025-12-02 21:38:38] Sending Prompt: "已知目标检测红色气球危险性高于蓝色气球高于绿色气球飞往搜索区搜索并锁定危险性最高的气球对其跟踪30秒后进行打击操作"
[2025-12-02 21:38:51] ✅ Received Response:
[2025-12-02 21:38:51]
📝 组织后的Prompt:
[2025-12-02 21:38:51] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ===
已知目标检测红色气球危险性高于蓝色气球高于绿色气球飞往搜索区搜索并锁定危险性最高的气球对其跟踪30秒后进行打击操作
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '学生宿舍' 的地点或区域它的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)。
---
[2025-12-02 21:38:51]
完整响应内容:
[2025-12-02 21:38:51] {
"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": 15.0,
"y": -8.5,
"z": 1.2
}
},
{
"type": "action",
"name": "search_pattern",
"params": {
"pattern_type": "grid",
"center_x": 15.0,
"center_y": -8.5,
"center_z": 1.1,
"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": "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": "a4ed4c91-a277-4ab5-b3c1-7fd351f0e844",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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已知目标检测红色气球危险性高于蓝色气球高于绿色气球飞往搜索区搜索并锁定危险性最高的气球对其跟踪30秒后进行打击操作\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---"
}
[2025-12-02 21:38:51]
--- Validation Checks ---
[2025-12-02 21:38:51] PASS: Response is a valid JSON object.
[2025-12-02 21:38:51] PASS: Response contains a valid 'root' key.
[2025-12-02 21:38:51] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-02 21:38:51] ✅ Test completed successfully
[2025-12-02 21:38:51] ================================================================================
[2025-12-02 21:38:51]
[2025-12-03 16:49:51] ================================================================================
[2025-12-03 16:49:51] --- API Test: Generate Plan ---
[2025-12-03 16:49:51] URL: http://127.0.0.1:8000/generate_plan
[2025-12-03 16:49:51] Sending Prompt: "起飞"
[2025-12-03 16:49:57] ✅ Received Response:
[2025-12-03 16:49:57]
📝 原始Prompt:
[2025-12-03 16:49:57] 起飞
[2025-12-03 16:49:57] (注: 组织后的prompt未在API响应中返回如需查看请检查后端日志)
[2025-12-03 16:49:57]
完整响应内容:
[2025-12-03 16:49:57] {
"error": "在3次尝试后仍未能生成一个有效的Pytree。"
}
[2025-12-03 16:49:57]
--- Validation Checks ---
[2025-12-03 16:49:57] PASS: Response is a valid JSON object.
[2025-12-03 16:49:57] FAIL: Response does not contain a valid 'root' key.
[2025-12-03 16:49:57] FAIL: Response does not contain a valid 'visualization_url'.
[2025-12-03 16:49:57] ✅ Test completed successfully
[2025-12-03 16:49:57] ================================================================================
[2025-12-03 16:49:57]
[2025-12-03 16:56:53] ================================================================================
[2025-12-03 16:56:53] --- API Test: Generate Plan ---
[2025-12-03 16:56:53] URL: http://127.0.0.1:8000/generate_plan
[2025-12-03 16:56:53] Sending Prompt: "起飞"
[2025-12-03 16:56:59] ✅ Received Response:
[2025-12-03 16:56:59]
📝 原始Prompt:
[2025-12-03 16:56:59] 起飞
[2025-12-03 16:56:59] (注: 组织后的prompt未在API响应中返回如需查看请检查后端日志)
[2025-12-03 16:56:59]
完整响应内容:
[2025-12-03 16:56:59] {
"error": "在3次尝试后仍未能生成一个有效的Pytree。"
}
[2025-12-03 16:56:59]
--- Validation Checks ---
[2025-12-03 16:56:59] PASS: Response is a valid JSON object.
[2025-12-03 16:56:59] FAIL: Response does not contain a valid 'root' key.
[2025-12-03 16:56:59] FAIL: Response does not contain a valid 'visualization_url'.
[2025-12-03 16:56:59] ✅ Test completed successfully
[2025-12-03 16:56:59] ================================================================================
[2025-12-03 16:56:59]
[2025-12-03 17:00:50] ================================================================================
[2025-12-03 17:00:50] --- API Test: Generate Plan ---
[2025-12-03 17:00:50] URL: http://127.0.0.1:8000/generate_plan
[2025-12-03 17:00:50] Sending Prompt: "起飞"
[2025-12-03 17:00:55] ✅ Received Response:
[2025-12-03 17:00:55]
📝 原始Prompt:
[2025-12-03 17:00:55] 起飞
[2025-12-03 17:00:55] (注: 组织后的prompt未在API响应中返回如需查看请检查后端日志)
[2025-12-03 17:00:55]
完整响应内容:
[2025-12-03 17:00:55] {
"error": "在3次尝试后仍未能生成一个有效的Pytree。"
}
[2025-12-03 17:00:55]
--- Validation Checks ---
[2025-12-03 17:00:55] PASS: Response is a valid JSON object.
[2025-12-03 17:00:55] FAIL: Response does not contain a valid 'root' key.
[2025-12-03 17:00:55] FAIL: Response does not contain a valid 'visualization_url'.
[2025-12-03 17:00:55] ✅ Test completed successfully
[2025-12-03 17:00:55] ================================================================================
[2025-12-03 17:00:55]
[2025-12-03 17:01:59] ================================================================================
[2025-12-03 17:01:59] --- API Test: Generate Plan ---
[2025-12-03 17:01:59] URL: http://127.0.0.1:8000/generate_plan
[2025-12-03 17:01:59] Sending Prompt: "起飞"
[2025-12-03 17:02:02] ✅ Received Response:
[2025-12-03 17:02:02]
📝 组织后的Prompt:
[2025-12-03 17:02:02] === 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)。
---
[2025-12-03 17:02:02]
完整响应内容:
[2025-12-03 17:02:02] {
"root": {
"type": "action",
"name": "takeoff",
"params": {
"altitude": 2.0
}
},
"plan_id": "d2bd4b4f-0ab4-44d3-8e14-93216d1c2227",
"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---"
}
[2025-12-03 17:02:02]
--- Validation Checks ---
[2025-12-03 17:02:02] PASS: Response is a valid JSON object.
[2025-12-03 17:02:02] PASS: Response contains a valid 'root' key.
[2025-12-03 17:02:02] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-03 17:02:02] ✅ Test completed successfully
[2025-12-03 17:02:02] ================================================================================
[2025-12-03 17:02:02]
[2025-12-06 12:43:40] ================================================================================
[2025-12-06 12:43:40] --- API Test: Generate Plan ---
[2025-12-06 12:43:40] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 12:43:40] Sending Prompt: "起飞"
[2025-12-06 12:43:42] ✅ Received Response:
[2025-12-06 12:43:42]
📝 组织后的Prompt:
[2025-12-06 12:43:42] === 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)。
---
[2025-12-06 12:43:42]
完整响应内容:
[2025-12-06 12:43:42] {
"root": {
"type": "action",
"name": "takeoff",
"params": {
"altitude": 2.0
}
},
"plan_id": "3057857d-45f9-4e2e-906c-e318338e8424",
"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---"
}
[2025-12-06 12:43:42]
--- Validation Checks ---
[2025-12-06 12:43:42] PASS: Response is a valid JSON object.
[2025-12-06 12:43:42] PASS: Response contains a valid 'root' key.
[2025-12-06 12:43:42] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 12:43:42] ✅ Test completed successfully
[2025-12-06 12:43:42] ================================================================================
[2025-12-06 12:43:42]
[2025-12-06 13:09:11] ================================================================================
[2025-12-06 13:09:11] --- API Test: Generate Plan ---
[2025-12-06 13:09:11] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:09:11] Sending Prompt: "起飞"
[2025-12-06 13:09:13] ✅ Received Response:
[2025-12-06 13:09:13]
📝 组织后的Prompt:
[2025-12-06 13:09:13] === 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"}}
],
"conditions": [
{"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]"}}
]
}
```
—— 参数约束——
- 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)。
---
[2025-12-06 13:09:13]
完整响应内容:
[2025-12-06 13:09:13] {
"root": {
"type": "action",
"name": "takeoff",
"params": {
"altitude": 2.0
}
},
"plan_id": "81f74321-b55f-4cde-a408-c4669d618f53",
"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 ],\n \"conditions\": [\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 ]\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---"
}
[2025-12-06 13:09:13]
--- Validation Checks ---
[2025-12-06 13:09:13] PASS: Response is a valid JSON object.
[2025-12-06 13:09:13] PASS: Response contains a valid 'root' key.
[2025-12-06 13:09:13] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:09:13] ✅ Test completed successfully
[2025-12-06 13:09:13] ================================================================================
[2025-12-06 13:09:13]
[2025-12-06 13:09:31] ================================================================================
[2025-12-06 13:09:31] --- API Test: Generate Plan ---
[2025-12-06 13:09:31] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:09:31] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:09:42] ✅ Received Response:
[2025-12-06 13:09:42]
📝 组织后的Prompt:
[2025-12-06 13:09:42] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:09:42]
完整响应内容:
[2025-12-06 13:09:42] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "54de9885-7a21-4b89-ab5f-12261376c2f8",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:09:42]
--- Validation Checks ---
[2025-12-06 13:09:42] PASS: Response is a valid JSON object.
[2025-12-06 13:09:42] PASS: Response contains a valid 'root' key.
[2025-12-06 13:09:42] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:09:42] ✅ Test completed successfully
[2025-12-06 13:09:42] ================================================================================
[2025-12-06 13:09:42]
[2025-12-06 13:12:35] ================================================================================
[2025-12-06 13:12:35] --- API Test: Generate Plan ---
[2025-12-06 13:12:35] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:12:35] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:12:47] ✅ Received Response:
[2025-12-06 13:12:47]
📝 组织后的Prompt:
[2025-12-06 13:12:47] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:12:47]
完整响应内容:
[2025-12-06 13:12:47] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "3341f125-6d6e-41d1-a7a0-e129334df06d",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:12:47]
--- Validation Checks ---
[2025-12-06 13:12:47] PASS: Response is a valid JSON object.
[2025-12-06 13:12:47] PASS: Response contains a valid 'root' key.
[2025-12-06 13:12:47] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:12:47] ✅ Test completed successfully
[2025-12-06 13:12:47] ================================================================================
[2025-12-06 13:12:47]
[2025-12-06 13:13:26] ================================================================================
[2025-12-06 13:13:26] --- API Test: Generate Plan ---
[2025-12-06 13:13:26] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:13:26] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:13:36] ✅ Received Response:
[2025-12-06 13:13:36]
📝 组织后的Prompt:
[2025-12-06 13:13:36] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:13:36]
完整响应内容:
[2025-12-06 13:13:36] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "f9c2e57f-213f-4bc6-926b-62680d364930",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:13:36]
--- Validation Checks ---
[2025-12-06 13:13:36] PASS: Response is a valid JSON object.
[2025-12-06 13:13:36] PASS: Response contains a valid 'root' key.
[2025-12-06 13:13:36] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:13:36] ✅ Test completed successfully
[2025-12-06 13:13:36] ================================================================================
[2025-12-06 13:13:36]
[2025-12-06 13:32:53] ================================================================================
[2025-12-06 13:32:53] --- API Test: Generate Plan ---
[2025-12-06 13:32:53] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:32:53] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:33:04] ✅ Received Response:
[2025-12-06 13:33:04]
📝 组织后的Prompt:
[2025-12-06 13:33:04] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:33:04]
完整响应内容:
[2025-12-06 13:33:04] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "f332d502-fb68-40ed-ba76-aa5b6203e6d1",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:33:04]
--- Validation Checks ---
[2025-12-06 13:33:04] PASS: Response is a valid JSON object.
[2025-12-06 13:33:04] PASS: Response contains a valid 'root' key.
[2025-12-06 13:33:04] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:33:04] ✅ Test completed successfully
[2025-12-06 13:33:04] ================================================================================
[2025-12-06 13:33:04]
[2025-12-06 13:34:21] ================================================================================
[2025-12-06 13:34:21] --- API Test: Generate Plan ---
[2025-12-06 13:34:21] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:34:21] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:34:32] ✅ Received Response:
[2025-12-06 13:34:32]
📝 组织后的Prompt:
[2025-12-06 13:34:32] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:34:32]
完整响应内容:
[2025-12-06 13:34:32] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "b23742c8-49ac-444d-965c-0d7dd7a2f50d",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:34:32]
--- Validation Checks ---
[2025-12-06 13:34:32] PASS: Response is a valid JSON object.
[2025-12-06 13:34:32] PASS: Response contains a valid 'root' key.
[2025-12-06 13:34:32] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:34:32] ✅ Test completed successfully
[2025-12-06 13:34:32] ================================================================================
[2025-12-06 13:34:32]
[2025-12-06 13:35:13] ================================================================================
[2025-12-06 13:35:13] --- API Test: Generate Plan ---
[2025-12-06 13:35:13] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:35:13] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:35:24] ✅ Received Response:
[2025-12-06 13:35:24]
📝 组织后的Prompt:
[2025-12-06 13:35:24] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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"}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:35:24]
完整响应内容:
[2025-12-06 13:35:24] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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": 10.0,
"min_confidence": 0.7,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "deliver_payload",
"params": {
"payload_type": "camera",
"release_altitude": 5.0
}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "3770ecd5-966d-4545-84b4-9e8e154d4de6",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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 ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:35:24]
--- Validation Checks ---
[2025-12-06 13:35:24] PASS: Response is a valid JSON object.
[2025-12-06 13:35:24] PASS: Response contains a valid 'root' key.
[2025-12-06 13:35:24] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:35:24] ✅ Test completed successfully
[2025-12-06 13:35:24] ================================================================================
[2025-12-06 13:35:24]
[2025-12-06 13:42:10] ================================================================================
[2025-12-06 13:42:10] --- API Test: Generate Plan ---
[2025-12-06 13:42:10] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:42:10] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:42:24] ================================================================================
[2025-12-06 13:42:24] --- API Test: Generate Plan ---
[2025-12-06 13:42:24] URL: http://127.0.0.1:8000/generate_plan
[2025-12-06 13:42:24] Sending Prompt: "无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。"
[2025-12-06 13:42:34] ✅ Received Response:
[2025-12-06 13:42:34]
📝 组织后的Prompt:
[2025-12-06 13:42:34] === System Prompt ===
任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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":"take_picture","params":{}}
],
"conditions": [
{"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]秒"}}
],
"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`值;
3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`
4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。
## 三、行为树固定结构(通用不变)
根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改
```json
{
"root": {
"type": "Parallel",
"name": "Mission",
"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"}}
]
}
]
}
}
```
## 四、优先级排序任务通用示例
当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。
| 用户指令场景 | `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. 无自定义节点:"锁定高优先级目标"需通过`object_detect`+`object_detected`实现,不可用"lock_high_risk_target"。
## 六、输出要求
仅输出1个严格符合上述所有规则的JSON对象**确保1. 优先级排序逻辑正确填入`description`2. `target_class`匹配预定义列表3. 行为树结构不变4. 后端解析与Schema验证无错误**,无任何冗余内容。
【强制规则】仅生成包含root的复杂行为树JSON不得输出简单模式不得包含mode字段或仅有action节点
=== User Prompt ===
无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。
---
参考知识:
以下是从知识库中检索到的、与当前任务最相关的信息,请优先参考这些信息来生成结果:
在地图上有一个名为 '跷跷板' 的地点或区域它的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)。
---
[2025-12-06 13:42:34]
完整响应内容:
[2025-12-06 13:42:34] {
"root": {
"type": "Parallel",
"name": "Mission",
"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": 80.0
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 10.0,
"y": -10.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,
"safe_distance": 10.0
}
},
{
"type": "action",
"name": "take_picture",
"params": {}
},
{
"type": "action",
"name": "land",
"params": {
"mode": "home"
}
}
]
}
]
},
"plan_id": "d52368ab-d17c-4099-8396-31b1c34658c9",
"visualization_url": "/static/py_tree.png",
"final_prompt": "=== System Prompt ===\n任务根据用户任意任务指令生成结构化可执行的无人机行为树PytreeJSON。**仅输出单一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\":\"take_picture\",\"params\":{}}\n ],\n \"conditions\": [\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 ],\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`值;\n3. **`params`**:严格匹配上述节点的`params`定义无自定义参数如优先级排序不可加“priority”字段仅用`description`\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变)\n根节点必须是`Parallel``children`含`MainTask`Sequence结构不随任务类型含优先级排序修改\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"Mission\",\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 }\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. 无自定义节点:\"锁定高优先级目标\"需通过`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无人机起飞到80米高度后先移动至搜索区搜索并锁定任一红色车辆跟踪接近距离目标车辆10m后进行拍照完成拍照后返回。\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---"
}
[2025-12-06 13:42:34]
--- Validation Checks ---
[2025-12-06 13:42:34] PASS: Response is a valid JSON object.
[2025-12-06 13:42:34] PASS: Response contains a valid 'root' key.
[2025-12-06 13:42:34] PASS: Response contains a valid 'visualization_url': /static/py_tree.png
[2025-12-06 13:42:34] ✅ Test completed successfully
[2025-12-06 13:42:34] ================================================================================
[2025-12-06 13:42:34]