Files
DronePlanning/backend_service/history/20260221_090322_plan.json
2026-02-26 19:37:55 +08:00

69 lines
9.3 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"timestamp": "2026-02-21T09:03:22.995796",
"request": "无人机当前在地面,到飞行场地查找长头发的人,看见了拍个照片。",
"response": {
"root": {
"type": "Sequence",
"name": "MainTask",
"children": [
{
"type": "action",
"name": "system_checks",
"params": {
"check_level": "basic"
}
},
{
"type": "action",
"name": "takeoff",
"params": {
"altitude": 2
}
},
{
"type": "action",
"name": "fly_to_waypoint",
"params": {
"x": 0,
"y": 0,
"z": 0,
"acceptance_radius": 2.0
}
},
{
"type": "action",
"name": "rotate_search",
"params": {
"target_class": "长头发的人",
"description": "string",
"step_angle": 10.0,
"total_rotation": 360.0
}
},
{
"type": "condition",
"name": "object_detected",
"params": {
"target_class": "长头发的人",
"description": "string",
"count": 1
}
},
{
"type": "action",
"name": "take_photos",
"params": {
"target_class": "长头发的人",
"description": "string",
"track_time": 10,
"min_confidence": 0.7,
"safe_distance": 10
}
}
]
},
"plan_id": "49f8f5dc-22ee-4a01-93e6-0e39edfb8c91",
"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无人机当前在地面到飞行场地查找长头发的人看见了拍个照片。\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无人机当前在空中搜索小汽车搜索到了我确认后再决定要不要拍照。\n\n无人机当前在空中往广场西边飞200米持续监控5分钟发现人就拍照告诉我到时间可以返航。\n\n无人机当前在地面去研究所正大门搜索扎辫子女子找到后拍照。\n---"
}
}