# Offline Task Manager 离线任务管理模块

## 简介

`offline_task_manager` 是 PX4 自动驾驶系统的一个内部模块，用于实现无人机的离线任务托管和自主航线执行。该模块从本地 JSON 文件读取预规划任务点，根据优先级和电池状态进行路径规划，自动生成 PX4 mission 并触发执行。

## 功能特性

- **JSON 任务文件读取**：支持从 `/tmp/offline_tasks.json` 读取离线任务定义
- **智能路径规划**：基于最近邻算法（Nearest Neighbor）优化任务执行顺序
- **任务优先级支持**：支持紧急任务（must_first/priority=5）优先执行
- **电池感知**：根据当前电量和预估消耗过滤不可达任务
- **自动模式切换**：自动解锁无人机并切换至 `AUTO_MISSION` 模式
- **完整状态机**：从空闲到任务监控的全流程状态管理

## 使用流程

### 1. 准备任务文件

创建 `/tmp/offline_tasks.json`：

```json
{
  "version": 1,
  "mission_id": "test_mission",
  "start_mode": "auto",
  "tasks": [
    {
      "task_id": 1,
      "latitude": 47.397800,
      "longitude": 8.545600,
      "altitude": 520.0,
      "priority": 5,
      "must_first": false
    }
  ]
}
```

### 2. 启动模块

在 PX4 Shell 中执行：

```bash
# 启动模块
offline_task_manager start

# 查看状态
offline_task_manager status
```

### 3. 触发任务执行

```bash
# 启用模块
param set OTM_ENABLE 1

# 开始任务
param set OTM_START 1
```

模块将自动执行：
1. 等待 GPS 定位有效
2. 读取 JSON 任务文件
3. 路径规划（最近邻算法）
4. 写入 mission 到 dataman
5. 解锁并切换至 AUTO_MISSION 模式
6. 监控任务执行

## 模块参数

| 参数名 | 默认值 | 说明 |
|--------|--------|------|
| `OTM_ENABLE` | 0 | 启用/禁用模块 (0=禁用, 1=启用) |
| `OTM_START` | 0 | 触发任务执行 (设为1开始) |
| `OTM_LOW_BATT` | 20.0 | 低电量阈值 (%) |
| `OTM_BATT_INIT` | 100.0 | 初始模拟电量 (%) |
| `OTM_BATT_DRAIN` | 0.5 | 模拟电量消耗率 (%/s) |
| `OTM_FILE_PATH` | /tmp/offline_tasks.json | 任务文件路径 |
| `OTM_HOLD_T` | 10.0 | 航点悬停时间 (秒) |
| `OTM_ACC_RAD` | 2.0 | 航点接受半径 (米) |

## 文件结构

```
src/modules/offline_task_manager/
├── CMakeLists.txt                    # 构建配置
├── README.md                         # 本文件
├── offline_task.hpp                  # 任务数据结构
├── cJSON.h / cJSON.c                 # JSON 解析库
├── offline_task_parser.hpp/cpp       # 任务文件解析
├── offline_task_planner.hpp/cpp      # 路径规划器
├── offline_task_manager_params.c     # PX4 参数定义
├── offline_task_manager.hpp/cpp      # 主模块实现
```

## 状态机

```
IDLE (空闲)
  ↓
WAIT_FOR_HOME (等待设置home点)
  ↓
WAIT_FOR_POSITION (等待GPS定位)
  ↓
LOAD_TASK_FILE (加载JSON任务文件)
  ↓
VALIDATE_TASKS (验证任务有效性)
  ↓
PLAN_TASKS (路径规划)
  ↓
WRITE_MISSION (写入mission到dataman)
  ↓
START_MISSION (解锁并启动任务)
  ↓
MONITOR_MISSION (监控执行)
  ↓
IDLE (完成，返回空闲)
```

## 集成说明

- **构建目标**：已添加到 `amovlab_sitl_default` 和 `px4_sitl_default`
- **uORB 主题订阅**：
  - `battery_status` - 电池状态
  - `vehicle_global_position` - 全局位置
  - `home_position` - Home点位置
- **uORB 发布**：
  - `mission` - Mission状态
  - `vehicle_command` - 飞行模式切换命令
- **存储**：使用 dataman 持久化存储 mission items

## SITL 测试

```bash
# 启动仿真
make amovlab_sitl_default gazebo_p450

# 在 PX4 Shell 中
offline_task_manager start
param set OTM_ENABLE 1
param set OTM_START 1
```

**注意**：为避免数据链丢失保护触发返航，建议在 QGroundControl 中设置参数：
- `NAV_DLL_ACT = 0` (禁用数据链丢失保护)
- `COM_RC_IN_MODE = 1` (虚拟摇杆模式)

## 限制说明

- 最大支持 32 个离线任务点
- 当前仅支持多旋翼飞行器 (multicopter)
- 任务点高度为绝对海拔高度 (AMSL)
- SITL 测试时需要配合地面站或禁用相关 failsafe