# mission-planner **Repository Path**: zl_java/mission-planner ## Basic Information - **Project Name**: mission-planner - **Description**: 本项目是一个综合性卫星任务管理系统,包含两大核心模块:卫星任务规划和窗口分配。系统旨在解决卫星侦查、测控和数传任务的智能规划与调度问题,通过多种算法(贪心算法、遗传算法、模拟退火算法)确保在满足各种约束条件的前提下,最大化任务执行效率和资源利用率。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-06-05 - **Last Updated**: 2026-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 卫星任务规划系统 (Mission Planner) ## 项目简介 卫星任务规划系统是一个**卫星对地观测任务智能调度平台**,解决的核心问题是:**在给定时段内,哪颗卫星何时观测哪个目标、如何上下注指令、以及何时将数据传回地面站**。 系统分为**任务规划**(Mission Planner)与**窗口分配**两大模块,其中窗口分配包含 Window Allocation(上下传配套编排)和 Continuous Visibility(全时段覆盖接力)两种子功能,融合 9 种优化算法、物理约束模型和多种分配策略。 --- ## 规划架构 ``` ┌─────────────────────────────┐ ┌─────────────────────────────────────────────┐ │ 任务规划 (Mission Planner) │ │ 窗口分配 │ │ 输入:卫星、目标、可见窗口 │ ├─────────────────────┬───────────────────────┤ │ 输出:卫星观测计划列表 │ │ Window Allocation │ Continuous Visibility │ │ 算法:9种智能优化算法 │ │ 上下传窗口+站点 │ 覆盖次数+可见/下传窗口 │ └─────────────────────────────┘ │ → 上注+下传配套计划 │ → 最少卫星接力覆盖 │ └─────────────────────┴───────────────────────┘ ``` --- ## 功能特性 ### 任务规划层 - **9 种优化算法**:贪心、遗传、模拟退火、蚁群、粒子群、禁忌搜索、差分进化、大邻域搜索、混合算法 - **两种分配策略**:`MAX_UTILIZATION`(最大化总利用率)与 `PRIORITY_FIRST`(高优先级优先) - **窗口切割复用**:能量不足时自动切割时间窗口,剩余片段放入候选池供后续复用 ### 窗口分配层 - **三种上注策略**:一次性(ONE_TIME)、每日(DAILY)、任务前(PRE_MISSION) - **两种下传模式**:简单模式(不计算数据量)与动态模式(按"泳池模型"计算存储量,自动分段下传) - **三种下传关联策略**:INTERSECTION(有交集即可)、ONE_TO_ONE(严格一对一)、UNRESTRICTED(不限制) - **多级约束过滤**:频段匹配、开关机计划覆盖、结果完备性校验 ### 全时段覆盖层 - **最少卫星数策略**:优先复用已工作卫星,最小化所需卫星总数 - **满能量复用**:复用卫星需回满 `maxWorkingTimePerOrbit` 才允许再次选中 - **下传窗口配套**:优先选择有配套下传窗口的可见窗口 - **下传窗口切割**:下传窗口被部分使用后,剩余时段切割复用 --- ## 项目结构 ``` src/main/java/ ├── com/diaohw/mission/planner/ ← 核心算法实现层(会被 ProGuard 混淆) │ ├── algorithm/ │ │ ├── MissionPlannerAlgorithm.java 算法抽象基类 │ │ ├── GreedyAlgorithm.java 贪心算法 │ │ ├── GeneticAlgorithm.java 遗传算法 │ │ ├── SimulatedAnnealingAlgorithm.java 模拟退火算法 │ │ ├── AntColonyAlgorithm.java 蚁群算法 │ │ ├── ParticleSwarmAlgorithm.java 粒子群算法 │ │ ├── TabuSearchAlgorithm.java 禁忌搜索算法 │ │ ├── DifferentialEvolutionAlgorithm.java 差分进化算法 │ │ ├── LargeNeighborhoodSearchAlgorithm.java 大邻域搜索算法 │ │ ├── HybridAlgorithm.java 混合算法 │ │ ├── WindowAllocationAlgorithm.java 窗口分配算法 │ │ └── ContinuousVisibilityAlgorithm.java 全时段覆盖算法 │ ├── filter/ │ │ ├── FrequencyBandFilter.java 频段约束过滤 │ │ ├── IgnoreConditionFilter.java 结果完备性过滤 │ │ └── PowerScheduleFilter.java 开关机计划过滤 │ ├── model/ │ │ └── SatelliteEnergyModel.java "泳池"能量模型 │ └── utils/ │ └── SatelliteGeoUtil.java 地理空间计算工具 │ └── com/xtck/mission/planner/ ← 公共 API 层(不被 ProGuard 混淆) ├── obj/ │ ├── enums/ │ │ ├── AlgorithmType.java 算法类型枚举 │ │ ├── PlanningStrategy.java 任务分配策略枚举 │ │ ├── TTNCType.java 上注策略枚举 │ │ ├── DownlinkAllocationStrategy.java 下传关联策略枚举 │ │ ├── PlanRetentionCondition.java 过滤条件枚举 │ │ ├── TargetType.java 目标类型枚举 │ │ └── WindowType.java 窗口类型枚举 │ ├── equipment/ │ │ ├── SatelliteBO.java 卫星参数 │ │ ├── TargetBO.java 目标参数 │ │ ├── StationBO.java 地面站参数 │ │ └── InstrumentBO.java 天线/载荷参数 │ ├── window/ │ │ ├── SatelliteWindowBO.java 卫星可见窗口 │ │ ├── StationWindow.java 地面站通信窗口 │ │ └── TimeSlotBO.java 通用时间段 │ ├── req/ │ │ ├── MissionPlannerBO.java 一级规划输入 │ │ ├── WindowAllocationBO.java 二级分配输入 │ │ └── ContinuousVisibilityBO.java 三级覆盖输入 │ └── resp/ │ ├── SatellitePlanResp.java 卫星观测计划 │ ├── StationPlanResp.java 站点上下传计划 │ ├── WindowAllocationResp.java 二级分配输出 │ └── ContinuousVisibilityResp.java 三级覆盖输出 ├── service/ │ ├── MissionPlanningService.java 一级规划服务路由 │ ├── WindowAllocationService.java 二级分配服务 │ └── ContinuousVisibilityService.java 三级覆盖服务 └── report/ ├── AlgorithmReportGenerator.java 算法对比报告生成 ├── WindowAllocationReportGenerator.java 窗口分配报告生成 └── ContinuousVisibilityReportGenerator.java 覆盖报告生成 ``` --- ## 快速开始 ### 环境要求 - **JDK 17** 或更高版本 - **Maven 3.6** 或更高版本 ### 编译与打包 ```bash # 编译 mvn compile # 打包(含 ProGuard 混淆) mvn package ``` ### 运行测试 ```bash # 运行所有测试 mvn test # 运行算法对比测试 mvn exec:java -Dexec.mainClass="com.xtck.mission.planner.AlgorithmTest" # 运行窗口分配测试 mvn exec:java -Dexec.mainClass="com.xtck.mission.planner.WindowAllocationTest" # 运行全时段覆盖测试 mvn exec:java -Dexec.mainClass="com.xtck.mission.planner.ContinuousVisibilityTest" ``` --- ## 算法介绍 | 序号 | 算法 | 枚举 | 核心思想 | 特点 | 关键参数 | |:---:|------|------|----------|------|----------| | 1 | 贪心算法 | `GREEDY` | 按优先级排序,依次为窗口贪心分配,满足约束即安排 | 计算速度快,适合大规模问题的快速求解 | O(n),无需调参 | | 2 | 遗传算法 | `GENETIC` | 模拟生物进化:选择、交叉、变异寻优 | 全局搜索能力强,适合复杂问题 | 种群30,100代,交叉率0.8,变异率0.02 | | 3 | 粒子群算法 | `PARTICLE_SWARM_OPTIMIZATION` | 模拟鸟群觅食,群体智能+速度-位置更新 | 收敛速度快,参数调整简单 | 群体智能参数 | | 4 | 模拟退火算法 | `SIMULATED_ANNEALING` | 模拟金属退火,温度衰减+随机接受跳出局部最优 | 能跳出局部最优 | 温度衰减系数 | | 5 | 蚁群算法 | `ANT_COLONY` | 模拟蚂蚁觅食,信息素累积与挥发引导搜索 | 分布式计算,鲁棒性强 | 信息素参数 | | 6 | 差分进化算法 | `DIFFERENTIAL_EVOLUTION` | 个体间差分向量变异+交叉选择 | 全局搜索强,收敛快 | 种群参数 | | 7 | 禁忌搜索算法 | `TABU_SEARCH` | 禁忌表记忆避免重复搜索,强制探索新区域 | 局部搜索强,避免循环 | 禁忌表长度 | | 8 | 大邻域搜索 | `LARGE_NEIGHBORHOOD_SEARCH` | 破坏→修复策略在大邻域搜索 | 处理大规模问题,效率高 | 破坏比例0.25 | | 9 | 混合算法 | `HYBRID_ALGORITHM` | 贪心初始解+LNS破坏修复+SA接受准则 | 综合性能好,适应性强 | 迭代300次,破坏比0.25 | --- ## 卫星能量模型("泳池"模型) 系统采用经典的**泳池注水/放水模型**管理卫星工作能量: ``` ┌────────────────────────────────────────────┐ │ 泳池容量 = maxWorkingTimePerOrbit (默认 1200s) │ │ ┌──────────────────────────────────────┐ │ │ │ ░░░░░░░░░░░░ 当前水位 │ │ │ │ 空闲时注水 → 恢复速率 = 容量/轨道周期 │ │ │ │ 执行任务 → 放水(消耗可用时间) │ │ │ └──────────────────────────────────────┘ │ │ 约束:水位 ≧ 任务时长,间隔 ≧ adjacentPlanInt │ └────────────────────────────────────────────┘ ``` - **容量**:每轨道周期最大工作时间(由 `maxWorkingTimePerOrbit` 定义) - **恢复速率**:`容量 / orbitalPeriod`(每秒自动恢复的工作时间) - **放水**:执行任务消耗可用工作时间 - **约束**:任务开始时水位必须 ≥ 任务时长;相邻任务间隔 ≥ `adjacentPlanInterval` --- ## 约束体系 | 约束层 | 约束项 | 说明 | |--------|--------|------| | 一级 | 卫星工作时间 | 通过"泳池"模型控制每轨道周期最大工作时间 | | 一级 | 相邻任务间隔 | 同一卫星相邻两个计划的最小时间间隔 | | 一级 | 目标每日上限 | 每个目标一天内最多执行次数(`target.number`) | | 一级 | 优先级 | 高优先级目标优先分配 | | 二级 | 频段匹配 | 卫星频段必须与天线频段有交集 | | 二级 | 开关机计划 | 窗口时段必须在卫星和站点的开机时段内 | | 二级 | 结果完备性 | 根据 IgnoreCondition 过滤不满足条件的计划 | | 三级 | 满能量复用 | 复用卫星需回满能量 | | 三级 | 下传配套 | 可见窗口必须有可用下传窗口 | --- ## 输入输出示例 ### 任务规划 (MissionPlannerBO → List\) **输入:** ```json { "algorithmType": "GREEDY", "planningStrategy": "MAX_UTILIZATION", "startTime": "2025-01-01T00:00:00", "endTime": "2025-01-03T00:00:00", "satellites": [ { "id": "SAT-1", "name": "卫星一号", "orbitalPeriod": 5400, "maxWorkingTimePerOrbit": 1200, "adjacentPlanInterval": 30, "maxDataStorage": 500, "writeRate": 10, "compressionRatio": 4 } ], "targets": [ { "id": "TGT-1", "name": "目标A", "priority": 1, "type": "FIXED", "number": 3 } ], "slots": [ { "satelliteId": "SAT-1", "targetId": "TGT-1", "startTime": "2025-01-01T08:00:00", "endTime": "2025-01-01T08:30:00" } ] } ``` **输出:** `List` — 卫星观测计划列表 --- ### 窗口分配 (WindowAllocationBO → WindowAllocationResp) 在任务规划输出的基础上,附加上下传窗口和站点信息: **输入:** ```json { "satellitePlanList": [ ← 任务规划输出 { "planId": "P001", "satelliteId": "SAT-1", "targetId": "TGT-1", "startTime": "2025-01-01T08:00:00", "endTime": "2025-01-01T08:22:30", "duration": 1350 } ], "satellites": [...], "targets": [...], "uplinkPlanSlots": [ ← 上注(测控)窗口 { "satelliteId": "SAT-1", "stationId": "STN-A", "instrumentId": "ANT-1", "startTime": "2025-01-01T07:00:00", "endTime": "2025-01-01T07:10:00" } ], "downlinkPlanSlots": [ ← 下传(数传)窗口 { "satelliteId": "SAT-1", "stationId": "STN-B", "instrumentId": "ANT-2", "startTime": "2025-01-01T09:00:00", "endTime": "2025-01-01T09:15:00" } ], "uplinkStations": [ ← 测控站 { "id": "STN-A", "type": "TT_C", ... } ], "downloadLinkStations": [ ← 数传站 { "id": "STN-B", "type": "TRANSMISSION", "receiveRate": 300, ... } ], "ttncType": "PRE_MISSION", "ignoreConditionType": "REQUIRE_ALL" } ``` **输出:** `WindowAllocationResp` ```json { "visibilitySlots": [ ... ], ← 最终保留的观测计划 "uplinkSlots": [ ← 上注(测控)计划 { "planId": "U001", "stationId": "STN-A", "satelliteId": "SAT-1", "startTime": "2025-01-01T07:02:00", "endTime": "2025-01-01T07:04:00", "satellitePlanIds": ["P001"] } ], "downlinkSlots": [ ← 下传(数传)计划 { "planId": "D001", "stationId": "STN-B", "satelliteId": "SAT-1", "startTime": "2025-01-01T09:00:00", "endTime": "2025-01-01T09:12:00", "satellitePlanIds": ["P001"] } ] } ``` --- ### 全时段覆盖 (ContinuousVisibilityBO → List\) 直接从原始窗口出发,为每个目标寻找覆盖全时段的最优卫星组合: **输入:** ```json { "startTime": "2025-01-01T00:00:00", "endTime": "2025-01-01T06:00:00", "satellites": [ { "id": "SAT-1", "orbitalPeriod": 5400, "maxWorkingTimePerOrbit": 1200, "adjacentPlanInterval": 30 } ], "targets": [ { "id": "TGT-1", "name": "目标A", "priority": 1, "type": "FIXED", "number": 3, "minimumVisibleTime": 30 } ], "visibilityWindows": [ ← 卫星对目标可见窗口 { "satelliteId": "SAT-1", "targetId": "TGT-1", "startTime": "2025-01-01T00:00:00", "endTime": "2025-01-01T00:25:00" } ], "downlinkWindows": [ ← 下传窗口 { "satelliteId": "SAT-1", "stationId": "STN-A", "startTime": "2025-01-01T01:00:00", "endTime": "2025-01-01T01:15:00" } ], "downlinkAllocationStrategy": "ONE_TO_ONE" } ``` **输出:** `List` — 每个目标每轮覆盖的窗口组合及下传配套 --- ## 许可证 本项目采用 MIT 许可证。