# 地面站后端开发文档

**版本**: 1.0
**负责人**: 后端开发团队

---

## 1. 概述与目标

本文档旨在为 **模块二：后端服务** 提供一份完整、清晰的开发与实现指南。后端服务是整个无人机自然语言控制系统的核心枢纽，其主要职责包括：

1.  **接收前端指令**: 通过Web API接收来自QGC插件的自然语言指令。
2.  **智能任务规划**: 集成并调用RAG（检索增强生成）系统和大型语言模型（LLM），将用户指令转化为结构化的无人机任务（`py_tree.json`）。
3.  **任务下发与监控**: 通过ROS2 Action将用户确认后的任务下发给无人机执行，并实时接收无人机的执行状态。
4.  **状态实时反馈**: 通过WebSocket将无人机的执行状态实时、透明地转发给前端QGC插件，实现闭环监控。

本项目将整合现有零散的脚本和资源，构建一个统一、健壮且可扩展的FastAPI应用程序。

## 2. 技术栈

- **Web框架**: FastAPI (用于构建高性能的HTTP和WebSocket接口)
- **ROS2通信**: `rclpy` (Python客户端库，用于与无人机ROS2节点交互)
- **异步处理**: `asyncio` (Python标准库，FastAPI和`rclpy`都基于此)
- **数据模型**: Pydantic (用于API请求/响应的数据验证)
- **RAG向量数据库**: ChromaDB (基于现有`vector_store`目录推断)
- **依赖管理**: `pip` 和 `requirements.txt`

## 3. 最终项目结构

为了实现模块化和高可维护性，项目将采用以下目录结构：

```
.
├── backend_service/
│   ├── src/
│   │   ├── __init__.py
│   │   ├── main.py                 # FastAPI应用主入口
│   │   ├── websocket_manager.py    # WebSocket连接管理器
│   │   ├── py_tree_generator.py    # RAG与LLM集成，生成py_tree
│   │   ├── ros2_client.py          # ROS2 Action客户端
│   │   ├── models.py               # Pydantic数据模型
│   │   └── prompts/                # 存放LLM的prompt模板
│   │       ├── system_prompt.txt
│   │       └── ...
│   ├── knowledge_base/             # RAG知识库源文件
│   │   └── first.ndjson
│   ├── vector_store/               # ChromaDB向量数据库
│   │   └── ...
│   └── requirements.txt            # Python依赖项
│
├── drone_interfaces/               # ROS2接口定义 (保持不变)
│   └── ...
└── (其他项目文件...)
```

## 4. 核心模块详解

### 4.1. FastAPI应用 (`main.py`)

这是整个服务的入口点，负责初始化所有组件并定义API端点。

- **职责**:
    - 创建FastAPI应用实例。
    - 初始化`PyTreeGenerator`, `MissionActionClient`, 和 `ConnectionManager`的单例对象。
    - 定义`POST /generate_plan`, `POST /execute_mission`, 和 `WS /ws/status`三个核心接口。
    - 在后台启动ROS2节点，并确保其与FastAPI的事件循环正确集成。

### 4.2. WebSocket管理器 (`websocket_manager.py`)

该模块专门处理与QGC插件的WebSocket连接。

- **类**: `ConnectionManager`
- **职责**:
    - `connect(websocket: WebSocket)`: 接受并存储新的客户端连接。
    - `disconnect(websocket: WebSocket)`: 移除断开的连接。
    - `broadcast(message: str)`: 向所有已连接的客户端广播消息。此方法必须是**线程安全**的，因为它将被ROS2回调（运行在不同线程）调用。

### 4.3. PyTree生成器 (`py_tree_generator.py`)

封装了所有与任务生成相关的复杂逻辑。

- **类**: `PyTreeGenerator`
- **职责**:
    - 初始化RAG系统，加载`vector_store`中的知识库。
    - 提供一个核心方法 `generate(user_prompt: str) -> dict`。
    - **`generate`方法内部流程**:
        1.  接收用户输入。
        2.  使用RAG的检索器从`vector_store`中查找最相关的知识片段（例如，可用的无人机动作、地理位置信息等）。
        3.  从`prompts/`目录加载系统Prompt模板。
        4.  将用户输入、检索到的知识组合成一个完整的Prompt。
        5.  调用外部或本地的LLM服务，获取生成的`py_tree.json`字符串。
        6.  验证返回的JSON是否符合`00_System_Overview_and_Interfaces.md`中定义的契约，确保其结构正确。
        7.  返回验证通过的Python字典。

### 4.4. ROS2 Action客户端 (`ros2_client.py`)

负责与无人机（模块三）进行通信。

- **类**: `MissionActionClient` (继承自 `rclpy.node.Node`)
- **职责**:
    - 初始化一个ROS2节点。
    - 创建一个`ExecuteMission` Action的客户端。
    - 提供一个核心方法 `send_goal(py_tree: dict)`。
    - **`send_goal`方法内部流程**:
        1.  将`py_tree`字典序列化为JSON字符串。
        2.  构建`ExecuteMission.Goal`消息。
        3.  异步发送Action目标，并注册`feedback_callback`。
    - **`feedback_callback`方法**:
        1.  此回调由`rclpy`的执行器在单独的线程中触发。
        2.  当收到无人机的状态反馈时，将`current_node_id`和`status`打包成一个字典。
        3.  获取FastAPI的事件循环，并使用`loop.call_soon_threadsafe()`安全地调用`websocket_manager.broadcast()`方法，将状态更新推送到前端。

### 4.5. 数据模型 (`models.py`)

使用Pydantic定义清晰、严格的API数据结构。

- **类**:
    - `GeneratePlanRequest(BaseModel)`: 包含`user_prompt: str`。
    - `ExecuteMissionRequest(BaseModel)`: 包含`py_tree: dict`。
    - `StatusUpdate(BaseModel)`: 包含`node_id: str`和`status: int`。

## 5. 数据流

### 5.1. 任务规划流程

`QGC Plugin` -> `POST /generate_plan` -> `main.py` -> `py_tree_generator.generate()` -> `RAG/LLM` -> `py_tree.json` -> `main.py` -> `QGC Plugin`

### 5.2. 任务执行与反馈流程

`QGC Plugin` -> `POST /execute_mission` -> `main.py` -> `ros2_client.send_goal()` -> `ROS2 Network` -> `Drone`
`Drone` -> `ROS2 Feedback` -> `ros2_client.feedback_callback()` -> `websocket_manager.broadcast()` -> `WS /ws/status` -> `QGC Plugin`

## 6. 后续步骤

1.  **环境搭建**: 根据`requirements.txt`创建虚拟环境并安装所有依赖。
2.  **代码实现**: 按照上述设计，逐一编写`websocket_manager.py`, `py_tree_generator.py`, `ros2_client.py`, `models.py`, 和 `main.py`。
3.  **单元测试与集成测试**: (可选，但建议) 为关键模块（如`py_tree_generator`）编写单元测试，并进行完整的集成测试。
4.  **部署**: 使用`uvicorn`等ASGI服务器运行FastAPI应用。

---
