# P600 无人机定点巡航控制系统 - 使用说明

## 系统简介

本系统是一个基于 Web 的 P600 无人机定点巡航控制前端，支持在地图上选择航点并让无人机按指定路径飞行。前端通过 **roslibjs** 直接连接机载 **rosbridge_server**，利用 ROS 话题和服务控制无人机，兼容**仿真模式**（Prometheus SITL）和**实机模式**（P600 WiFi 数传）。

## 系统架构

```
Windows 浏览器 ──WebSocket──► rosbridge_server ──ROS话题/服务──► PX4 飞控
  (地图+控制面板)               (机载/仿真 ROS)        (Prometheus/MAVROS)
```

- 前端通过 Leaflet 地图进行航点规划，通过 **roslibjs** 与 rosbridge_server 实时通信
- rosbridge_server 将 WebSocket 消息转换为 ROS 话题发布/订阅和服务调用
- 控制指令通过 `/prometheus/control_command` 话题发送到 Prometheus 控制节点
- 无人机状态通过 `/prometheus/drone_state` 话题接收
- 解锁/模式切换通过 MAVROS 服务（`/mavros/cmd/arming`、`/mavros/set_mode`）实现
- QGC 可同时连接同一无人机做监控，互不干扰

## 项目文件结构

```
软件前端/
├── index.html              # 主页面
├── css/
│   └── style.css           # 样式文件
├── js/
│   ├── map.js              # 地图模块（Leaflet 航点管理）
│   ├── websocket.js        # 通信模块（roslibjs + rosbridge）
│   └── ui.js               # 交互逻辑（按钮状态、日志）
└── server/
    ├── app.py              # Flask 静态文件服务器（仅托管页面）
    └── requirements.txt    # Python 依赖（仅 flask）
```

---

## 一、环境准备

### 1.1 安装 Python 依赖（仅用于启动静态文件服务器）

```bash
cd server
pip install -r requirements.txt
```

依赖内容：

| 包名 | 版本 | 作用 |
|------|------|------|
| flask | 3.0.0 | Web 框架，托管前端页面 |

### 1.2 确认 Python 版本

需要 **Python 3.8+**：

```bash
python --version
```

### 1.3 ROS 端依赖（在无人机机载电脑或仿真环境中）

需要在 ROS 环境中安装并运行以下组件：

| 组件 | 作用 |
|------|------|
| rosbridge_suite | WebSocket-ROS 桥接，允许浏览器通过 WebSocket 与 ROS 通信 |
| prometheus_msgs | Prometheus 自定义消息类型（ControlCommand、DroneState） |
| MAVROS | ROS-MAVLink 桥接，提供服务调用（解锁、模式切换等） |

安装 rosbridge_suite：

```bash
sudo apt install ros-<ros版本>-rosbridge-suite
# 例如 Ubuntu 20.04 + ROS Noetic:
sudo apt install ros-noetic-rosbridge-suite
```

---

## 二、仿真模式使用

> 适用场景：在电脑上调试，不需要真机，使用 Prometheus SITL 仿真

### 2.1 启动仿真环境（在 Ubuntu 虚拟机中）

```bash
# 1. 启动 Prometheus SITL 仿真
cd ~/Prometheus/...
roslaunch prometheus_gazebo sitl.launch

# 2. 在新终端中启动 rosbridge_server
roslaunch rosbridge_server rosbridge_websocket.launch
```

等待 Gazebo 窗口出现、PX4 终端显示 `pxh>` 即表示仿真就绪。rosbridge 默认监听端口 **9090**。

> **提示**：如果后端运行在 Windows 上，仿真在虚拟机中，需要确保虚拟机网络为**桥接模式**，并能从 Windows 访问虚拟机 IP。

### 2.2 启动前端页面服务器

```bash
cd server
python app.py
```

浏览器访问：`http://localhost:5000`

### 2.3 前端操作

1. 页面顶栏点击 **「仿真模式」**，地址栏自动填入 `ws://localhost:9090`
   - 如果仿真在虚拟机中，地址改为 `ws://<虚拟机IP>:9090`
2. 点击 **「连接无人机」**，等待连接成功提示
3. 在左侧地图上**点击添加航点**（可拖拽调整位置）
4. 在右侧面板设置每个航点的**高度**和**悬停时间**
5. 点击 **「上传任务」** → **「开始任务」**
6. 系统将自动：切换 OFFBOARD 模式 → 解锁电机 → 起飞 → 按航点顺序飞行
7. 可随时 **「暂停」** / **「继续」** / **「返航」** / **「降落」**

---

## 三、实机模式使用

> 适用场景：连接真实的 P600 无人机进行飞行

### 3.1 前置准备

1. P600 无人机**已上电**
2. 电脑连接 P600 的 **WiFi 数传**（WiFi 名称和密码见无人机底部标签）
3. 确认能 ping 通机载电脑 IP（默认 `192.168.1.31`）
4. 确认机载电脑上 **rosbridge_server 已启动**：
   ```bash
   # SSH 登录机载电脑后执行
   roslaunch rosbridge_server rosbridge_websocket.launch
   ```
   如果 rosbridge 已集成在 Prometheus 启动脚本中则无需手动启动。

### 3.2 启动前端页面服务器

```bash
cd server
python app.py
```

浏览器访问：`http://localhost:5000`

### 3.3 前端操作

1. 页面顶栏点击 **「实机模式」**，地址栏自动填入 `ws://192.168.1.31:9090`
2. 点击 **「连接无人机」**，等待连接成功
3. 在地图上规划航点 → 上传任务 → 开始任务（操作流程与仿真相同）

> **注意**：实机飞行时，QGC 可同时连接（MAVLink 协议支持多客户端），用于辅助监控无人机状态。

---

## 四、界面说明

### 4.1 顶部状态栏

| 区域 | 内容 |
|------|------|
| 左侧 | 系统名称、连接状态标签、飞行模式、电量、GPS 状态、速度、高度 |
| 右侧 | 仿真/实机模式切换、rosbridge 地址输入框、连接按钮 |

### 4.2 左侧地图区域

- **左键点击**：添加航点（蓝色编号标记）
- **蓝色虚线**：航点之间的飞行路径
- **蓝色三角图标**：无人机实时位置（随航向旋转）
- **红色实线**：无人机已飞过的航迹
- **拖拽标记**：移动航点位置

### 4.3 右侧控制面板

| 模块 | 功能 |
|------|------|
| 航点列表 | 显示所有航点的经纬度、高度；点击可定位；可单独删除 |
| 默认参数 | 设置新建航点的默认高度（米）和悬停时间（秒） |
| 任务操作 | 上传任务、开始任务、暂停/继续、返航、降落、清除航点 |
| 实时数据 | 纬度、经度、航向、当前航点进度 |

### 4.4 底部日志栏

- 实时显示操作记录和状态消息
- 颜色区分：绿色=成功，红色=错误，黄色=警告，灰色=信息

---

## 五、工作原理

### 5.1 通信流程

```
浏览器 (roslibjs) ──WebSocket──► rosbridge_server (端口 9090)
                                     │
                    ┌────────────────┼────────────────┐
                    ▼                ▼                ▼
            /prometheus/      /prometheus/       /mavros/
            control_command   drone_state        cmd/arming
            (发布控制指令)     (订阅无人机状态)   (服务调用)
```

### 5.2 航点导航机制

本系统采用**前端控制的逐航点导航**模式：

1. 用户在地图上添加航点（经纬度 + 高度）
2. 点击「上传任务」时，前端将经纬度转换为 ENU 坐标（以东经北天为坐标轴）
3. 点击「开始任务」后，系统按以下顺序执行：
   - 先发布控制指令（OFFBOARD 模式需要先有指令流）
   - 切换 OFFBOARD 模式（MAVROS 服务调用）
   - 解锁电机（MAVROS 服务调用）
   - 发送起飞指令（Prometheus TAKEOFF 命令）
   - 逐个航点发送 MOVE 指令，以 10Hz 频率持续发布
   - 检测到达航点（距离 < 2 米），自动切换到下一个航点
4. 所有航点完成后自动悬停

### 5.3 坐标转换

- 地图使用 WGS84 经纬度坐标
- ROS/Prometheus 使用 ENU（东-北-天）局部坐标系
- 系统在首次获取 GPS 定位时自动设置坐标原点
- 所有航点在「上传任务」时从经纬度转换为相对于原点的 ENU 坐标

---

## 六、按钮状态说明

| 状态 | 上传任务 | 开始任务 | 暂停 | 继续 | 返航 | 降落 |
|------|----------|----------|------|------|------|------|
| 未连接 | 禁用 | 禁用 | 禁用 | 禁用 | 禁用 | 禁用 |
| 已连接（有航点） | 启用 | 禁用 | 禁用 | 禁用 | 启用 | 启用 |
| 任务已上传 | 禁用 | 启用 | 禁用 | 禁用 | 启用 | 启用 |
| 任务执行中 | 禁用 | 禁用 | 启用 | 禁用 | 启用 | 启用 |
| 任务已暂停 | 禁用 | 禁用 | 禁用 | 启用 | 启用 | 启用 |

---

## 七、完整操作流程

```
  ┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
  │ 启动 ROS  │────►│  连接前端  │────►│ 地图添加航点│────►│  上传任务  │
  │ SITL/实机 │     │ 选择模式   │     │ 点击地图   │     │ 转换坐标   │
  └──────────┘     └──────────┘     └──────────┘     └────┬─────┘
                                                           │
  ┌──────────┐     ┌──────────┐     ┌──────────┐          │
  │  任务完成  │◄────│  飞行监控  │◄────│  开始任务  │◄─────────┘
  │ 或返航降落 │     │ 实时遥测   │     │ 解锁→起飞  │
  └──────────┘     └──────────┘     └──────────┘
```

---

## 八、连接参数参考

| 参数 | 仿真模式 | 实机模式 |
|------|----------|----------|
| 协议 | WebSocket | WebSocket |
| rosbridge 地址 | `ws://localhost:9090` | `ws://192.168.1.31:9090` |
| 连接对象 | 本地/虚拟机 rosbridge | P600 机载电脑 rosbridge |
| 网络要求 | 本地或虚拟机网络 | P600 WiFi 数传 |
| ROS 话题（控制） | `/prometheus/control_command` | `/prometheus/control_command` |
| ROS 话题（状态） | `/prometheus/drone_state` | `/prometheus/drone_state` |
| ROS 话题（GPS） | `/mavros/global_position/raw/fix` | `/mavros/global_position/raw/fix` |
| ROS 服务（解锁） | `/mavros/cmd/arming` | `/mavros/cmd/arming` |
| ROS 服务（模式） | `/mavros/set_mode` | `/mavros/set_mode` |

---

## 九、常见问题

### 连接超时怎么办？

**仿真模式：**
- 确认 Prometheus SITL 已启动（`roslaunch prometheus_gazebo sitl.launch`）
- 确认 rosbridge_server 已启动（`roslaunch rosbridge_server rosbridge_websocket.launch`）
- 如果仿真在虚拟机中，确认 Windows 能 ping 通虚拟机 IP
- 确认虚拟机网络为桥接模式

**实机模式：**
- 确认电脑已连接 P600 的 WiFi 数传
- 在终端执行 `ping 192.168.1.31` 确认网络通畅
- 确认无人机已上电
- 确认机载电脑上 rosbridge_server 正在运行
- 关闭 VPN/防火墙等可能干扰网络的软件

### 航点任务执行失败？

- 确认无人机 GPS 已定位（状态栏显示 "3D Fix"）
- 航点高度建议设置在 10 米以上
- 确认无人机已通过安全检查（传感器校准、解锁检查等）
- 检查日志中的 ROS 话题和服务调用是否成功

### Prometheus 话题收不到数据？

- 确认 Prometheus 控制节点正在运行
- 在 ROS 端检查话题是否存在：`rostopic list | grep prometheus`
- 检查话题数据：`rostopic echo /prometheus/drone_state`
- 确认 `prometheus_msgs` 包已正确编译和 source

### 如何同时使用 QGC 监控？

MAVLink 协议支持多客户端同时连接。QGC 通过 MAVLink 连接（UDP 14550），本系统通过 rosbridge 连接（WebSocket 9090），两者互不干扰，监控的是同一架无人机。

### 默认航点参数可以改吗？

可以。右侧面板的「默认高度」和「默认悬停时间」会影响后续新建的航点。已创建的航点参数不受影响。
