[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(': 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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}}, {"name":"emergency_return","params":{"reason":"string"}} ], "conditions": [ {"name":"battery_above","params":{"threshold":"[0.0,1.0],必传"}}, {"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}}, {"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}}, {"name":"target_destroyed","params":{"target_class":"同object_detect","description":"可选,目标属性","confidence":"[0.5,1.0]默认0.8"}}, {"name":"time_elapsed","params":{"duration":"[1,2700]秒"}}, {"name":"gps_status","params":{"min_satellites":"int[6,15],必传(如8)"}} ], "control_flow": [ {"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"}, {"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"}, {"name":"Parallel","params":{"policy":"all_success"},"children":"子节点数组(同时执行,严禁用'one_success')"} ] } ``` ## 二、节点必填字段(后端Schema强制要求,缺一验证失败) 每个节点必须包含以下字段,字段名/类型不可自定义: 1. **`type`**: - 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`(与`name`字段值完全一致); 2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”); 3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`); 4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。 ## 三、行为树固定结构(通用不变,确保安全验证) 根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改: ```json { "root": { "type": "Parallel", "name": "MissionWithSafety", "params": {"policy": "all_success"}, "children": [ { "type": "Sequence", "name": "MainTask", "params": {}, "children": [ // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换): {"type":"action","name":"preflight_checks","params":{"check_level":"comprehensive"}}, {"type":"action","name":"takeoff","params":{"altitude":10.0}}, {"type":"action","name":"fly_to_waypoint","params":{"x":200.0,"y":150.0,"z":10.0}}, // 搜索区坐标(用户未给时填合理值) {"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200.0,"center_y":150.0,"center_z":10.0,"radius":50.0,"target_class":"balloon","description":"红色"}}, {"type":"condition","name":"object_detected","params":{"target_class":"balloon","description":"红色"}}, // 确认高优先级目标 {"type":"action","name":"track_object","params":{"target_class":"balloon","description":"红色","track_time":30.0}}, {"type":"action","name":"strike_target","params":{"target_class":"balloon","description":"红色"}}, {"type":"action","name":"land","params":{"mode":"home"}} ] }, { "type": "Selector", "name": "SafetyMonitor", "params": {"memory": true}, "children": [ {"type":"condition","name":"battery_above","params":{"threshold":0.3}}, {"type":"condition","name":"gps_status","params":{"min_satellites":8}}, { "type":"Sequence", "name":"EmergencyHandler", "params": {}, "children": [ {"type":"action","name":"emergency_return","params":{"reason":"safety_breach"}}, {"type":"action","name":"land","params":{"mode":"home"}} ] } ] } ] } } ``` ## 四、优先级排序任务通用示例 当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。 | 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) | |-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------| | 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{"type":"action","name":"search_pattern","params":{"pattern_type":"grid","center_x":200,"center_y":150,"center_z":10,"radius":50,"target_class":"balloon","description":"(红>蓝>绿)"}}` | | 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{"type":"action","name":"object_detect","params":{"target_class":"truck","description":"(军用卡车>民用卡车>面包车)"}}` | ## 五、高频错误规避(确保验证通过) 1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则; 2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序; 3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`"track_time":30.0`); 4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省); 5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。 ## 六、输出要求 仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。 【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。 === User Prompt === 已知目标检测红色气球危险性高于蓝色气球高于绿色气球,飞往搜索区搜索并锁定危险性最高的气球,对其跟踪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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"emergency_return\",\"params\":{\"reason\":\"string\"}}\n ],\n \"conditions\": [\n {\"name\":\"battery_above\",\"params\":{\"threshold\":\"[0.0,1.0],必传\"}},\n {\"name\":\"at_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"tolerance\":\"默认3.0\"}},\n {\"name\":\"object_detected\",\"params\":{\"target_class\":\"同object_detect(必传)\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"target_destroyed\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"confidence\":\"[0.5,1.0]默认0.8\"}},\n {\"name\":\"time_elapsed\",\"params\":{\"duration\":\"[1,2700]秒\"}},\n {\"name\":\"gps_status\",\"params\":{\"min_satellites\":\"int[6,15],必传(如8)\"}}\n ],\n \"control_flow\": [\n {\"name\":\"Sequence\",\"params\":{},\"children\":\"子节点数组(按序执行,全成功则成功)\"},\n {\"name\":\"Selector\",\"params\":{\"memory\":\"默认true\"},\"children\":\"子节点数组(执行到成功为止)\"},\n {\"name\":\"Parallel\",\"params\":{\"policy\":\"all_success\"},\"children\":\"子节点数组(同时执行,严禁用'one_success')\"}\n ]\n}\n```\n\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`(与`name`字段值完全一致);\n2. **`name`**:必须是上述JSON中`actions`/`conditions`/`control_flow`下的`name`值(如“gps_status”不可错写为“gps_check”);\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数(如优先级排序不可加“priority”字段,仅用`description`);\n4. **`children`**:仅控制流节点必含(子节点数组),动作/条件节点无此字段。\n\n\n## 三、行为树固定结构(通用不变,确保安全验证)\n根节点必须是`Parallel`,`children`含`MainTask`(Sequence)和`SafetyMonitor`(Selector),结构不随任务类型(含优先级排序)修改:\n```json\n{\n \"root\": {\n \"type\": \"Parallel\",\n \"name\": \"MissionWithSafety\",\n \"params\": {\"policy\": \"all_success\"},\n \"children\": [\n {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"params\": {},\n \"children\": [\n // 通用主任务步骤(含优先级排序任务示例,需按用户指令替换):\n {\"type\":\"action\",\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":200.0,\"y\":150.0,\"z\":10.0}}, // 搜索区坐标(用户未给时填合理值)\n {\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200.0,\"center_y\":150.0,\"center_z\":10.0,\"radius\":50.0,\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}}, // 确认高优先级目标\n {\"type\":\"action\",\"name\":\"track_object\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\",\"track_time\":30.0}},\n {\"type\":\"action\",\"name\":\"strike_target\",\"params\":{\"target_class\":\"balloon\",\"description\":\"红色\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n },\n {\n \"type\": \"Selector\",\n \"name\": \"SafetyMonitor\",\n \"params\": {\"memory\": true},\n \"children\": [\n {\"type\":\"condition\",\"name\":\"battery_above\",\"params\":{\"threshold\":0.3}},\n {\"type\":\"condition\",\"name\":\"gps_status\",\"params\":{\"min_satellites\":8}},\n {\n \"type\":\"Sequence\",\n \"name\":\"EmergencyHandler\",\n \"params\": {},\n \"children\": [\n {\"type\":\"action\",\"name\":\"emergency_return\",\"params\":{\"reason\":\"safety_breach\"}},\n {\"type\":\"action\",\"name\":\"land\",\"params\":{\"mode\":\"home\"}}\n ]\n }\n ]\n }\n ]\n }\n}\n```\n\n\n## 四、优先级排序任务通用示例\n当用户指令中明确提出有多个待考察且具有优先级关系的物体时,节点描述须为优先级关系。比如当指令为已知有三个气球,危险级关系为红色气球大于蓝色气球大于绿色气球,要求优先跟踪最危险的气球时,节点的描述参考下表情形。\n| 用户指令场景 | `target_class` | `description` | 核心节点示例(search_pattern) |\n|-----------------------------|-----------------|-------------------------|------------------------------------------------------------------------------------------------|\n| 红气球>蓝气球>绿气球 | `balloon` | `(红>蓝>绿)` | `{\"type\":\"action\",\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"grid\",\"center_x\":200,\"center_y\":150,\"center_z\":10,\"radius\":50,\"target_class\":\"balloon\",\"description\":\"(红>蓝>绿)\"}}` |\n| 军用卡车>民用卡车>面包车 | `truck` | `(军用卡车>民用卡车>面包车)` | `{\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"truck\",\"description\":\"(军用卡车>民用卡车>面包车)\"}}` |\n\n\n## 五、高频错误规避(确保验证通过)\n1. 优先级排序不可修改`target_class`:如“民用卡车、面包车与军用卡车中,军用卡车优先”,`target_class`仍为`truck`,仅用`description`填排序规则;\n2. 在没有明确指出物体之间的优先级关系情况下,`description`字段只描述物体属性本身,严禁与用户指令中不存在的物体进行排序;\n3. `track_object`必传`track_time`:不可用`duration`替代(如跟踪30秒填`\"track_time\":30.0`);\n4. `gps_status`的`min_satellites`必须在6-15之间(如8,不可缺省);\n5. 无自定义节点:“锁定高优先级目标”需通过`object_detect`+`object_detected`实现,不可用“lock_high_risk_target”。\n\n\n## 六、输出要求\n仅输出1个严格符合上述所有规则的JSON对象,**确保:1. 优先级排序逻辑正确填入`description`;2. `target_class`匹配预定义列表;3. 行为树结构不变;4. 后端解析与Schema验证无错误**,无任何冗余内容。\n\n\n【强制规则】仅生成包含root的复杂行为树JSON,不得输出简单模式(不得包含mode字段或仅有action节点)。\n\n=== User Prompt ===\n已知目标检测红色气球危险性高于蓝色气球高于绿色气球,飞往搜索区搜索并锁定危险性最高的气球,对其跟踪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":"","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\":\"\",\"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":"","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\":\"\",\"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":"","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\":\"\",\"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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}} ], "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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}}\n ],\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 === 任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。 ## 一、核心节点定义(格式不可修改,确保后端解析) #### 1. 可用节点定义 (必须遵守) 你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点: ```json { "actions": [ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动"}}, {"name":"orbit_around_point","params":{"center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"orbit_around_target","params":{"target_class":"见object_detect列表","description":"可选,目标属性","radius":"[5,1000]","laps":"[1,20]","clockwise":"默认true","speed_mps":"[0.5,15]","gimbal_lock":"默认true"}}, {"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}}, {"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush","description":"可选,","count":"默认1"}}, {"name":"strike_target","params":{"target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"battle_damage_assessment","params":{"target_class":"同object_detect","assessment_time":"[5,60],默认15"}}, {"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}}, {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"preflight_checks","params":{"check_level":"basic/comprehensive"}}, {"name":"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任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(格式不可修改,确保后端解析)\n#### 1. 可用节点定义 (必须遵守)\n你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:\n```json\n{\n \"actions\": [\n {\"name\":\"takeoff\",\"params\":{\"altitude\":\"float[1,100],默认2\"}},\n {\"name\":\"land\",\"params\":{\"mode\":\"'current'/'home'\"}},\n {\"name\":\"fly_to_waypoint\",\"params\":{\"x\":\"±10000\",\"y\":\"±10000\",\"z\":\"[1,5000]\",\"acceptance_radius\":\"默认2.0\"}},\n {\"name\":\"move_direction\",\"params\":{\"direction\":\"north/south/east/west/forward/backward/left/right\",\"distance\":\"[1,10000],缺省持续移动\"}},\n {\"name\":\"orbit_around_point\",\"params\":{\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"orbit_around_target\",\"params\":{\"target_class\":\"见object_detect列表\",\"description\":\"可选,目标属性\",\"radius\":\"[5,1000]\",\"laps\":\"[1,20]\",\"clockwise\":\"默认true\",\"speed_mps\":\"[0.5,15]\",\"gimbal_lock\":\"默认true\"}},\n {\"name\":\"loiter\",\"params\":{\"duration\":\"[1,600]秒/until_condition:可选\"}},\n {\"name\":\"object_detect\",\"params\":{\"target_class\":\"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush\",\"description\":\"可选,\",\"count\":\"默认1\"}},\n {\"name\":\"strike_target\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"battle_damage_assessment\",\"params\":{\"target_class\":\"同object_detect\",\"assessment_time\":\"[5,60],默认15\"}},\n {\"name\":\"search_pattern\",\"params\":{\"pattern_type\":\"spiral/grid\",\"center_x\":\"±10000\",\"center_y\":\"±10000\",\"center_z\":\"[1,5000]\",\"radius\":\"[5,1000]\",\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"count\":\"默认1\"}},\n {\"name\":\"track_object\",\"params\":{\"target_class\":\"同object_detect\",\"description\":\"可选,目标属性\",\"track_time\":\"[1,600]秒(必传,不可用'duration')\",\"min_confidence\":\"[0.5,1.0]默认0.7\",\"safe_distance\":\"[2,50]默认10\"}},\n {\"name\":\"deliver_payload\",\"params\":{\"payload_type\":\"string\",\"release_altitude\":\"[2,100]默认5\"}},\n {\"name\":\"preflight_checks\",\"params\":{\"check_level\":\"basic/comprehensive\"}},\n {\"name\":\"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]