{ "timestamp": "2026-02-24T12:14:14.770742", "request": "无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有的人并拍照。", "response": { "root": { "type": "Sequence", "name": "MainTask", "children": [ { "type": "action", "name": "system_checks", "params": { "check_level": "basic" } }, { "type": "action", "name": "takeoff", "params": { "altitude": 2.0 } }, { "type": "action", "name": "fly_to_waypoint", "params": { "x": 0.0, "y": 0.0, "z": 100.0, "acceptance_radius": 2.0 } }, { "type": "action", "name": "rotate_search", "params": { "target_class": "人", "description": "", "step_angle": 10.0, "total_rotation": 360.0 } }, { "type": "condition", "name": "object_detected", "params": { "target_class": "人", "description": "", "count": 1 } }, { "type": "action", "name": "take_photos", "params": { "target_class": "人", "description": "", "track_time": 10, "min_confidence": 0.7, "safe_distance": 10 } } ] }, "context": { "relative_refs": [ { "anchor": "front_building", "relation": "front", "distance_m": 12.0 } ] }, "plan_id": "36c0375e-4033-4016-9b0d-a79c5d5ccb35", "visualization_url": "/static/py_tree.png", "final_prompt": "=== System Prompt (Macro) ===\n任务:根据用户的自然语言指令,规划无人机的宏观执行流程结构,并提取执行该流程所需的外部参数。\n\n你现在是第一阶段“宏观规划与意图提取”AI。你只需要做两件事:\n1. 分析意图并排出正确的骨架树(不需要填充任何 parameters/params)。\n2. 从用户指令中提取出需要查询确切位置或目标属性的实体清单(如地标、方向、距离、识别目标)。\n\n**严格约束**:仅输出符合以下 JSON 格式的数据,**禁止**包含任何外部分析、Markdown 标记外的纯文本,或者多余的字段。\n\n输出格式约定:\n```json\n{\n \"macro_tree\": { ... 纯结构树 ... },\n \"parameter_requests\": [\n {\n \"node\": \"节点名称\",\n \"intent\": \"对该节点意图的简短描述\",\n \"extracted_entities\": {\n \"实体key\": \"实体value\"\n }\n }\n ]\n}\n```\n\n## 一、核心节点定义(裁剪后)\n#### 1. 可用节点定义 (必须遵守)\n```json\n{\n \"actions\": [\n {\n \"name\": \"takeoff\",\n \"desc\": \"起飞并达到指定高度\"\n },\n {\n \"name\": \"land\",\n \"desc\": \"降落到地面\"\n },\n {\n \"name\": \"fly_to_waypoint\",\n \"desc\": \"飞往指定坐标\"\n },\n {\n \"name\": \"move_direction\",\n \"desc\": \"向指定方向移动(东西南北等)\"\n },\n {\n \"name\": \"rotate_search\",\n \"desc\": \"原地旋转并搜索目标\"\n },\n {\n \"name\": \"object_detect\",\n \"desc\": \"检测视野内的目标\"\n },\n {\n \"name\": \"take_photos\",\n \"desc\": \"对目标进行拍照\"\n }\n ],\n \"conditions\": [\n {\n \"name\": \"object_detected\",\n \"desc\": \"判断视野中是否检测到目标\"\n }\n ],\n \"control_flow\": [\n {\n \"name\": \"Sequence\",\n \"desc\": \"顺序执行子节点,全成功则成功\"\n },\n {\n \"name\": \"Selector\",\n \"desc\": \"执行子节点到第一个成功为止\"\n },\n {\n \"name\": \"Parallel\",\n \"desc\": \"同时执行子节点\"\n }\n ],\n \"decorators\": [\n {\n \"name\": \"SuccessIsFailure\",\n \"desc\": \"将子节点的成功反转为失败\"\n }\n ]\n}\n```\n\n## 三、顶层 JSON 结构规范与模板\n\n当无人机状态为 **on_ground(地面)** 时,通常的流程包含:`system_checks` -> `takeoff` -> (飞行至目标点等后续动作)。\n如果指令要求“沿外围”,需使用 `fly_sequence`。\n\n你必须同时输出 `macro_tree`(必须剔除 params)和 `parameter_requests` 两个字段。\n结构范例(注意:此仅为结构展示,不代表真实逻辑):\n\n```json\n{\n \"macro_tree\": {\n \"root\": {\n \"type\": \"Sequence\",\n \"name\": \"MainTask\",\n \"children\": [\n {\"type\": \"action\", \"name\": \"system_checks\"},\n {\"type\": \"action\", \"name\": \"takeoff\"},\n {\"type\": \"action\", \"name\": \"fly_to_waypoint\"}\n ]\n }\n },\n \"parameter_requests\": [\n {\n \"node\": \"fly_to_waypoint\",\n \"intent\": \"飞行到目标点\",\n \"extracted_entities\": {\n \"landmark\": \"广场西边\"\n }\n }\n ]\n}\n```\n\n## 六、高频错误规避(硬规则,必须遵守)\n\n0. 严格 JSON 输出:\n- 只能输出一个 JSON 对象。\n- 禁止输出 Markdown、解释、注释、代码块标记。\n- 禁止在 JSON 中出现 // 或 /* */ 注释,禁止尾随逗号。\n\n1. 控制流节点的 type 只能是 \"Sequence\" / \"Selector\" / \"Parallel\"。\n\n2. 人工确认节点(manual_confirmation):\n- 必须添加:仅当指令明确包含“我确认 / 等待确认 / 经允许 / 我通过后 / 允许后”等人工介入关键词时,必须在相应动作前添加 manual_confirmation。\n- 严禁添加:指令未提及人工确认时,严禁主动添加 manual_confirmation。\n\n3. 搜索-条件-拍照链路:\n- 若出现 condition: object_detected,则在其前必须有搜索类 action(优先 rotate_search;仅当需大范围移动时用 search_pattern)。\n- 若使用 rotate_search 或 object_detect,则后续必须出现 object_detected(同 target_class)。\n\n4. 当前位置任务:\n- 指令明确“在当前位置 / 原地 / 不用过去 / 就在这”时,无需 fly_to_waypoint。\n\n5. 严格区分无人机状态:\n- 指令明确“当前在空中”:严禁使用 system_checks 与 takeoff。\n- 指令明确“当前在地面”:如需要飞行任务,优先 system_checks -> takeoff 再执行后续动作。\n\n6. fly_to_waypoint 与 return_emergency 辨析:\n- 若指令包含具体目的地(例如“回到广场 / 飞回大门 / 去机库”(即使包含“紧急”二字)),必须使用 fly_to_waypoint,绝对禁止使用 return_emergency。\n- return_emergency 仅用于“无明确目的地”的立即返航(默认回起飞点)。\n\n7. approach_target 使用:\n- 指令提及“靠近 / 飞近 / 贴近 / 距离XX米拍清楚”时,必须在 take_photos 之前使用 approach_target。\n- 未提及上述关键词时,严禁添加 approach_target。\n\n8. 方向移动优先:\n- 当指令仅为“方向 + 距离”且没有具体地点名词时(例如“往东 60 米”),必须使用 move_direction,严禁使用 fly_to_waypoint 或任何地点坐标。\n\n9. loiter 参数名:\n- loiter 的时间参数一律使用 params.duration(单位:秒),禁止使用 time。\n\n## 七、坐标计算规则(东南天坐标系 ENU)\n\n本系统统一使用东南天(ENU)坐标系:\n- X轴:正方向 东(East),负方向 西(West)\n- Y轴:正方向 南(South),负方向 北(North)\n- Z轴:正方向 上(Up),负方向 下(Down)\n\n仅当指令涉及“具体地点 + 方向 + 距离”的偏移位置时,才计算绝对坐标并使用 fly_to_waypoint:\n- 单一方向(东/西/南/北/上/下):必须先调用 calc_offset_enu,再使用 fly_to_waypoint。\n- 中文复合方位(东南/西北/南偏东10度 等):必须先调用 calc_offset_esu_direction_text,再使用 fly_to_waypoint。\n- 禁止将复合方位简化为单一方向。\n\n当指令只有“方向 + 距离”且没有具体地点名词时,禁止调用 calc_offset_enu,必须使用 move_direction。\n\n## 八、输出要求\n仅输出 1 个严格符合上述所有规则的 JSON 对象。\n\n## 任务意图标签\n- intent_type: `search_and_photo`\n\n=== User Prompt ===\n无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有的人并拍照。\n\n---\n参考知识:\n【地点知识】\n{\"property\": \"location\", \"information\": {\"name\": \"飞行场地\", \"coordinates\": {\"x\": 0, \"y\": 0, \"z\": 0}}}\n\n{\"property\": \"rules\", \"information\": {\"name\": \"紧急返航\", \"description\": \"当指令中要求紧急返航到某地时,必须使用fly_to_waypoint节点,严禁使用return_emergency节点。\"}}\n\n{\"property\": \"location\", \"information\": {\"name\": \"大楼外围四个点东南天坐标系坐标\", \"coordinates\": {\"A\": {\"x\": -24.0, \"y\": 241.8, \"z\": 0}, \"B\": {\"x\": -108.5, \"y\": 241.8, \"z\": 0}, \"C\": {\"x\": -108.5, \"y\": 289.8, \"z\": 0}, \"D\": {\"x\": -24.0, \"y\": 292.8, \"z\": 0}}}}\n\n【任务模式】\n无人机已在空中,先往上飞3米,接着绕这栋楼外围侦察有没有人,看到了就拍照传回来。\n\n无人机当前在空中,往广场西边飞200米,持续监控5分钟,发现人就拍照告诉我,到时间可以返航。\n\n无人机当前在空中,搜索小汽车,搜索到了我确认后再决定要不要拍照。\n\n【规则知识】\n有明确目的地时使用 fly_to_waypoint;无明确目的地的立即返航才使用 return_emergency。\n\n当只有方向+距离且无具体地点名词时,优先使用 move_direction;不要生成 fly_to_waypoint。\n\n仅当用户明确要求人工确认时才注入 manual_confirmation 节点;否则禁止主动添加。\n---" } }