93 lines
31 KiB
JSON
93 lines
31 KiB
JSON
{
|
||
"timestamp": "2026-02-20T22:32:30.764753",
|
||
"request": "无人机当前在地面,去面前大楼左边20米巡查并拍照",
|
||
"response": {
|
||
"root": {
|
||
"type": "Sequence",
|
||
"name": "FlyLeft20MAndPhotoPerson",
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "system_checks",
|
||
"params": {
|
||
"check_level": "comprehensive"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "takeoff",
|
||
"params": {
|
||
"altitude": 10.0
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "move_direction",
|
||
"params": {
|
||
"direction": "west",
|
||
"distance": 20.0
|
||
}
|
||
},
|
||
{
|
||
"type": "decorator",
|
||
"name": "SuccessIsFailure",
|
||
"child": {
|
||
"type": "Sequence",
|
||
"name": "DetectAndPhotoPerson",
|
||
"children": [
|
||
{
|
||
"type": "action",
|
||
"name": "object_detect",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "人员"
|
||
}
|
||
},
|
||
{
|
||
"type": "condition",
|
||
"name": "object_detected",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "人员"
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "take_photos",
|
||
"params": {
|
||
"target_class": "person",
|
||
"description": "人员",
|
||
"track_time": 10.0
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"type": "action",
|
||
"name": "land",
|
||
"params": {
|
||
"mode": "current"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
"context": {
|
||
"relative_refs": [
|
||
{
|
||
"anchor": "front_building",
|
||
"relation": "front",
|
||
"distance_m": 20.0
|
||
},
|
||
{
|
||
"anchor": "front_building",
|
||
"relation": "left",
|
||
"distance_m": 20.0
|
||
}
|
||
]
|
||
},
|
||
"plan_id": "12b27a1d-d3de-4b1a-8298-a9a9b144b83e",
|
||
"visualization_url": "/static/py_tree.png",
|
||
"final_prompt": "=== System Prompt ===\n任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。\n\n## 一、核心节点定义(裁剪后)\n#### 1. 可用节点定义 (必须遵守)\n```json\n{\n \"actions\": [\n {\n \"name\": \"takeoff\",\n \"params\": {\n \"altitude\": \"float[1,100],默认2\"\n }\n },\n {\n \"name\": \"land\",\n \"params\": {\n \"mode\": \"'current'/'home'\"\n }\n },\n {\n \"name\": \"fly_to_waypoint\",\n \"params\": {\n \"x\": \"±10000\",\n \"y\": \"±10000\",\n \"z\": \"[1,5000]\",\n \"acceptance_radius\": \"默认2.0\",\n \"desc\": \"仅当指令提及具体地点(如'去广场'、'去大门')或需计算明确坐标时使用\"\n }\n },\n {\n \"name\": \"move_direction\",\n \"params\": {\n \"direction\": \"north/south/east/west/forward/backward/left/right\",\n \"distance\": \"[1,10000],缺省则持续移动\",\n \"speed\": \"float,可选\",\n \"desc\": \"当指令仅包含'往东/西...飞xx米'且无具体地点名词时,必须使用此节点\"\n }\n },\n {\n \"name\": \"rotate_search\",\n \"params\": {\n \"target_class\": \"同object_detect\",\n \"description\": \"string,可选,目标属性描述\",\n \"step_angle\": \"float,可选,每一步旋转的角度\",\n \"total_rotation\": \"float,可选,总共旋转搜索的角度\"\n }\n },\n {\n \"name\": \"object_detect\",\n \"params\": {\n \"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,garbage\",\n \"description\": \"可选,\",\n \"count\": \"默认1\"\n }\n },\n {\n \"name\": \"take_photos\",\n \"params\": {\n \"target_class\": \"同object_detect\",\n \"description\": \"可选,目标属性\",\n \"track_time\": \"[1,600]秒(必传,不可用'duration')\",\n \"min_confidence\": \"[0.5,1.0]默认0.7\",\n \"safe_distance\": \"[2,50]默认10\"\n }\n }\n ],\n \"conditions\": [\n {\n \"name\": \"object_detected\",\n \"params\": {\n \"target_class\": \"同object_detect(必传)\",\n \"description\": \"可选,目标属性\",\n \"count\": \"默认1\"\n }\n }\n ],\n \"control_flow\": [\n {\n \"name\": \"Sequence\",\n \"params\": {},\n \"children\": \"子节点数组(按序执行,全成功则成功)\"\n },\n {\n \"name\": \"Selector\",\n \"params\": {\n \"memory\": \"默认true\"\n },\n \"children\": \"子节点数组(执行到成功为止)\"\n },\n {\n \"name\": \"Parallel\",\n \"params\": {\n \"policy\": \"all_success/success_on_one\"\n },\n \"children\": \"子节点数组(同时执行,默认all_success)\"\n }\n ],\n \"decorators\": [\n {\n \"name\": \"SuccessIsFailure\",\n \"params\": {},\n \"child\": \"单一子节点(将子节点的成功结果反转为失败)\"\n }\n ]\n}\n```\n\n## 二、节点必填字段(后端Schema强制要求,缺一验证失败)\n每个节点必须包含以下字段,字段名/类型不可自定义:\n1. **`type`**: \n - 动作节点→`\"action\"`,条件节点→`\"condition\"`,控制流节点→`\"Sequence\"`/`\"Selector\"`/`\"Parallel\"`,装饰器节点→`\"decorator\"`;\n2. **`name`**:必须是上述JSON中定义的`name`值;\n3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数;\n4. **`children`**:仅控制流节点必含(子节点数组);\n5. **`child`**:仅装饰器节点必含(单一子节点对象,非数组)。\n\n## 三、标准任务结构模板(单次起降流程)\n当无人机在地面时,大多数任务应遵循“起飞 -> 移动 -> 条件判断 -> 执行 -> 返航/降落”的单次闭环流程,参考结构如下:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\"type\":\"action\",\"name\":\"fly_to_waypoint\",\"params\":{\"x\":100.0,\"y\":50.0,\"z\":10.0}}, // 接近目标区域\n // --- 核心任务区 (根据指令替换) ---\n // 默认不需要降落节点,除非用户明确要求\n ]\n }\n}\n```\n而当无人机在空中时,则无需system_checks与takeoff环节,直接执行用户任务即可\n\n## 四、场景示例\n\n#### 场景 1:地面到12米绕外围查看打开的窗户(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有打开的窗户,发现则进行拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterAndPhotoWindows\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectWindows\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectOpenWindowsWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 2:地面到12米沿外围查找打开的窗户(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有打开的窗户并拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterAndPhotoOpenWindows\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectOpenWindows\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectAllOpenWindowsWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 3:空中上升后绕外围侦察打开窗户(Sequence)\n**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有打开的窗户,看到了就拍照传回来。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"RiseAndDetectOpenWindows\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"move_direction\",\"params\":{\"direction\":\"up\",\"distance\":3.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectOpenWindows\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 289.8},\n {\"x\": -24.0, \"y\": 292.8},\n {\"x\": -24.0, \"y\": 241.8}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectOpenWindowsWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"window\",\"description\":\"打开的窗户\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 4:地面到12米绕外围巡视杂物堆积(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围巡视杂物堆积现象,发现则进行拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterAndPhotoGarbageObserve\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectGarbageObserve\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectGarbageWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 5:地面到12米沿外围查找杂物堆积(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有的杂物堆积并拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterAndPhotoGarbage\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectGarbage\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectGarbageWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 6:空中下降后绕外围侦察杂物堆积(Sequence)\n**指令**:“无人机当前在空中,往下飞3米,接着绕这栋楼外围侦察有没有杂物堆积,看到了就拍照传回来。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"DescendAndDetectGarbage\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"move_direction\",\"params\":{\"direction\":\"down\",\"distance\":3.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectGarbage\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 289.8},\n {\"x\": -24.0, \"y\": 292.8},\n {\"x\": -24.0, \"y\": 241.8}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectGarbageWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"garbage\",\"description\":\"杂物堆积\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 7:地面到12米绕外围查看是否有人(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有人,发现则进行拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterAndPhotoPerson\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetectPerson\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectPersonWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 8:地面到12米沿外围逆时针查找人员(Sequence)\n**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围逆时针查找所有的人并拍照。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"FlyPerimeterCounterClockwiseAndPhotoPerson\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"system_checks\",\"params\":{\"check_level\":\"comprehensive\"}},\n {\"type\":\"action\",\"name\":\"takeoff\",\"params\":{\"altitude\":10.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolCCWAndDetectPerson\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 292.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 289.8, \"depth\": 12.0},\n {\"x\": -108.5, \"y\": 241.8, \"depth\": 12.0},\n {\"x\": -24.0, \"y\": 241.8, \"depth\": 12.0}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectPersonWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"person\",\"description\":\"人员\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n#### 场景 9:空中上升后沿建筑外围侦察人员(Sequence)\n**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有人,看到了就拍照传回来。”\n**结构**:\n```json\n{\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"RiseAndPatrolPerimeter\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"move_direction\",\"params\":{\"direction\":\"up\",\"distance\":3.0}},\n {\n \"type\": \"Parallel\",\n \"name\": \"PatrolAndDetect\",\n \"params\": {\"policy\": \"success_on_one\"},\n \"children\": [\n {\n \"type\": \"action\",\n \"name\": \"fly_sequence\",\n \"params\": {\n \"waypoints\": [\n {\"x\": -24.0, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 241.8},\n {\"x\": -108.5, \"y\": 289.8},\n {\"x\": -24.0, \"y\": 292.8},\n {\"x\": -24.0, \"y\": 241.8}\n ],\n \"coordinate_frame\": \"local_enu\"\n }\n },\n {\n \"type\": \"decorator\",\n \"name\": \"SuccessIsFailure\",\n \"child\": {\n \"type\": \"Sequence\",\n \"name\": \"DetectAndPhotoWhileFlying\",\n \"children\": [\n {\"type\":\"action\",\"name\":\"object_detect\",\"params\":{\"target_class\":\"person\",\"description\":\"建筑外围人员\"}},\n {\"type\":\"condition\",\"name\":\"object_detected\",\"params\":{\"target_class\":\"person\",\"description\":\"建筑外围人员\"}},\n {\"type\":\"action\",\"name\":\"take_photos\",\"params\":{\"target_class\":\"person\",\"description\":\"建筑外围人员\",\"track_time\":10.0}}\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n\n## 六、高频错误规避\n1. 控制流节点的 `type` 必须是 `\"Sequence\"`, `\"Selector\"` 或 `\"Parallel\"`\n2. **人工确认节点 (`manual_confirmation`) 使用原则**:\n - **必须添加**:仅当指令中明确包含“我确认”、“等待确认”、“经允许”、“我通过后”等人工介入关键词时,**必须**在相应动作前添加此节点。\n - **严禁添加**:若指令未提及上述关键词,**严禁**主动添加此节点(即使是拍照、返航或降落等动作,只要用户没说要确认,就直接执行)。\n3. 在条件节点 `object_detected` 执行前,必须先安排搜索类动作节点(优先使用 `rotate_search`,仅当需大范围移动时用 `search_pattern`),确保无人机主动寻找目标。\n4. 当使用rotate_search或者object_detect节点时,必须有object_detected节点\n5. 用户指令中要求在当前位置执行任务时,无需fly_to_waypoint节点\n6. **严格区分无人机状态**:当用户指令明确无人机在**空中**时,严禁使用system_checks与takeoff节点;仅当用户指令明确在**地面**时,才可使用这两个节点\n7. **重点关注**:fly_to_waypoint与return_emergency节点辨析:当指令包含具体目的地(如“紧急回到广场”、“飞回大门”)时,**必须**使用fly_to_waypoint节点,**绝对禁止**使用return_emergency节点(该节点仅用于无目的地的“返航”指令)。\n8. 当用户指令中提及“靠近”、“飞近”、“贴近”目标时,**必须**在`take_photos`之前使用`approach_target`节点;若未提及此类关键词,则**严禁**使用`approach_target`节点。\n9. **方向移动优先原则**:当指令为“快速去往东边100米”,直接使用 `move_direction` 节点+距离参数,严禁使用fly_to_waypoint\n10. **无地点名词禁止飞点**:当指令仅包含“方向 + 距离”且**没有具体地点名词**时,**无论无人机在地面或空中**,都必须使用 `move_direction`,严禁使用 `fly_to_waypoint` 或任何地点坐标。\n\n示例(必须遵守):\n- “无人机当前在地面,快速去往东边60米,有身穿白色衣服,头戴帽子的男子在挟持他人,对其进行拍照。” → 必须使用 `move_direction`(east, 60),不得生成 `fly_to_waypoint` 或引用任何地点坐标。\n- “无人机当前在空中,快速去往东边60米,有身穿白色衣服,头戴帽子的男子在挟持他人,对其进行拍照。” → 同样必须使用 `move_direction`(east, 60),不得生成 `fly_to_waypoint` 或引用任何地点坐标。\n\n## 七、坐标计算规则(东南天坐标系 ENU)\n本系统统一使用东南天(ENU)坐标系:\n- **X轴**:正方向为**东** (East),负方向为**西** (West)\n- **Y轴**:正方向为**南** (South)向为**北** (North)\n- **Z轴**:正方向为**天** (Up),负方向为**地** (Down)\n\n**仅当指令涉及前往“具体地点”(如广场、大门)的偏移位置时,才需计算绝对坐标并使用`fly_to_waypoint`:**\n\n当指令包含“具体地点 + 方向 + 距离”的偏移时,按方向类型选择工具:\n- **单一方向**(东/西/南/北/上/下,如“广场西边200米”):**必须**先调用工具`calc_offset_enu`计算绝对坐标,再使用`fly_to_waypoint`。工具参数:\n - `base`: 参考地点的ENU坐标(含x/y/z)\n - `direction`: east/west/north/south/up/down\n - `distance`: 偏移距离(米)\n- **中文复合方位**(东南/西北/东北/西南/南偏东10度/北偏西15度等):**必须**先调用工具`calc_offset_esu_direction_text`计算绝对坐标,再使用`fly_to_waypoint`。工具参数:\n - `base`: 参考地点的ENU坐标(含x/y/z)\n - `direction_text`: 中文方位原文(如“东南”“南偏东10度”)\n - `distance`: 偏移距离(米)\n- **禁止简化**:当出现“东南/西北/东北/西南/南偏东/北偏西”等复合方位时,禁止将其简化为单一方向(如仅“东”或仅“南”)。\n\n示例(必须遵守):\n- “飞到广场东南方向100米” → 必须调用 `calc_offset_esu_direction_text`,参数 `direction_text` 为 `\"东南\"`,`distance` 为 `100`,再使用 `fly_to_waypoint`。\n- “飞到广场南偏东10度100米” → 必须调用 `calc_offset_esu_direction_text`,参数 `direction_text` 为 `\"南偏东10度\"`,`distance` 为 `100`。\n\n当指令只有“方向 + 距离”且**没有具体地点名词**时,**禁止**调用`calc_offset_enu`,必须使用`move_direction`。\n当指令描述“附近/边上/区域内”等模糊位置且**无方向+距离**时,视为到该地点本身,不做偏移计算。\n\n## 八、输出要求\n仅输出1个严格符合上述所有规则的JSON对象。\n\n## 任务意图标签\n- intent_type: `search_and_photo`\n\n=== User Prompt ===\n无人机当前在地面,去面前大楼左边20米巡查并拍照\n\n---\n参考知识:\n【任务模式】\n无人机已在空中,先调整高度后沿建筑外围巡查人员,发现目标后拍照。\n\n先到达命名地点偏移区域执行监控,到时后返航。\n\n在命名区域发现目标后等待人工确认,再执行拍照或返航。\n\n【规则知识】\n有明确目的地时使用 fly_to_waypoint;无明确目的地的立即返航才使用 return_emergency。\n\n当只有方向+距离且无具体地点名词时,优先使用 move_direction;不要生成 fly_to_waypoint。\n\n仅当用户明确要求人工确认时才注入 manual_confirmation 节点;否则禁止主动添加。\n---"
|
||
}
|
||
} |