Compare commits

..
64 Commits
Author SHA1 Message Date
ArmorandClaude 3d3eeea1f7 chore: 更新项目文档与忽略规则,移除旧镜像归档跟踪
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 15:03:20 +08:00
ArmorandClaude 4ef15545e3 feat(wiki): 新增 GHC06 任务页与图库发布体系,级联更新既有页面
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 15:03:14 +08:00
ArmorandClaude 26d2fcd0b1 feat(topology): add GHC06 layout and deploy docs
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 15:02:47 +08:00
ArmorandClaude cf1d26dba9 feat: add simulation settings and location board redesign
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 15:02:34 +08:00
ArmorandClaude 65e77cc227 chore: gitignore Playwright output and IDE cache dirs
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 17:12:20 +08:00
ArmorandClaude cc0edb16ae chore: add Playwright verification screenshots
- GHC-04 and GHC-05 live verification screenshots
- Lightbox fix and format audit reference captures

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:48:44 +08:00
ArmorandClaude 99be2032ea chore: update Docker config and Guanghan mission timeline
- Docker: update config for topology API deployment
- Timeline: complete GHC-06 EVA log through EVA-14

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:48:32 +08:00
ArmorandClaude 34072782ba chore: add project scripts, handover docs, and format guide
- guanghan_windows.py: Windows launcher script
- inject_lightbox: lightbox injection utilities
- handover docs: future missions proposal, vehicle creation guide, format guide

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:48:20 +08:00
ArmorandClaude 5cbffa1386 feat(topology): add Guanghan base topology API and Docker deployment
- Independent Flask app with snapshot API (GET /api/v1/bases/guanghan/snapshot)
- Temporal database model with PostgreSQL (ksp_wiki_topology)
- Presentation-driven rendering with DB-stored styles
- Docker image for server deployment

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:48:10 +08:00
ArmorandClaude 58959eb93a feat(wiki): add vehicle reference pages for Guanghan program
- Binglun lander, Chang'e crewed vehicle, Wugang lunar lander
- Jinchan transfer stage, CZ-10E, CZ-16, CZ-16A launch vehicles

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:48:02 +08:00
ArmorandClaude ba59186d7f feat(wiki): restructure BL and JC deployment pages to Wikipedia standard
- Merged overview h2 into lead paragraphs
- Converted timeline tables to chronological narrative h3 with date ranges
- Added task achievements section to all unmanned mission pages
- Unified infobox format with label/data columns

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:47:56 +08:00
ArmorandClaude fb39488d3a feat(wiki): restructure all GHC mission pages to Wikipedia standard
- Unified chapter structure: lead > background > crew > task details(h3 chronological) > EVA log(single table) > results > topology > see also
- All h3 headings include date ranges matching GHC-04/05 format
- Simplified EVA tables to single wikitable per page
- Added topology iframe embed to GHC-01 through GHC-04
- Program root page updated with Wikipedia formatting
- Changed CZ-16A/Wugang factual error on GHC-05

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 14:47:48 +08:00
ArmorandOpenAI Codex da2d01a5aa fix(wiki): restore GHC-05 image lightbox
Document the shared Wikipedia-style mission page format and the required Wiki.js script extraction workflow.

Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 18:06:37 +08:00
ArmorandOpenAI Codex 1b6c599a89 fix(wiki): prevent GHC-05 layout collisions
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 17:07:53 +08:00
ArmorandOpenAI Codex 5b9c727d09 fix(wiki): use Wiki.js navigation on GHC-05
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 16:44:57 +08:00
ArmorandOpenAI Codex 91d4ddd643 fix(wiki): refine GHC-05 infobox spacing
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 16:19:46 +08:00
ArmorandOpenAI Codex e9b54723ec feat(wiki): restyle GHC-05 as Wikipedia article
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 15:35:32 +08:00
ArmorandOpenAI Codex c99c910aa3 feat(topology): add square light canvas
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 12:21:34 +08:00
ArmorandOpenAI Codex 8d057dbfa3 fix(wiki): proxy topology through public gateway
Co-Authored-By: OpenAI Codex <codex@openai.com>
2026-07-15 10:53:18 +08:00
Armor e3b3a16b10 feat(wiki): embed GHC-05 topology 2026-07-15 00:08:13 +08:00
ArmorandClaude 450080d6fd docs(timeline): add GHC-06 Guanghan 04 module installation EVA-8 to EVA-14
7 EVAs covering unload, cross node positioning, module deployment,
pressurized corridor, and integration testing. Base capacity 10→14.
Also fix typo: 金蟾#3 → 金蟾二号.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-14 23:21:37 +08:00
ArmorandClaude 9d66d00a4e docs(timeline): add GHC-06 EVA-4 and EVA-5 (Jan 23-28)
Fill the gap between EVA-3 (Jan 15 handover) and EVA-6 (Feb 6).
EVA-4: Physical removal of Binglun #1 ISRU equipment after software
shutdown in EVA-2. Binglun #1 converted to standard cargo configuration.
EVA-5: Fuel transfer line verification between Binglun #1/#2 plus full
base system inspection following GHC-05 crew departure.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-14 23:03:27 +08:00
ArmorandClaude ac2578ca8b fix(wiki): use group(1) for script extraction; use link button for topology
The wiki_update_page.py script had a bug where extract_script_to_script_js
used match.group(0) (including <script> tags) instead of group(1) (pure JS).
This caused Wiki.js to render page JS as escaped HTML text rather than
executing it.

Since Wiki.js markdown editor strips iframes and only the markdown editor
is enabled, the topology diagram is now linked via a prominent button that
opens the interactive topology viewer in a new tab.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-13 17:06:33 +08:00
ArmorandClaude e8e2f99450 feat(wiki): embed interactive topology diagram in Guanghan Program page
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-13 16:53:58 +08:00
Armor 2121247583 test(topology): audit presentation adaptation 2026-07-10 00:10:04 +08:00
ArmorandClaude 67261b10a1 test(topology): verify database-driven presentation rendering
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:51:18 +08:00
ArmorandClaude 10808fd98b feat(topology): render styles from presentation payload
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:49:27 +08:00
ArmorandClaude 2382b5b483 test(topology): require database-driven visual semantics
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:46:41 +08:00
ArmorandClaude 7deda3a589 feat(topology): return diagram presentation styles
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:46:13 +08:00
ArmorandClaude d214d93f71 feat(topology): seed diagram presentation styles
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:44:58 +08:00
ArmorandClaude 00026fbbe7 test(topology): require database presentation payload
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 23:43:20 +08:00
Armor 14ea13d6a4 docs(topology): plan presentation database implementation 2026-07-09 23:40:15 +08:00
Armor 479e37e00f docs(topology): design database-driven presentation layer 2026-07-09 22:51:14 +08:00
Armor f5cbe1b028 test(topology): record repaired page verification 2026-07-09 22:22:30 +08:00
Armor 67229e2cde fix(topology): record verified vehicle dimensions 2026-07-09 22:21:11 +08:00
Armor 5a8a04c440 fix(topology): repair controls navigation and details 2026-07-09 22:08:42 +08:00
Armor 6ff18623e0 feat(topology): render temporal graph from database 2026-07-09 22:04:31 +08:00
Armor 0dbcd3086e feat(topology): persist complete diagram semantics 2026-07-09 21:53:00 +08:00
Armor e7becba0b0 fix(topology): correct mission anchors and rover ports 2026-07-09 21:49:52 +08:00
Armor 808276e225 fix(topology): validate time and list missions 2026-07-09 21:47:29 +08:00
Armor 270956c348 fix(topology): secure and unify demo serving 2026-07-09 21:45:53 +08:00
Armor e5f004fea4 docs: plan Guanghan topology repairs 2026-07-09 21:43:43 +08:00
Armor 9b663aca55 docs: audit Guanghan topology adaptation 2026-07-09 21:35:48 +08:00
ArmorandClaude 772f0f78f6 feat(topology): M2 - API-driven demo page with layout tables and dynamic rendering
- Add diagram_layouts and diagram_nodes tables
- Seed layout coordinates extracted from SVG
- Extend snapshot API to return layout data
- Rewrite demo page to fetch from API dynamically
- Support ?mission= and ?at= URL parameters
- Modal details populated from database component data
- Show/hide nodes based on component existence at snapshot time

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 21:06:13 +08:00
ArmorandClaude b5156d1306 fix(topology): adapt queries for psycopg 3 array syntax
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:53:48 +08:00
ArmorandClaude adf3c60688 feat(topology): add seed data script for GHC-01 through GHC-05
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:52:11 +08:00
ArmorandClaude e4b633e25d feat(topology): add snapshot query logic, API route, and Flask app entry
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:50:09 +08:00
ArmorandClaude 29fc482bb0 feat(topology): add Flask app skeleton with db connection (psycopg 3)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:49:23 +08:00
ArmorandClaude d31e09fdea feat(topology): create 8 core tables with constraints and indexes
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:48:28 +08:00
ArmorandClaude 481992bacc feat(topology): create database extensions and schema
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 20:47:28 +08:00
Armor ec732d5aab docs: design Guanghan temporal topology database 2026-07-09 20:24:12 +08:00
ArmorandCodex 4f41976292 style: label Guanghan radiator panels
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 17:33:57 +08:00
ArmorandCodex b1a91159d9 feat: add Guanghan module detail modal
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:59:39 +08:00
ArmorandCodex 2780847c50 feat: rebuild Guanghan topology diagram
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:55:39 +08:00
ArmorandCodex 5352173f08 docs: 修正广寒基地加压走道记录
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:50:48 +08:00
ArmorandCodex 9f0b8310d8 test: define Guanghan topology contract
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:49:08 +08:00
ArmorandCodex 051aadc707 docs: 添加广寒拓扑实施计划
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:43:35 +08:00
ArmorandCodex bd1cb1efc7 docs: 记录广寒基地拓扑图设计
Co-Authored-By: Codex <noreply@openai.com>
2026-07-09 16:37:26 +08:00
ArmorandClaude Opus 4.7 491b3c9898 chore: update CLAUDE.md and .env.example
- CLAUDE.md: project reference with naming conventions, wiki publishing, run guide
- .env.example: add XIAOMI_MIMO_API_KEY example

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 12:04:50 +08:00
ArmorandClaude Opus 4.7 8d281eefd6 chore: add vision tool and Claude Code skill for UI screenshot review
- scripts/vision.py: call MiMo v2.5 via Anthropic-format API for image analysis
- scripts/screenshot_mission_list.py: Playwright screenshot of /missions page
- .claude/skills/vision.md: Claude Code skill for vision task delegation

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 12:04:45 +08:00
ArmorandClaude Opus 4.7 0b4a5c6aa0 style: add mission list page CSS (~190 rules)
Covers previously undefined classes used by /missions and its includes:
- mission-filter-grid, mission-filter-pill, mission-filter-pill-row
- preview-tab, mission-preview-nav, mission-ops-tabs-panel
- mission-page-header, summary-card, mission-page-header-metrics
- data-table, mission-log-table, two-line-cell, table-subline, table-title
- table-actions, table-link, clamp-line, chip, field-label, eyebrow
- mission-datetime-control-row, mission-datetime-display-input
- primary-button, secondary-button
- panel, top-gap, empty-state

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 12:04:40 +08:00
ArmorandClaude Opus 4.7 01ea41de9b chore: add CLAUDE.md project reference
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-05 17:18:23 +08:00
ArmorandClaude Opus 4.7 bbc924f9b2 chore: gitignore all KSP screenshots (~174 MB, 30 PNGs)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-05 16:29:04 +08:00
ArmorandClaude Opus 4.7 354c38d246 chore: gitignore wiki-upload cache dirs (~126 MB duplicate PNGs)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-05 16:27:37 +08:00
228 changed files with 27420 additions and 201 deletions
+36
View File
@@ -0,0 +1,36 @@
---
name: guanghan-launch-windows
description: Calculate upcoming Earth departure launch windows and lunar landing windows for the Guanghan Program. Use when given a date and asked to find launch windows, landing windows, or mission planning dates for Guanghan missions.
---
# 广寒计划发射窗口计算
广寒基地往返标准 LLO,每月有 2 个标准窗口。给定任意时间,计算最近的地球出发发射窗口及对应的月球着陆窗口。
## 核心参数
- 月球自转周期:27.32166 天
- 每月标准窗口数:2 个
- 地月转移耗时:5 天
- 参考窗 A2024-09-23 12:13 UTC
- 参考窗 B2024-10-01 14:34 UTC
## 使用方法
```bash
python scripts/guanghan_windows.py "<日期时间>"
```
## 示例
```bash
python scripts/guanghan_windows.py "2024-07-20"
python scripts/guanghan_windows.py "2024-12-15 08:00"
```
## 输出
输出表格包含:
- 最近 4 个发射窗口(地球出发,UTC)
- 对应的着陆窗口(发射 + 5 天,UTC)
- 距查询时间的偏移量
+45
View File
@@ -0,0 +1,45 @@
---
name: vision
description: Use when you need to visually inspect a screenshot, UI render, or any image — the current model has no multimodal capability, so vision tasks MUST be delegated to this tool.
---
# Vision Tool
When you need to look at an image (screenshot, UI render, diagram, photo), call the MiMo v2.5 multimodal model via this script.
## Usage
```bash
python scripts/vision.py "<image_path>" "<question>"
```
## When to Call
You MUST use this for any of the following:
- Checking a UI screenshot for layout issues (overlapping elements, overflow, alignment)
- Verifying a page render looks correct after a change
- Reading text or data from a screenshot
- Analyzing any image the user provides
- Any task where you think "I wish I could see this"
## Examples
```bash
# Basic UI inspection
python scripts/vision.py "demo/test_screenshots/timeline_page.png" \
"Check this timeline page for any UI issues: overlapping elements, clipped text, misaligned segments. Report each issue with its location."
# Comparing two screenshots
python scripts/vision.py "demo/test_screenshots/docking_modal.png" \
"Is the docking modal properly centered? Are all buttons visible and correctly labeled? Is the datetime input functional-looking?"
# Reading wiki page render
python scripts/vision.py "data/KSP/Vulture Shuttle Full Stack at Launch Pad.png" \
"Describe what you see in this image in detail."
```
## Notes
- Images over ~5 MB may be slow; consider resizing large screenshots first
- The MiMo model runs remotely — no local GPU needed
- Response is text-only; the model describes what it sees
+12 -1
View File
@@ -2,5 +2,16 @@
.venv
__pycache__
.idea
.env
instance
*.pyc
.superpowers
user_input
handover
scripts
docs
demo
tests
app
migrations
data/wiki/*.html
!data/wiki/guanghan_topology_demo.html
+3
View File
@@ -20,5 +20,8 @@ wiki_useremail=example@email.com
wiki_username=example_user
wiki_password=example_password
# 小米的模型的api_key
XIAOMI_MIMO_API_KEY=example_api_key
# 说明:此文件为示例,不包含真实凭据。将真实凭据写入本地的 .env 文件并确保其被 .gitignore 忽略。
+19 -2
View File
@@ -8,6 +8,7 @@ instance/
.pytest_cache/
.mypy_cache/
user_input/
# Note: user_input/广寒计划/Timeline.md is intentionally tracked (mission timeline source)
# Temp files
~$*
@@ -20,11 +21,27 @@ scripts/update_vulture_wiki.py
# Reference docs & reports
docs/
# Tests (E2E/screenshot-based)
tests/
# Local E2E tests remain ignored; keep new regression coverage trackable.
tests/*
!tests/test_first_stage_fixes.py
# Demo screenshots
demo/test_screenshots/
# Generated output: deployment bundles, screenshot caches, Playwright logs
output/
.playwright-cli/
.superpowers/
# KSP screenshots and upload cache
data/KSP/
# Docker image archives (rebuilt per release; deploy docs are the source of truth)
docker_image/*.tar
docker_image/*.tar.gz
# Verification screenshots
artifacts/
# Misc
test1
+80
View File
@@ -0,0 +1,80 @@
# KSP 管理后台 (KSP Management Backend)
- Note: you should always refer the user as Doctor Armor. It is non-negotiable.
Flask-based admin panel for a fictional space simulation universe.
## Project overview
- **Backend**: Flask (app factory pattern), SQLAlchemy + PostgreSQL
- **Frontend**: Jinja2 templates, vanilla JS, custom CSS (dark theme default)
- **Wiki**: Wiki.js instance at `http://192.168.195.241:38353`, pages published via `scripts/wiki_update_page.py`
- **Simulation time**: 2060-03-12 09:00 UTC (DB-backed, no URL param)
## Running the app
```bash
cd "d:/My Coding Project/KSP_Project"
PYTHONPATH="d:/My Coding Project/KSP_Project" python -m flask run --host=0.0.0.0 --port=9000 --debug
```
Use `cmd //c "taskkill /f /im python.exe"` to kill running Flask processes on Windows.
## Key directories
| Directory | Purpose |
|-----------|---------|
| `app/routes/` | Flask blueprints (web.py, api.py) |
| `app/templates/` | Jinja2 templates |
| `app/static/` | CSS, JS |
| `app/models.py` | SQLAlchemy models |
| `data/wiki/` | Local HTML copies of Wiki.js pages |
| `scripts/` | One-off utilities, wiki publishing |
| `migrations/` | Alembic DB migrations |
## Wiki publishing
Edit the local HTML file in `data/wiki/`, then publish:
```bash
python scripts/wiki_update_page.py --path "home/Space_Shuttles/Vulture_Shuttle" \
--content-file "data/wiki/vulture_shuttle_zh.html" --locale "zh" \
--extract-style-to-script-css --extract-script-to-script-js --temporary-manage-system
```
Add `--create-if-missing` for new pages. HTML files use `<style>` blocks (extracted to page CSS) and wiki-infobox table patterns. Images use `<div class="image-placeholder">` when the actual render is not yet available.
### Mission gallery release gate (mandatory)
- Mission gallery interaction is provided only by `scripts/wiki_mission_gallery_runtime.js`, published with `scripts/wiki_publish_mission_gallery_runtime.py`. Do not put gallery JavaScript in page `scriptJs` or inline `<script>` blocks.
- After any gallery content, CSS, runtime, or publishing change, run both commands below. A gallery release is incomplete if either command fails or if screenshots were not visually inspected:
```powershell
py -3.12 -m pytest tests/test_mission_galleries.py -q -p no:cacheprovider
py -3.12 scripts/wiki_verify_mission_galleries.py --screenshot-dir output/playwright/mission-gallery-e2e
```
- The E2E gate must cover every mission gallery, not a sample. See `docs/wiki-mission-gallery-quality-gate.md` for the incident root cause and checklist.
## Database
- PostgreSQL is authoritative for mission logs and timelines
- Excel files (log_book.xlsx, Timeline.xlsx) are reference only, not data sources
- Use `_default_simulation_time()` in `web.py` for the canonical sim time
## Naming conventions
- ST-01 = 万星源号 (Wanxingyuan / Stellaria), lead ship of Stellaria-class
- ST-02 = 克丽斯腾号 (Kristen), second Stellaria-class ship
- Star Port Station = 星港空间站 (LEO orbital shipyard, home port for motherships)
- Star Ring Station = 星环空间站 (separate station, do not confuse with Star Port)
- Xihe-class = 羲和级 (XH-01 through XH-04)
- Stellaria-class = 万星源级 (ST-01 through ST-04)
- Vulture Shuttle = 秃鹫航天飞机, ThunderHawk Shuttle = 雷鹰航天飞机
- Solar Shuttle = 金乌 (JW-01/02/03)
- Vulture Block 1.5 (VS-06/VS-07) did NOT participate in mothership construction; after conversion they built Star Port Station
## Commit style
- Conventional commit prefixes: `feat:`, `fix:`, `docs:`, `refactor:`, `chore:`
- Co-Authored-By trailer on all commits
- Chinese for wiki/docs commits, English for code commits
+6 -5
View File
@@ -1,15 +1,16 @@
FROM python:3.12-slim
FROM docker.m.daocloud.io/library/python:3.12-slim-bookworm
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt ./
COPY topology_api/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
COPY topology_api/ topology_api/
COPY data/wiki/guanghan_topology_demo.html data/wiki/
EXPOSE 8000
EXPOSE 8080
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "main:app"]
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--workers", "2", "--timeout", "30", "topology_api.app:create_app()"]
+10 -2
View File
@@ -3,7 +3,7 @@ from __future__ import annotations
import uuid
from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, Numeric, String, Text, Uuid
from sqlalchemy import Boolean, DateTime, ForeignKey, Index, Integer, Numeric, String, Text, Uuid
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.extensions import db
@@ -22,6 +22,13 @@ class TimestampMixin:
)
class SimulationSetting(TimestampMixin, db.Model):
__tablename__ = "simulation_settings"
key: Mapped[str] = mapped_column(String(255), primary_key=True)
value: Mapped[str] = mapped_column(Text, nullable=False)
class EngineFamily(TimestampMixin, db.Model):
__tablename__ = "engine_families"
@@ -130,9 +137,10 @@ class VehicleCost(TimestampMixin, db.Model):
class Asset(TimestampMixin, db.Model):
__tablename__ = "assets"
__table_args__ = (Index("ix_assets_name", "name"),)
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
name: Mapped[str] = mapped_column(String(255), nullable=False, unique=True, index=True)
name: Mapped[str] = mapped_column(String(255), nullable=False, unique=True)
asset_type: Mapped[str] = mapped_column(String(120), nullable=False, index=True)
is_retired: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
program: Mapped[str | None] = mapped_column(String(255))
+137 -48
View File
@@ -10,13 +10,13 @@ import re
from typing import Any
import uuid
from flask import Blueprint, abort, flash, has_request_context, redirect, render_template, request, session, url_for
from sqlalchemy import select, text, distinct
from sqlalchemy.exc import IntegrityError
from flask import Blueprint, abort, current_app, flash, has_request_context, redirect, render_template, request, session, url_for
from sqlalchemy import select, distinct
from sqlalchemy.exc import IntegrityError, SQLAlchemyError
from sqlalchemy.orm import selectinload
from app.extensions import db
from app.models import Asset, AssetLogEntry, AssetStateNode, CommunicationPart, DockingEvent, EngineFamily, EngineVariant, TankSpec, VehicleCost
from app.models import Asset, AssetLogEntry, AssetStateNode, CommunicationPart, DockingEvent, EngineFamily, EngineVariant, SimulationSetting, TankSpec, VehicleCost
from app.services.fuel_conversion import list_fuel_factors
from app.services.log_book_importer import import_log_book_data
@@ -669,30 +669,29 @@ HARDCODED_SIMULATION_TIME = datetime(2060, 3, 12, 9, 0, tzinfo=timezone.utc)
def _db_read_simulation_time() -> datetime | None:
try:
row = db.session.execute(
text("SELECT value FROM simulation_settings WHERE key = 'current_time'")
).fetchone()
if row is None:
setting = db.session.get(SimulationSetting, "current_time")
if setting is None:
return None
return _parse_datetime(row[0], "DB Simulation Time")
except Exception:
return _parse_datetime(setting.value, "DB Simulation Time")
except (SQLAlchemyError, ValueError) as exc:
db.session.rollback()
current_app.logger.warning("Unable to read simulation time: %s", exc)
return None
def _db_write_simulation_time(value: datetime) -> None:
formatted = _format_datetime_input(value)
try:
db.session.execute(
text(
"INSERT INTO simulation_settings (key, value, updated_at) "
"VALUES ('current_time', :val, NOW()) "
"ON CONFLICT (key) DO UPDATE SET value = :val2, updated_at = NOW()"
),
{"val": formatted, "val2": formatted},
)
setting = db.session.get(SimulationSetting, "current_time")
if setting is None:
setting = SimulationSetting(key="current_time", value=formatted)
db.session.add(setting)
else:
setting.value = formatted
db.session.commit()
except Exception:
except SQLAlchemyError:
db.session.rollback()
raise
def _default_simulation_time() -> datetime:
@@ -3113,6 +3112,7 @@ def dashboard() -> str:
"location": snapshot.get("current_location", ""),
"mission": snapshot.get("current_mission", ""),
"state": snapshot.get("current_state", ""),
"future_events": snapshot.get("future_events", []),
})
# Metrics
@@ -3139,22 +3139,22 @@ def dashboard() -> str:
# Upcoming events (30 days)
now = simulation_time
upcoming_cutoff = now + timedelta(days=30)
upcoming_events = []
for a in active:
snapshot = _build_asset_snapshot(a if hasattr(a, "log_entries") else assets[0], simulation_time)
for ev in snapshot.get("future_events", []):
ev_date = ev.get("date", "")
if ev_date and ev_date >= now.strftime("%Y-%m-%d"):
for ev in a["future_events"]:
event_at = _as_utc(ev.get("sort_at"))
if event_at is not None and now < event_at <= upcoming_cutoff:
upcoming_events.append({
"date": ev_date,
"date": event_at.strftime("%Y-%m-%d"),
"title": f"{a['name']}: {ev.get('title', '')}",
"within_30d": True,
})
upcoming_events.sort(key=lambda e: e["date"])
upcoming_count = len(upcoming_events)
upcoming_events = upcoming_events[:5]
active_missions = len([a for a in active if a["state"] in ("Transfer", "Exploration")])
upcoming_count = len(upcoming_events)
upcoming_summary = f"{upcoming_count} events" if upcoming_count else "None imminent"
return render_template(
@@ -4677,43 +4677,132 @@ def mission_status_board_preview() -> str:
def mission_location_board_preview() -> str:
simulation_time = _resolve_simulation_time(request.args.get("sim_time"))
simulation_time_input = _format_datetime_input(simulation_time)
# Load all assets with logs
assets = _load_assets_with_logs()
# Build asset position data for Canvas
# Map location strings to approximate orbital bodies and distances
LOCATION_BODY_MAP = {
"LEO": "earth", "GEO": "earth", "MEO": "earth", "Earth System": "earth", "Earth Surface": "earth",
"Lunar Orbit": "moon", "Lunar Surface": "moon",
"Mars Orbit": "mars", "Mars Surface": "mars", "Phobos Orbit": "mars", "Deimos Orbit": "mars",
"Jupiter Orbit": "jupiter", "Europa Orbit": "jupiter", "Europa Surface": "jupiter",
"Ganymede Orbit": "jupiter", "Callisto Orbit": "jupiter",
"Saturn Orbit": "saturn", "Titan Orbit": "saturn", "Titan Surface": "saturn",
"Uranus Orbit": "uranus", "Neptune Orbit": "neptune", "Triton Orbit": "neptune",
"Mercury Orbit": "mercury", "Mercury Surface": "mercury",
"Venus Orbit": "venus", "Venus Surface": "venus",
"Solar Orbit": "sun", "Transfer": "transfer",
"Ceres Orbit": "ceres", "Ceres Surface": "ceres",
"Vesta Orbit": "vesta", "Vesta Surface": "vesta",
"Pluto Orbit": "pluto", "Pluto Surface": "pluto",
body_aliases = (
("mercury", ("mercury",)),
("venus", ("venus",)),
("moon", ("lunar", "moon")),
("earth", ("earth", "leo", "meo", "geo")),
("phobos", ("phobos",)),
("deimos", ("deimos",)),
("mars", ("mars",)),
("ceres", ("ceres",)),
("vesta", ("vesta",)),
("io", ("io orbit", "io surface", "io system")),
("europa", ("europa",)),
("ganymede", ("ganymede",)),
("callisto", ("callisto",)),
("jupiter", ("jupiter",)),
("mimas", ("mimas",)),
("enceladus", ("enceladus",)),
("tethys", ("tethys",)),
("dione", ("dione",)),
("rhea", ("rhea",)),
("titan", ("titan",)),
("iapetus", ("iapetus",)),
("saturn", ("saturn",)),
("miranda", ("miranda",)),
("ariel", ("ariel",)),
("umbriel", ("umbriel",)),
("titania", ("titania",)),
("oberon", ("oberon",)),
("uranus", ("uranus",)),
("triton", ("triton",)),
("neptune", ("neptune",)),
("charon", ("charon",)),
("pluto", ("pluto",)),
("sun", ("solar", "heliocentric", "sun")),
)
moon_systems = {
"moon": "earth", "phobos": "mars", "deimos": "mars",
"io": "jupiter", "europa": "jupiter", "ganymede": "jupiter", "callisto": "jupiter",
"mimas": "saturn", "enceladus": "saturn", "tethys": "saturn", "dione": "saturn",
"rhea": "saturn", "titan": "saturn", "iapetus": "saturn",
"miranda": "uranus", "ariel": "uranus", "umbriel": "uranus", "titania": "uranus", "oberon": "uranus",
"triton": "neptune", "charon": "pluto",
}
planetary_systems = {
"mercury", "venus", "earth", "mars", "ceres", "vesta", "jupiter",
"saturn", "uranus", "neptune", "pluto",
}
def location_body(value: object) -> str:
normalized = str(value or "").strip().casefold()
for body_key, aliases in body_aliases:
if any(alias in normalized for alias in aliases):
return body_key
return "unknown"
def body_system(body_key: str) -> str:
if body_key in moon_systems:
return moon_systems[body_key]
if body_key in planetary_systems or body_key == "sun":
return body_key
return "unknown"
def active_transfer(snapshot: dict[str, object]) -> dict[str, object] | None:
active_state = snapshot.get("active_state")
if active_state is None or not active_state.state_nodes:
return None
nodes = sorted(active_state.state_nodes, key=lambda item: _as_utc(item.at_time) or simulation_time)
current_index = -1
for index, node in enumerate(nodes):
node_at = _as_utc(node.at_time)
if node_at is not None and node_at <= simulation_time:
current_index = index
if current_index < 0:
return None
node = nodes[current_index]
if not node.transit_location or not node.previous_location or not node.target_location:
return None
from_body = location_body(node.previous_location)
to_body = location_body(node.target_location)
if "unknown" in (from_body, to_body) or from_body == to_body:
return None
start_at = _as_utc(node.at_time) or simulation_time
end_at = None
if current_index + 1 < len(nodes):
end_at = _as_utc(nodes[current_index + 1].at_time)
if end_at is None:
end_at = _as_utc(active_state.end_at)
progress = 50
if end_at is not None and end_at > start_at:
progress = round(100 * (simulation_time - start_at).total_seconds() / (end_at - start_at).total_seconds())
progress = max(2, min(98, progress))
from_system = body_system(from_body)
to_system = body_system(to_body)
scope = from_system if from_system == to_system and from_system not in {"unknown", "sun"} else "sun"
return {
"from": from_body,
"to": to_body,
"progress": progress,
"scope": scope,
"body": f"{from_body}-{to_body}-transfer",
"location": str(node.transit_location),
}
asset_positions = []
for asset in assets:
if asset.is_retired:
continue
snapshot = _build_asset_snapshot(asset, simulation_time)
location = snapshot.get("current_location", "Transfer")
body = LOCATION_BODY_MAP.get(location, "transfer")
location = str(snapshot.get("current_location") or "-")
transfer = active_transfer(snapshot)
body = str(transfer["body"]) if transfer else location_body(location)
scope = str(transfer["scope"]) if transfer else body_system(body)
asset_positions.append({
"id": str(asset.id),
"name": asset.name,
"asset_type": asset.asset_type,
"location": location,
"location": str(transfer["location"]) if transfer else location,
"body": body,
"scope": scope,
"mission": snapshot.get("current_mission", ""),
"state": snapshot.get("current_state", ""),
"next_event": snapshot.get("next_event", ""),
"detail_url": url_for("web.asset_detail", asset_id=asset.id, sim_time=simulation_time_input),
"transfer": transfer,
})
# Count ongoing missions and upcoming events
@@ -4726,7 +4815,7 @@ def mission_location_board_preview() -> str:
active_page="location",
simulation_time_display=_format_datetime_display(simulation_time),
simulation_time_input=simulation_time_input,
asset_positions_json=__import__("json").dumps(asset_positions),
asset_positions=asset_positions,
asset_count=len(asset_positions),
ongoing_count=len(active_assets),
upcoming_events=[],
@@ -4885,7 +4974,7 @@ def mission_timeline_preview() -> str:
preview_tab="timeline",
timeline_scale=timeline_scale,
timeline_rows=timeline_rows,
timeline_json=timeline_json,
timeline_data=timeline_json_data,
timeline_scale_mode=timeline_scale_mode,
timeline_scale_options=TIMELINE_SCALE_OPTIONS,
timeline_column_width=timeline_column_width,
+45 -22
View File
@@ -9,7 +9,7 @@ from openpyxl import load_workbook
from sqlalchemy import delete, select
from app.extensions import db
from app.models import Asset, AssetLogEntry
from app.models import Asset, AssetLogEntry, AssetStateNode
EVENT_LINE_PATTERN = re.compile(r"^(\d{4}-\d{2}-\d{2})\s+(.+)$")
@@ -99,6 +99,8 @@ def import_log_book_data(workbook_path: str | Path) -> LogBookImportSummary:
except Exception:
db.session.rollback()
raise
finally:
workbook.close()
return summary
@@ -156,22 +158,39 @@ def _import_sheet(worksheet: object, sheet_name: str, asset_spec: dict[str, str]
if log_name is None or start_at is None:
continue
db.session.add(
AssetLogEntry(
asset_id=asset.id,
entry_kind="state",
entry = AssetLogEntry(
asset_id=asset.id,
entry_kind="state",
title=log_name,
mission_label=log_name,
start_at=start_at,
end_at=end_at,
summary=mission_detail,
note=sub_log,
)
entry.state_nodes.append(
AssetStateNode(
title=log_name,
detail=mission_detail,
at_time=start_at,
target_location=inferred_location,
state_label=log_name,
mission_label=log_name,
location=inferred_location,
start_at=start_at,
end_at=end_at,
summary=mission_detail,
note=sub_log,
)
)
db.session.add(entry)
summary.state_entries += 1
events = _parse_sub_log_events(
asset.id,
log_name,
start_at,
end_at,
inferred_location,
sub_log,
)
db.session.add_all(events)
summary.event_entries += len(events)
return summary
@@ -260,19 +279,23 @@ def _parse_sub_log_events(
continue
description = match.group(2).strip()
events.append(
AssetLogEntry(
asset_id=asset_id,
entry_kind="event",
event = AssetLogEntry(
asset_id=asset_id,
entry_kind="event",
title=description,
mission_label=parent_title,
start_at=event_at,
end_at=None,
summary=parent_title,
note=line,
)
event.state_nodes.append(
AssetStateNode(
title=description,
state_label=None,
mission_label=parent_title,
location=_infer_event_location(description, default_location),
start_at=event_at,
end_at=None,
summary=parent_title,
note=line,
at_time=event_at,
target_location=_infer_event_location(description, default_location),
)
)
events.append(event)
return events
+2
View File
@@ -54,6 +54,8 @@ def import_workbook_data(
except Exception:
db.session.rollback()
raise
finally:
workbook.close()
summary.imported_rows = {
"engine_families": family_count,
+106
View File
@@ -261,6 +261,112 @@ tr:hover td{background:rgba(128,128,128,.015)}
.asset-entry-footer{bottom:0;border-radius:var(--radius) var(--radius) 0 0}
}
/* ─── Buttons (extended) ─── */
.primary-button{display:inline-flex;align-items:center;gap:4px;padding:6px 14px;border-radius:4px;font-family:var(--font-ui);font-size:.72rem;font-weight:500;cursor:pointer;background:var(--accent);color:#fff;border:1px solid var(--accent);transition:.15s;white-space:nowrap}
.primary-button:hover{box-shadow:0 0 10px var(--accent-glow)}
.secondary-button{display:inline-flex;align-items:center;gap:4px;padding:6px 14px;border-radius:4px;font-family:var(--font-ui);font-size:.72rem;cursor:pointer;background:transparent;color:var(--muted);border:1px solid var(--border);transition:.15s;white-space:nowrap;text-decoration:none}
.secondary-button:hover{background:rgba(128,128,128,.08);color:var(--text)}
/* ─── Mission Pages ─── */
.eyebrow{font-family:var(--font-data);font-size:.6rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:2px}
.top-gap{margin-top:14px}
.field-label{font-family:var(--font-data);font-size:.58rem;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.08em}
/* Mission ops tabs */
.mission-ops-tabs-panel{margin-bottom:0;padding-bottom:0}
.mission-preview-nav{display:flex;gap:0;border-bottom:1px solid var(--border)}
.mission-preview-nav-top{margin-bottom:12px}
.preview-tab{display:inline-flex;align-items:center;padding:8px 16px;font-size:.74rem;color:var(--muted);text-decoration:none;border-bottom:2px solid transparent;transition:.15s;margin-bottom:-1px}
.preview-tab:hover{color:var(--text);background:rgba(128,128,128,.03)}
.preview-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}
/* Mission page header */
.mission-page-header{display:flex;align-items:flex-start;gap:20px;flex-wrap:wrap;margin-bottom:10px}
.mission-page-header-copy{flex:1;min-width:200px}
.mission-page-header-copy h1{font-family:var(--font-data);font-size:1.35rem;font-weight:600;line-height:1.15}
.mission-page-header-metrics{display:flex;gap:10px;flex-wrap:wrap}
.mission-page-header-controls{display:flex;align-items:flex-end}
/* Summary cards */
.summary-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;min-width:100px}
.summary-card.compact{padding:8px 14px}
.summary-label{display:block;font-family:var(--font-data);font-size:.56rem;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px}
.summary-card strong{font-family:var(--font-data);font-size:.88rem;font-weight:600}
.mission-summary-card-time strong{color:var(--accent)}
/* Mission time form */
.mission-page-time-form{display:flex;align-items:flex-end;gap:6px}
/* Panel */
.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px}
/* Mission toolbar */
.mission-toolbar-grid{display:flex;flex-direction:column;gap:10px}
.mission-toolbar-block{min-width:0}
.mission-toolbar-span-two{width:100%}
.mission-toolbar-block .field-label{margin-bottom:6px}
.mission-filter-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px;align-items:end}
.mission-filter-grid label{display:flex;flex-direction:column;gap:4px;font-size:.72rem;color:var(--muted)}
.mission-filter-grid input,.mission-filter-grid select{padding:6px 8px;border-radius:4px;background:var(--bg);color:var(--text);border:1px solid var(--border);font-size:.72rem;min-height:34px}
.mission-filter-grid input:focus,.mission-filter-grid select:focus{outline:none;border-color:var(--accent)}
.mission-filter-grid input[type=search]{min-width:180px}
/* Mission filter pills */
.mission-filter-pill-row{display:flex;flex-wrap:wrap;gap:8px}
.mission-filter-pill{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:4px;font-size:.68rem;color:var(--muted);background:rgba(128,128,128,.04);border:1px solid var(--border);font-family:var(--font-data)}
.mission-filter-pill strong{color:var(--text);font-weight:600}
/* Mission group */
.mission-group-panel{padding:0;overflow:hidden}
.mission-group-header{display:flex;justify-content:space-between;align-items:flex-start;padding:14px 16px;border-bottom:1px solid var(--border)}
.mission-group-header h2{font-family:var(--font-data);font-size:1.05rem;font-weight:600;margin-top:2px}
.mission-group-subtitle{color:var(--muted);font-size:.7rem;margin-top:4px}
.mission-group-count{font-family:var(--font-data);font-size:.64rem;color:var(--muted);padding-top:4px;flex-shrink:0}
.mission-group-panel .mission-filter-pill-row{padding:8px 16px;border-bottom:1px solid var(--border)}
/* Mission log table */
.table-shell{padding:0;overflow-x:auto}
.table-shell.top-gap{margin-top:0}
.data-table{width:100%;border-collapse:collapse;font-size:.74rem;table-layout:fixed}
.data-table thead th{font-family:var(--font-data);font-size:.58rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);background:rgba(128,128,128,.02);position:sticky;top:0;z-index:1}
.data-table tbody td{padding:8px 10px;border-bottom:1px solid rgba(148,163,184,.06);vertical-align:top}
.compact-table td{padding:6px 10px}
/* Mission log column widths */
.mission-log-table thead th:nth-child(1){width:11%}
.mission-log-table thead th:nth-child(2){width:11%}
.mission-log-table thead th:nth-child(3){width:46%}
.mission-log-table thead th:nth-child(4){width:16%}
.mission-log-table thead th:nth-child(5){width:16%}
/* Two-line cell */
.two-line-cell{display:flex;flex-direction:column;gap:2px}
.table-title{font-size:.74rem;font-weight:500;color:var(--text)}
.table-subline{font-size:.64rem;color:var(--muted);line-height:1.35}
.clamp-line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.table-link{color:var(--accent);text-decoration:none;font-size:inherit}
.table-link:hover{text-decoration:underline}
/* Mission entry labels */
.mission-asset-chip-row{display:flex;flex-wrap:wrap;gap:3px;margin-top:4px}
.mission-entry-label-row .chip{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-family:var(--font-data);font-size:.56rem;font-weight:600;background:rgba(59,130,246,.08);color:var(--accent);border:1px solid rgba(59,130,246,.15)}
/* Table actions */
.table-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
/* Empty state */
.empty-state{text-align:center;padding:32px 16px;color:var(--muted)}
.empty-state h2{font-size:.9rem;font-weight:600;margin-bottom:6px}
.empty-state p{font-size:.72rem}
/* Mission filter grid — datetime picker */
.mission-datetime-control{display:flex;flex-direction:column;gap:4px;font-size:.72rem;color:var(--muted)}
.mission-datetime-control-row{display:flex;gap:4px;align-items:center;width:100%}
.mission-datetime-display-input{flex:1;min-width:0;padding:6px 8px;border-radius:4px;background:var(--bg);color:var(--text);border:1px solid var(--border);font-size:.72rem;min-height:34px}
.mission-datetime-display-input:focus{outline:none;border-color:var(--accent)}
.mission-datetime-picker-proxy{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}
.mission-datetime-picker-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;font-size:.68rem;flex-shrink:0}
/* ─── Flash Messages ─── */
.flash-stack{margin-bottom:16px}
.flash-message{padding:8px 14px;border-radius:var(--radius);font-size:.78rem;margin-bottom:6px}
+274 -67
View File
@@ -1,79 +1,286 @@
{% extends "base.html" %}
{% block content %}
<div style="display:flex;flex:1;overflow:hidden;position:absolute;inset:0;top:var(--topbar-h);left:var(--sidebar-w)">
<!-- Canvas Map -->
<div id="map-ct" style="flex:1;position:relative;display:flex;align-items:center;justify-content:center;background:#0B0B10;cursor:grab;overflow:hidden">
<canvas id="map-cv"></canvas>
<button id="bk-btn" onclick="mapGoBack()">← Back</button>
<span id="scope-ind">Solar System</span>
</div>
<section id="ksp-location-board" aria-label="太阳系地点板">
<header class="location-toolbar">
<nav class="location-breadcrumbs" id="location-breadcrumbs" aria-label="地图层级"></nav>
<div class="location-summary">
<label class="transfer-toggle" for="transfer-toggle">
<input id="transfer-toggle" type="checkbox">
<span>全部转移轨迹</span>
</label>
<span id="scope-count">0 assets</span>
<span class="live-status"><i></i>实时星历</span>
<button class="location-reset" id="location-reset" type="button">重置</button>
</div>
</header>
<!-- Info Panel -->
<div id="map-info" style="width:280px;background:var(--surface);border-left:1px solid var(--border);padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:14px;flex-shrink:0">
<h2 id="mi-title" style="font-family:var(--font-data);font-size:.85rem;font-weight:600;padding-bottom:5px;border-bottom:1px solid var(--border)">Solar System</h2>
<div><h3 style="font-family:var(--font-data);font-size:.6rem;text-transform:uppercase;color:var(--muted);letter-spacing:.05em;margin-bottom:3px">Scope</h3><div id="mi-scope" style="font-size:.88rem;font-weight:500">Solar System</div></div>
<div><h3 style="font-family:var(--font-data);font-size:.6rem;text-transform:uppercase;color:var(--muted);letter-spacing:.05em;margin-bottom:3px">Assets in Scope</h3><div id="mi-assets"></div></div>
<div><h3 style="font-family:var(--font-data);font-size:.6rem;text-transform:uppercase;color:var(--muted);letter-spacing:.05em;margin-bottom:3px">Ongoing Missions</h3><div style="font-family:var(--font-data);font-size:1.3rem;font-weight:600;color:var(--accent)" id="mi-miss">{{ ongoing_count }}</div></div>
<div><h3 style="font-family:var(--font-data);font-size:.6rem;text-transform:uppercase;color:var(--muted);letter-spacing:.05em;margin-bottom:3px">Upcoming Events</h3><div id="mi-events"></div></div>
</div>
</div>
<div class="location-layout">
<main class="location-map" id="location-map">
<svg id="space-map" viewBox="0 0 1000 620" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="map-title map-desc">
<title id="map-title">太阳系资产位置地图</title>
<desc id="map-desc">从太阳系全局钻取到行星系统、行星和卫星,并查看实际转移航路。</desc>
<g id="orbit-layer"></g>
<g id="route-layer"></g>
<g id="asset-layer"></g>
</svg>
<div class="body-layer" id="body-layer"></div>
<div class="map-caption"><span id="view-mode">SOLAR SYSTEM</span><b id="map-caption">选择天体或转移资产</b></div>
<div class="map-legend" aria-label="图例">
<span><i class="asset-dot"></i>资产位置</span>
<span><i class="progress-line"></i>已完成航程</span>
<span><i class="remaining-line"></i>剩余航程</span>
</div>
</main>
<script>
// Pass asset data from backend to JS
const LOC_ASSETS = {{ asset_positions_json|safe }};
const LOC_EVENTS = {{ upcoming_events|tojson|safe }};
</script>
<aside class="asset-panel">
<div class="asset-panel-head">
<div><span>ASSETS IN SCOPE</span><h2 id="scope-title">Solar System</h2></div>
<b id="panel-count">0</b>
</div>
<div class="asset-list" id="asset-list"></div>
</aside>
<aside class="asset-drawer" id="asset-drawer" aria-hidden="true">
<button class="drawer-close" id="drawer-close" type="button" aria-label="关闭详情">×</button>
<span class="drawer-eyebrow">ASSET DETAIL</span>
<h2 id="drawer-name"></h2>
<div class="drawer-fields" id="drawer-fields"></div>
<a class="drawer-link" id="drawer-link" href="#">打开资产详情页</a>
</aside>
</div>
</section>
<script id="location-assets-data" type="application/json">{{ asset_positions|tojson }}</script>
<style>
#ksp-location-board{position:absolute;inset:0;display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;background:var(--bg);color:var(--text);font-size:clamp(12px,.28vw + 8px,22px)}
#ksp-location-board button,#ksp-location-board a{font:inherit}
.location-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:48px;padding:8px clamp(14px,1vw,30px);border-bottom:1px solid var(--border);background:var(--surface)}
.location-breadcrumbs,.location-summary{display:flex;align-items:center;gap:9px;min-width:0}
.location-breadcrumbs button{padding:0;border:0;background:transparent;color:var(--muted);cursor:pointer}
.location-breadcrumbs button.current{color:var(--text);font-weight:600}.location-breadcrumbs .sep{color:var(--muted)}
.location-summary{color:var(--muted);white-space:nowrap}.live-status{display:flex;align-items:center;gap:5px}.live-status i{width:7px;height:7px;border-radius:50%;background:var(--amber)}
.transfer-toggle{display:flex;align-items:center;gap:7px;cursor:pointer;color:var(--text)}.transfer-toggle input{accent-color:var(--accent)}
.location-reset{padding:4px 9px;border:1px solid var(--border);border-radius:4px;background:transparent;color:var(--muted);cursor:pointer}.location-reset:hover{color:var(--text);background:var(--surface2)}
.location-layout{position:relative;display:grid;grid-template-columns:minmax(0,1fr) clamp(270px,20vw,540px);min-width:0;min-height:0}
.location-map{position:relative;min-width:0;min-height:0;overflow:hidden;background:radial-gradient(circle at 50% 50%,rgba(59,130,246,.09),transparent 44%),var(--bg)}
#space-map{display:block;width:100%;height:100%}.body-layer{position:absolute;inset:0;pointer-events:none}
.asset-panel{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:0;padding:clamp(14px,1vw,28px);border-left:1px solid var(--border);background:var(--surface)}
.asset-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding-bottom:10px;border-bottom:1px solid var(--border)}
.asset-panel-head span,.drawer-eyebrow{color:var(--muted);font-family:var(--font-data);font-size:.7em;letter-spacing:.08em}.asset-panel-head h2{margin-top:4px;font-size:1.2em}.asset-panel-head b{padding:4px 8px;background:rgba(59,130,246,.12);color:var(--accent);font-family:var(--font-data)}
.asset-list{min-height:0;overflow-y:auto}.asset-button{display:flex;align-items:center;gap:9px;width:100%;padding:clamp(9px,.55vw,18px) 3px;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);text-align:left;cursor:pointer}.asset-button::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--amber);flex:0 0 auto}.asset-button.planned::before{background:var(--purple)}.asset-button:hover,.asset-button.selected{background:rgba(59,130,246,.08)}
.asset-empty{padding:18px 2px;color:var(--muted)}
.body-button{--planet-size:16px;position:absolute;transform:translate(-50%,-50%);display:block;width:var(--planet-size);height:var(--planet-size);padding:0;border:0;background:transparent;color:var(--text);pointer-events:auto;cursor:pointer;overflow:visible}
.planet-disc{display:block;width:100%;height:100%;border:1px solid var(--muted);border-radius:50%;background:var(--surface2)}.body-button.sun .planet-disc{border-color:var(--text);background:#74b4ec;box-shadow:0 0 26px rgba(116,180,236,.42)}.body-button.minor .planet-disc{border-style:dashed;background:rgba(148,163,184,.12)}.body-button:hover .planet-disc,.body-button:focus-visible .planet-disc{outline:2px solid var(--accent);outline-offset:3px}
.body-label{position:absolute;top:calc(100% + 5px);left:50%;transform:translateX(-50%);color:var(--muted);white-space:nowrap;pointer-events:none}
.map-caption{position:absolute;top:16px;left:18px;display:flex;align-items:center;gap:9px;max-width:70%;pointer-events:none}.map-caption span{padding:5px 8px;background:rgba(59,130,246,.12);color:#7ab8f6;font-family:var(--font-data)}.map-caption b{font-weight:500}
.map-legend{position:absolute;bottom:16px;left:18px;display:flex;gap:14px;padding:8px 10px;border:1px solid var(--border);background:rgba(19,19,24,.88);color:var(--text)}.map-legend span{display:flex;align-items:center;gap:6px}.asset-dot{width:7px;height:7px;border-radius:50%;background:var(--amber)}.progress-line,.remaining-line{display:inline-block;width:24px;border-top:2px solid #72b4f4}.remaining-line{border-top:1px dashed var(--muted)}
.orbit{fill:none;stroke:rgba(148,163,184,.18);stroke-width:1.1}.orbit.strong{stroke:rgba(248,250,252,.48);stroke-width:1.35}.orbit.minor{stroke-dasharray:3 7;opacity:.65}
.transfer-track{fill:none;stroke:rgba(148,163,184,.38);stroke-width:1.25;stroke-dasharray:4 8}.transfer-progress{fill:none;stroke:#72b4f4;stroke-width:2.25}.route-endpoint{fill:var(--bg);stroke:#72b4f4;stroke-width:1.6}.route-vessel-dot{fill:var(--bg);stroke:#72b4f4;stroke-width:2.5}.route-vessel-heading{stroke:#72b4f4;stroke-width:2;stroke-linecap:round}.route-label-leader{stroke:var(--muted);stroke-width:1;opacity:.7}.route-label-title,.route-label-meta{font-family:var(--font-ui);paint-order:stroke;stroke:var(--bg);stroke-linejoin:round}.route-label-title{fill:var(--text);font-size:12px;font-weight:600;stroke-width:3}.route-label-meta{fill:var(--muted);font-size:10px;stroke-width:3}.route-group.hidden{display:none}
.map-asset{fill:var(--amber);stroke:var(--bg);stroke-width:2}.map-asset-label{fill:var(--text);font-size:11px;font-family:var(--font-ui);paint-order:stroke;stroke:var(--bg);stroke-width:3;stroke-linejoin:round}
.asset-drawer{--panel-width:clamp(270px,20vw,540px);position:absolute;z-index:8;top:0;right:var(--panel-width);bottom:0;width:clamp(320px,23vw,620px);display:flex;flex-direction:column;gap:clamp(13px,.8vw,24px);padding:clamp(18px,1.2vw,36px);border-left:1px solid var(--border);background:var(--surface2);transform:translateX(calc(100% + var(--panel-width)));transition:transform .18s ease;pointer-events:none}.asset-drawer.open{transform:translateX(0);pointer-events:auto}.drawer-close{align-self:flex-end;width:30px;height:30px;border:1px solid var(--border);border-radius:4px;background:transparent;color:var(--muted);font-size:20px;cursor:pointer}.asset-drawer h2{font-size:1.4em}.drawer-fields{display:grid;gap:10px}.drawer-field{padding-top:9px;border-top:1px solid var(--border)}.drawer-field span,.drawer-field strong{display:block}.drawer-field span{margin-bottom:3px;color:var(--muted);font-size:.78em}.drawer-field strong{font-weight:500;overflow-wrap:anywhere}.drawer-link{margin-top:auto;padding:9px 12px;border-radius:4px;background:var(--accent);color:#fff;text-align:center}.drawer-link:hover{text-decoration:none;filter:brightness(1.08)}
@media(max-width:900px){.location-layout{grid-template-columns:minmax(0,1fr) 230px}.asset-drawer{--panel-width:230px;right:230px;width:300px}.live-status{display:none}.map-legend{display:none}}
@media(max-width:680px){.location-toolbar{align-items:flex-start;flex-direction:column}.location-summary{width:100%;overflow-x:auto}.location-layout{grid-template-columns:minmax(0,1fr) 180px}.asset-drawer{--panel-width:180px;right:180px;width:280px}.map-caption{max-width:90%}}
</style>
{% endblock %}
{% block scripts %}
<script>
// ═══ Keplerian Orbital Mechanics ═══
const J2000_JD=2451545.0,DAY_MS=86400000;
const ORB={
mercury:{a:.387098,e:.205630,i:7.005,O:48.331,p:77.456,L:252.251,P:87.969},
venus:{a:.723332,e:.006772,i:3.395,O:76.680,p:131.563,L:181.980,P:224.701},
earth:{a:1.000003,e:.016709,i:.000,O:.000,p:102.938,L:100.464,P:365.256},
mars:{a:1.523679,e:.093401,i:1.850,O:49.558,p:336.060,L:355.453,P:686.980},
ceres:{a:2.767500,e:.075823,i:10.593,O:80.306,p:72.716,L:73.598,P:1680},
vesta:{a:2.361000,e:.088740,i:7.141,O:103.852,p:150.047,L:18.900,P:1325},
jupiter:{a:5.203363,e:.048393,i:1.305,O:100.556,p:14.754,L:34.404,P:4332.589},
saturn:{a:9.537070,e:.054151,i:2.485,O:113.715,p:92.432,L:49.944,P:10759.22},
uranus:{a:19.19126,e:.047168,i:.770,O:74.230,p:170.964,L:313.232,P:30685.4},
neptune:{a:30.06904,e:.008606,i:1.770,O:131.723,p:44.971,L:304.880,P:60189},
pluto:{a:39.48212,e:.248828,i:17.140,O:110.304,p:224.069,L:238.929,P:90560}
};
function jd(d){return d.getTime()/DAY_MS+2440587.5}
function kepl(M,e,eps=1e-8){let E=M+e*Math.sin(M)*(1+e*Math.cos(M));for(let i=0;i<20;i++){let d=(M-E+e*Math.sin(E))/(1-e*Math.cos(E));E+=d;if(Math.abs(d)<eps)break}return E}
function helio(k,jv){const o=ORB[k];if(!o)return{x:0,y:0};const D=Math.PI/180,n=2*Math.PI/o.P,ds=jv-J2000_JD;let M=(o.L-o.p)*D+n*ds;M=((M%(2*Math.PI))+2*Math.PI)%(2*Math.PI);const E=kepl(M,o.e),s=Math.sin(E),c=Math.cos(E),r=o.a*(1-o.e*c),sv=Math.sqrt(1-o.e*o.e)*s/(1-o.e*c),cv=(c-o.e)/(1-o.e*c);const w=(o.p-o.O)*D,O=o.O*D,I=o.i*D,cO=Math.cos(O),sO=Math.sin(O),cI=Math.cos(I),sI=Math.sin(I);const xo=r*cv,yo=r*sv,cw=Math.cos(w),sw=Math.sin(w);const xe=xo*(cO*cw-sO*sw*cI)-yo*(cO*sw+sO*cw*cI),ye=xo*(sO*cw+cO*sw*cI)+yo*(cO*cw*cI-sO*sw);const dist=Math.sqrt(xe*xe+ye*ye),dd=Math.pow(dist,.4)*100,sc=dist>.001?dd/dist:0;return{x:xe*sc,y:ye*sc}}
(() => {
const root = document.getElementById('ksp-location-board');
const assets = JSON.parse(document.getElementById('location-assets-data').textContent);
const ns = 'http://www.w3.org/2000/svg';
const layers = {
orbit: root.querySelector('#orbit-layer'),
route: root.querySelector('#route-layer'),
asset: root.querySelector('#asset-layer')
};
const systems = {
mercury:{name:'Mercury',moons:[]}, venus:{name:'Venus',moons:[]}, earth:{name:'Earth',moons:['moon']},
mars:{name:'Mars',moons:['phobos','deimos']}, ceres:{name:'Ceres',moons:[]}, vesta:{name:'Vesta',moons:[]},
jupiter:{name:'Jupiter',moons:['io','europa','ganymede','callisto']},
saturn:{name:'Saturn',moons:['mimas','enceladus','tethys','dione','rhea','titan','iapetus']},
uranus:{name:'Uranus',moons:['miranda','ariel','umbriel','titania','oberon']},
neptune:{name:'Neptune',moons:['triton']}, pluto:{name:'Pluto',moons:['charon']}
};
const bodyNames = {sun:'Sun',mercury:'Mercury',venus:'Venus',earth:'Earth',moon:'Moon',mars:'Mars',phobos:'Phobos',deimos:'Deimos',ceres:'Ceres',vesta:'Vesta',jupiter:'Jupiter',io:'Io',europa:'Europa',ganymede:'Ganymede',callisto:'Callisto',saturn:'Saturn',mimas:'Mimas',enceladus:'Enceladus',tethys:'Tethys',dione:'Dione',rhea:'Rhea',titan:'Titan',iapetus:'Iapetus',uranus:'Uranus',miranda:'Miranda',ariel:'Ariel',umbriel:'Umbriel',titania:'Titania',oberon:'Oberon',neptune:'Neptune',triton:'Triton',pluto:'Pluto',charon:'Charon',unknown:'Unknown'};
const moonSystems = {moon:'earth',phobos:'mars',deimos:'mars',io:'jupiter',europa:'jupiter',ganymede:'jupiter',callisto:'jupiter',mimas:'saturn',enceladus:'saturn',tethys:'saturn',dione:'saturn',rhea:'saturn',titan:'saturn',iapetus:'saturn',miranda:'uranus',ariel:'uranus',umbriel:'uranus',titania:'uranus',oberon:'uranus',triton:'neptune',charon:'pluto'};
const planets = [
{id:'mercury',angle:-35,size:9,orbit:50},{id:'venus',angle:60,size:12,orbit:78},{id:'earth',angle:-22,size:13,orbit:110},{id:'mars',angle:125,size:11,orbit:140},
{id:'vesta',angle:-135,size:7,orbit:160,kind:'minor'},{id:'ceres',angle:150,size:8,orbit:176,kind:'minor'},{id:'jupiter',angle:32,size:25,orbit:215},
{id:'saturn',angle:210,size:22,orbit:260},{id:'uranus',angle:-28,size:17,orbit:310},{id:'neptune',angle:145,size:17,orbit:360},{id:'pluto',angle:210,size:10,orbit:420,kind:'minor'}
];
let view = {level:'solar',system:null,body:null};
let selectedRoute = null;
let showAllRoutes = false;
let bodyPoints = {};
// ═══ Star Map Data ═══
const BODIES={sun:{n:'Sun',t:'star',r:20,fr:52,c:'#FDB813',c2:'#ff6b00'},mercury:{n:'Mercury',t:'p',r:5.5,fr:38,c:'#b5b5b5',c2:'#8a8a8a'},venus:{n:'Venus',t:'p',r:8,fr:44,c:'#e6c229',c2:'#c4952a'},earth:{n:'Earth',t:'p',r:9,fr:46,c:'#4da6ff',c2:'#1a56db',mo:{moon:{n:'Moon',r:2.8,c:'#ccc',c2:'#999',orb:40,P:27.3}}},mars:{n:'Mars',t:'p',r:7,fr:40,c:'#c1440e',c2:'#7a1f0a',mo:{phobos:{n:'Phobos',r:1.6,c:'#998',c2:'#665',orb:26,P:.32},deimos:{n:'Deimos',r:1.4,c:'#887',c2:'#554',orb:35,P:1.26}}},ceres:{n:'Ceres',t:'d',r:4,fr:32,c:'#8b8b8b',c2:'#6b6b6b'},vesta:{n:'Vesta',t:'d',r:3,fr:28,c:'#a0a0a0',c2:'#808080'},jupiter:{n:'Jupiter',t:'p',r:16,fr:60,c:'#c9b07c',c2:'#8b6914',mo:{io:{n:'Io',r:2.8,c:'#e8d44d',c2:'#b8a420',orb:50,P:1.77},europa:{n:'Europa',r:2.5,c:'#d4c9a8',c2:'#a09060',orb:62,P:3.55},ganymede:{n:'Ganymede',r:3.2,c:'#aaa',c2:'#777',orb:76,P:7.15},callisto:{n:'Callisto',r:2.8,c:'#666',c2:'#444',orb:90,P:16.7}}},saturn:{n:'Saturn',t:'p',r:13.5,fr:54,c:'#e0c97f',c2:'#b8952a',mo:{mimas:{n:'Mimas',r:1.8,c:'#bbb',c2:'#999',orb:44,P:.94},titan:{n:'Titan',r:3.5,c:'#d4a85c',c2:'#a07830',orb:90,P:15.95}}},uranus:{n:'Uranus',t:'p',r:11,fr:46,c:'#7ec8e3',c2:'#4a90b0',mo:{titania:{n:'Titania',r:3,c:'#bbb',c2:'#999',orb:64,P:8.71}}},neptune:{n:'Neptune',t:'p',r:10,fr:44,c:'#3f54ba',c2:'#1a2a80',mo:{triton:{n:'Triton',r:2.8,c:'#b8d4e3',c2:'#80a0b0',orb:44,P:5.88}}},pluto:{n:'Pluto',t:'d',r:3,fr:28,c:'#d4c9a8',c2:'#a09070',mo:{charon:{n:'Charon',r:2.2,c:'#bbb',c2:'#999',orb:28,P:6.39}}}};
const SO=['mercury','venus','earth','mars','ceres','vesta','jupiter','saturn','uranus','neptune','pluto'];
for(const bk of Object.keys(BODIES)){const b=BODIES[bk];if(b.mo)for(const[mk,mb]of Object.entries(b.mo))BODIES[mk]=mb}
// ═══ State ═══
let mapVS=[{tp:'solar',ck:'sun'}],mapHv=null,mapDg=false,mapDS=null,mapDL=null,mapDD=false,mapVO={x:0,y:0},mapZm=1;
let mapCtx,mapCv,mapStars=null;
function initMap(){
mapCv=document.getElementById('map-cv');mapCtx=mapCv.getContext('2d');
function rsz(){const r=document.getElementById('map-ct').getBoundingClientRect(),d=devicePixelRatio||1;if(r.width===0||r.height===0)return;mapCv.width=r.width*d;mapCv.height=r.height*d;mapCv.style.width=r.width+'px';mapCv.style.height=r.height+'px';mapStars=null;renderMap()}
window.addEventListener('resize',rsz);setTimeout(rsz,100);
mapCv.addEventListener('mousedown',e=>{mapDg=true;mapDS={x:e.clientX,y:e.clientY};mapDL={x:e.clientX,y:e.clientY};mapDD=false});
window.addEventListener('mousemove',e=>{if(!mapDg||!mapDL)return;if(Math.abs(e.clientX-mapDS.x)>6||Math.abs(e.clientY-mapDS.y)>6)mapDD=true;if(mapDD){mapVO.x+=e.clientX-mapDL.x;mapVO.y+=e.clientY-mapDL.y;mapDL={x:e.clientX,y:e.clientY};renderMap()}});
window.addEventListener('mouseup',()=>{mapDg=false;mapDS=null;mapDL=null});
mapCv.addEventListener('wheel',e=>{e.preventDefault();mapZm=Math.max(.3,Math.min(4,mapZm*(e.deltaY>0?.9:1.1)));renderMap()},{passive:false});
mapCv.addEventListener('click',e=>{if(mapDD)return;const r=mapCv.getBoundingClientRect(),t=mapHit(e.clientX-r.left,e.clientY-r.top);if(!t)return;const v=mapVS[mapVS.length-1],b=BODIES[t];if(v.tp==='solar')mapVS.push({tp:b&&b.mo?'planet_system':'single',ck:t});else if(v.tp==='planet_system')mapVS.push({tp:'single',ck:t});mapVO={x:0,y:0};mapZm=1;updateMapBack();renderMap();rMapInfo()});
mapCv.addEventListener('mousemove',e=>{if(mapDD)return;const r=mapCv.getBoundingClientRect(),t=mapHit(e.clientX-r.left,e.clientY-r.top);if(t!==mapHv){mapHv=t;mapCv.style.cursor=t?'pointer':'grab';renderMap()}});
}
function mapFV(k){if(BODIES[k])return BODIES[k];for(const bk of Object.keys(BODIES)){const b=BODIES[bk];if(b.mo&&b.mo[k])return b.mo[k]}return null}
function mapHit(mx,my){const v=mapVS[mapVS.length-1],cs=[];if(v.tp==='solar'){cs.push({k:'sun'});for(const k of SO)cs.push({k})}else if(v.tp==='planet_system'){const c=BODIES[v.ck];if(c){cs.push({k:v.ck});if(c.mo)for(const mk of Object.keys(c.mo))cs.push({k:mk})}}else{const b=BODIES[v.ck];if(b)cs.push({k:v.ck})}for(const{k}of cs){const b=mapFV(k);if(!b||b._x==null)continue;const dx=mx-b._x,dy=my-b._y,hr=(b._r||4)+6;if(dx*dx+dy*dy<=hr*hr)return k}return null}
function mapDraw(ox,oy,rad,key,lb){const b=BODIES[key]||mapFV(key);if(!b)return;const isStar=b.t==='star',bc=b.c||'#888';mapCtx.save();mapCtx.beginPath();mapCtx.arc(ox,oy,rad,0,Math.PI*2);mapCtx.clip();const g=mapCtx.createRadialGradient(ox-rad*.25,oy-rad*.3,0,ox,oy,rad);if(isStar){g.addColorStop(0,'#fffff8');g.addColorStop(.3,'#ffcc44');g.addColorStop(.7,'#ff6600');g.addColorStop(1,'#330800')}else{g.addColorStop(0,'#fff');g.addColorStop(.2,bc);g.addColorStop(.8,b.c2||'#333');g.addColorStop(1,'#111')}mapCtx.fillStyle=g;mapCtx.beginPath();mapCtx.arc(ox,oy,rad,0,Math.PI*2);mapCtx.fill();mapCtx.restore();if(!isStar){mapCtx.save();mapCtx.beginPath();mapCtx.arc(ox,oy,rad,0,Math.PI*2);mapCtx.clip();const sh=mapCtx.createRadialGradient(ox-rad*.3,oy-rad*.3,rad*.05,ox+rad*.15,oy+rad*.15,rad*1.1);sh.addColorStop(0,'rgba(255,255,255,.1)');sh.addColorStop(.4,'rgba(0,0,0,0)');sh.addColorStop(.8,'rgba(0,0,0,.5)');mapCtx.fillStyle=sh;mapCtx.fillRect(ox-rad,oy-rad,rad*2,rad*2);mapCtx.restore()}mapCtx.fillStyle='#e2e8f0';mapCtx.font=`${Math.max(8,rad*.45)}px system-ui`;mapCtx.textAlign='center';mapCtx.fillText(lb,ox,oy-rad-4);b._x=ox;b._y=oy;b._r=rad}
function renderMap(){if(!mapCv||mapCv.width===0||mapCv.height===0)return;const dpr=devicePixelRatio||1,W=mapCv.width/dpr,H=mapCv.height/dpr;mapCtx.save();mapCtx.setTransform(dpr,0,0,dpr,0,0);if(!mapStars||mapStars.width!==mapCv.width){const sc=document.createElement('canvas');sc.width=W;sc.height=H;const sx=sc.getContext('2d');sx.fillStyle='#0B0B10';sx.fillRect(0,0,W,H);for(let i=0;i<600;i++){sx.fillStyle=`rgba(255,255,255,${.2+Math.random()*.6})`;sx.beginPath();sx.arc(Math.random()*W,Math.random()*H,Math.random()*1.2+.1,0,Math.PI*2);sx.fill()}mapStars=sc}mapCtx.drawImage(mapStars,0,0,W,H);const v=mapVS[mapVS.length-1],cx=W/2+mapVO.x,cy=H/2+mapVO.y,jv=jd(new Date('{{ simulation_time_display }}Z'));if(v.tp==='solar'){for(const k of SO){mapCtx.beginPath();mapCtx.arc(cx,cy,Math.pow(ORB[k].a,.4)*100*mapZm,0,Math.PI*2);mapCtx.strokeStyle='rgba(148,163,184,.1)';mapCtx.lineWidth=.5;mapCtx.setLineDash([3,6]);mapCtx.stroke();mapCtx.setLineDash([])}mapDraw(cx,cy,BODIES.sun.r*mapZm,'sun','Sun');for(const k of SO){const b=BODIES[k],p=helio(k,jv);mapDraw(cx+p.x*mapZm,cy-p.y*mapZm,b.r*mapZm,k,b.n)}}else if(v.tp==='planet_system'){const c=BODIES[v.ck];if(!c)return;mapDraw(cx,cy,c.fr*mapZm,v.ck,c.n);if(c.mo)for(const[mk,mb]of Object.entries(c.mo)){const od=mb.orb*mapZm*1.8;mapCtx.beginPath();mapCtx.arc(cx,cy,od,0,Math.PI*2);mapCtx.strokeStyle='rgba(148,163,184,.1)';mapCtx.lineWidth=.5;mapCtx.setLineDash([3,6]);mapCtx.stroke();mapCtx.setLineDash([]);const an=(2*Math.PI*((jv-J2000_JD)%mb.P))/mb.P;mapDraw(cx+od*Math.cos(an),cy-od*Math.sin(an),mb.r*2.2*mapZm,mk,mb.n)}}else{const b=BODIES[v.ck];if(!b)return;const mx=Math.min(cx,cy)*.5,rr=Math.min((b.fr?b.fr*3:(b.r||4)*15)*mapZm,mx);mapDraw(cx,cy,rr,v.ck,b.n);if(v.ck==='saturn'&&rr>6){mapCtx.save();mapCtx.strokeStyle='rgba(200,180,140,.3)';mapCtx.lineWidth=Math.max(1,rr*.06);mapCtx.beginPath();mapCtx.ellipse(cx,cy,rr*1.5,rr*.18,0,0,Math.PI*2);mapCtx.stroke();mapCtx.strokeStyle='rgba(200,180,140,.15)';mapCtx.lineWidth=Math.max(1,rr*.04);mapCtx.beginPath();mapCtx.ellipse(cx,cy,rr*1.8,rr*.28,0,0,Math.PI*2);mapCtx.stroke();mapCtx.restore()}}if(mapHv){const b=mapFV(mapHv);if(b&&b._x!=null){mapCtx.beginPath();mapCtx.arc(mapHv?b._x:0,mapHv?b._y:0,(b._r||4)+5,0,Math.PI*2);mapCtx.strokeStyle='rgba(59,130,246,.7)';mapCtx.lineWidth=2;mapCtx.stroke()}}mapCtx.restore();rMapInfo()}
function rMapInfo(){const v=mapVS[mapVS.length-1];let sk,sn;if(v.tp==='solar'){sk='solar_system';sn='Solar System'}else{sk=v.ck;const b=BODIES[v.ck];sn=b?b.n+(v.tp==='planet_system'?' System':''):v.ck}document.getElementById('mi-title').textContent=sn;document.getElementById('mi-scope').textContent=sn;const as=LOC_ASSETS.filter(a=>{if(sk==='solar_system')return true;const loc=a.location.toLowerCase();if(sk==='earth')return loc.includes('leo')||loc.includes('earth')||loc.includes('lunar');if(sk==='mars')return loc.includes('mars');if(sk==='jupiter')return loc.includes('jupiter')||loc.includes('europa');if(sk==='saturn')return loc.includes('saturn');if(sk==='uranus')return loc.includes('uranus');if(sk==='neptune')return loc.includes('neptune');if(sk==='mercury')return loc.includes('mercury');if(sk==='venus')return loc.includes('venus');if(sk==='ceres')return loc.includes('ceres');if(sk==='vesta')return loc.includes('vesta');if(sk==='pluto')return loc.includes('pluto');return loc.includes(sk)});document.getElementById('mi-assets').innerHTML=as.length?as.map(a=>`<div style="display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid var(--border);font-size:.74rem"><span style="color:var(--accent);cursor:pointer">${a.name}</span><span class="mt" style="font-family:var(--font-data);font-size:.66rem">${a.location}</span></div>`).join(''):'<div style="color:var(--muted);font-size:.72rem">No assets</div>'}
function updateMapBack(){document.getElementById('bk-btn').classList.toggle('vis',mapVS.length>1)}
function mapGoBack(){if(mapVS.length>1)mapVS.pop();mapVO={x:0,y:0};mapZm=1;updateMapBack();renderMap();rMapInfo()}
initMap();
function svgEl(tag, attrs, text) {
const node = document.createElementNS(ns, tag);
Object.entries(attrs || {}).forEach(([key, value]) => node.setAttribute(key, String(value)));
if (text !== undefined) node.textContent = text;
return node;
}
function clearMap() {
Object.values(layers).forEach(layer => layer.replaceChildren());
root.querySelector('#body-layer').replaceChildren();
bodyPoints = {};
}
function orbit(cx, cy, rx, ry, strong=false, kind='') {
layers.orbit.append(svgEl('ellipse', {cx,cy,rx,ry,class:'orbit '+(strong?'strong ':'')+(kind==='minor'?'minor':'')}));
}
function planetPoint(planet) {
const angle = planet.angle * Math.PI / 180;
return {x:500 + Math.cos(angle) * planet.orbit, y:310 + Math.sin(angle) * planet.orbit * .6};
}
function mapPoint(x,y) {
const stage = root.querySelector('#location-map');
const width = stage.clientWidth || 1000;
const height = stage.clientHeight || 620;
const scale = Math.min(width/1000,height/620);
return {x:(width-1000*scale)/2+x*scale,y:(height-620*scale)/2+y*scale};
}
function bodyButton(id, name, x, y, size, sun=false, kind='') {
bodyPoints[id] = {x,y};
const point = mapPoint(x,y);
const button = document.createElement('button');
button.type = 'button';
button.className = 'body-button '+(sun?'sun ':'')+(kind==='minor'?'minor':'');
button.style.left = point.x+'px';
button.style.top = point.y+'px';
button.style.setProperty('--planet-size','clamp('+size+'px,'+(size/10).toFixed(2)+'vw,'+(size*2)+'px)');
button.setAttribute('aria-label','打开 '+name);
const disc = document.createElement('span'); disc.className = 'planet-disc';
const label = document.createElement('span'); label.className = 'body-label'; label.textContent = name;
button.append(disc,label);
button.addEventListener('click',()=>openBody(id));
root.querySelector('#body-layer').append(button);
}
function systemForBody(body) { return moonSystems[body] || body; }
function visibleTransfer(asset) {
if (!asset.transfer) return false;
if (view.level === 'system') return asset.scope === view.system;
return view.level === 'solar' || view.system === 'sun' ? asset.scope === 'sun' : false;
}
function transferPoint(body) {
const system = systemForBody(body);
return bodyPoints[body] || bodyPoints[system] || null;
}
function drawTransfer(asset, index) {
if (!visibleTransfer(asset)) return;
const from = transferPoint(asset.transfer.from);
const to = transferPoint(asset.transfer.to);
if (!from || !to) return;
const bend = index % 2 ? -1 : 1;
const mx = (from.x + to.x) / 2;
const my = (from.y + to.y) / 2;
const dx = to.x-from.x, dy = to.y-from.y;
const length = Math.max(1,Math.hypot(dx,dy));
const offset = Math.min(85,length*.24)*bend;
const cx = mx-dy/length*offset, cy = my+dx/length*offset;
const d = `M${from.x} ${from.y} Q${cx} ${cy} ${to.x} ${to.y}`;
const group = svgEl('g',{class:'route-group'+((showAllRoutes||selectedRoute===asset.id)?'':' hidden')});
layers.route.append(group);
const track = svgEl('path',{d,class:'transfer-track',pathLength:100}); group.append(track);
group.append(svgEl('path',{d,class:'transfer-progress',pathLength:100,'stroke-dasharray':asset.transfer.progress+' '+(100-asset.transfer.progress)}));
const total = track.getTotalLength();
const start = track.getPointAtLength(0), end = track.getPointAtLength(total);
const point = track.getPointAtLength(total*asset.transfer.progress/100);
const before = track.getPointAtLength(Math.max(0,total*asset.transfer.progress/100-2));
const angle = Math.atan2(point.y-before.y,point.x-before.x)*180/Math.PI;
group.append(svgEl('circle',{cx:start.x,cy:start.y,r:4,class:'route-endpoint'}));
group.append(svgEl('circle',{cx:end.x,cy:end.y,r:4,class:'route-endpoint'}));
const vessel = svgEl('g',{transform:`translate(${point.x} ${point.y}) rotate(${angle})`});
vessel.append(svgEl('circle',{cx:0,cy:0,r:6,class:'route-vessel-dot'}));
vessel.append(svgEl('line',{x1:5,y1:0,x2:15,y2:0,class:'route-vessel-heading'}));
group.append(vessel);
const side = point.x > 760 ? -1 : 1;
const labelX = point.x+side*24, labelY = point.y>340?point.y-20:point.y+27;
const anchor = side<0?'end':'start';
group.append(svgEl('line',{x1:point.x+side*8,y1:point.y-2,x2:labelX-side*4,y2:labelY-5,class:'route-label-leader'}));
group.append(svgEl('text',{x:labelX,y:labelY,'text-anchor':anchor,class:'route-label-title'},asset.name));
group.append(svgEl('text',{x:labelX,y:labelY+14,'text-anchor':anchor,class:'route-label-meta'},`${bodyNames[asset.transfer.from]||asset.transfer.from} → ${bodyNames[asset.transfer.to]||asset.transfer.to} · ${asset.transfer.progress}%`));
}
function drawAsset(x,y,label) {
layers.asset.append(svgEl('circle',{cx:x,cy:y,r:5,class:'map-asset'}));
layers.asset.append(svgEl('text',{x:x+10,y:y+4,class:'map-asset-label'},label));
}
function drawSolar() {
planets.forEach(p=>orbit(500,310,p.orbit,p.orbit*.6,p.id==='earth'||p.id==='mars',p.kind));
bodyButton('sun','Sun',500,310,34,true);
planets.forEach(p=>{const point=planetPoint(p);bodyButton(p.id,systems[p.id].name,point.x,point.y,p.size,false,p.kind)});
currentAssets().filter(a=>!a.transfer&&a.scope==='sun').slice(0,12).forEach((a,i)=>{const angle=.55+i*1.15;const radius=48+(i%4)*28;drawAsset(500+Math.cos(angle)*radius,310+Math.sin(angle)*radius*.6,a.name)});
assets.filter(a=>a.transfer).forEach(drawTransfer);
}
function drawSystem(systemId) {
const system = systems[systemId]; if (!system) return;
bodyButton(systemId,system.name,500,310,48);
const step = system.moons.length>5?42:system.moons.length>3?48:58;
system.moons.forEach((moon,index)=>{const radius=105+index*step;orbit(500,310,radius,radius*.7,index===0);const angle=.7+index*1.45;bodyButton(moon,bodyNames[moon],500+Math.cos(angle)*radius,310+Math.sin(angle)*radius*.7,12+(index%3)*2)});
assets.filter(a=>a.transfer).forEach(drawTransfer);
}
function drawLocal(bodyId) {
bodyButton(bodyId,systems[bodyId]?.name||bodyNames[bodyId]||bodyId,500,310,68,bodyId==='sun');
orbit(500,310,115,72,true); orbit(500,310,180,112); orbit(500,310,255,158);
currentAssets().filter(a=>!a.transfer).slice(0,20).forEach((a,index)=>{const angle=.4+index*.78;const radius=115+(index%3)*65;drawAsset(500+Math.cos(angle)*radius,310+Math.sin(angle)*radius*.62,a.name)});
}
function openBody(id) {
selectedRoute = null;
if (view.level==='solar') view = id==='sun'?{level:'local',system:'sun',body:'sun'}:{level:'system',system:id,body:null};
else if (view.level==='system') view = {level:'local',system:view.system,body:id};
else if (view.system==='sun'&&id!=='sun') view = {level:'system',system:id,body:null};
render();
}
function currentAssets() {
if (view.level==='solar') return assets;
if (view.system==='sun') return assets.filter(a=>a.scope==='sun');
if (view.level==='system') return assets.filter(a=>a.scope===view.system);
return assets.filter(a=>a.body===view.body);
}
function scopeName() {
if (view.level==='solar') return 'Solar System';
if (view.system==='sun') return 'Heliocentric Assets';
if (view.level==='system') return systems[view.system].name+' System';
return systems[view.body]?.name||bodyNames[view.body]||view.body;
}
function renderBreadcrumbs() {
const wrap = root.querySelector('#location-breadcrumbs'); wrap.replaceChildren();
const items = [{label:'Solar System',action:()=>{view={level:'solar',system:null,body:null};selectedRoute=null;render()}}];
if (view.level!=='solar'&&view.system!=='sun') items.push({label:systems[view.system].name+' System',action:()=>{view={level:'system',system:view.system,body:null};selectedRoute=null;render()}});
if (view.system==='sun') items.push({label:'Heliocentric Assets'}); else if (view.level==='local') items.push({label:scopeName()});
items.forEach((item,index)=>{if(index){const sep=document.createElement('span');sep.className='sep';sep.textContent='';wrap.append(sep)}const button=document.createElement('button');button.type='button';button.textContent=item.label;button.className=index===items.length-1?'current':'';if(item.action)button.addEventListener('click',item.action);wrap.append(button)});
}
function renderList() {
const rows = currentAssets();
root.querySelector('#scope-title').textContent=scopeName(); root.querySelector('#scope-count').textContent=rows.length+' assets'; root.querySelector('#panel-count').textContent=rows.length;
const list=root.querySelector('#asset-list'); list.replaceChildren();
if(!rows.length){const empty=document.createElement('div');empty.className='asset-empty';empty.textContent='当前范围内没有资产';list.append(empty);return}
rows.forEach(asset=>{const button=document.createElement('button');button.type='button';button.className='asset-button '+(String(asset.state).toLowerCase().includes('planned')?'planned ':'')+(selectedRoute===asset.id?'selected':'');button.textContent=asset.name;button.addEventListener('click',()=>{selectedRoute=visibleTransfer(asset)?asset.id:null;render();openDrawer(asset)});list.append(button)});
}
function openDrawer(asset) {
root.querySelector('#drawer-name').textContent=asset.name;
const fields=root.querySelector('#drawer-fields');fields.replaceChildren();
[['类型',asset.asset_type],['状态',asset.state],['位置',asset.location],['任务',asset.mission],['下一事件',asset.next_event]].forEach(([label,value])=>{const row=document.createElement('div');row.className='drawer-field';const key=document.createElement('span');key.textContent=label;const val=document.createElement('strong');val.textContent=value||'—';row.append(key,val);fields.append(row)});
root.querySelector('#drawer-link').href=asset.detail_url;
root.querySelector('#asset-drawer').classList.add('open'); root.querySelector('#asset-drawer').setAttribute('aria-hidden','false');
}
function closeDrawer(){root.querySelector('#asset-drawer').classList.remove('open');root.querySelector('#asset-drawer').setAttribute('aria-hidden','true')}
function render() {
closeDrawer(); clearMap();
if(view.level==='solar'||view.system==='sun')drawSolar();else if(view.level==='system')drawSystem(view.system);else drawLocal(view.body);
const hasRoutes=currentAssets().some(visibleTransfer);
const selected=assets.find(a=>a.id===selectedRoute);
root.querySelector('#view-mode').textContent=view.level==='solar'?'SOLAR SYSTEM':view.system==='sun'?'HELIOCENTRIC':view.level==='system'?'PLANETARY SYSTEM':'LOCAL ORBITS';
root.querySelector('#map-caption').textContent=selected?'已选择转移轨迹 · '+selected.name:showAllRoutes&&hasRoutes?'正在显示全部转移轨迹':view.level==='system'?'选择行星、卫星或转移资产':'选择天体或转移资产';
const toggle=root.querySelector('#transfer-toggle');toggle.checked=showAllRoutes&&hasRoutes;toggle.disabled=!hasRoutes;
renderBreadcrumbs();renderList();
}
root.querySelector('#drawer-close').addEventListener('click',closeDrawer);
root.querySelector('#transfer-toggle').addEventListener('change',event=>{showAllRoutes=event.target.checked;render()});
root.querySelector('#location-reset').addEventListener('click',()=>{view={level:'solar',system:null,body:null};selectedRoute=null;showAllRoutes=false;render()});
let resizeFrame=0;window.addEventListener('resize',()=>{cancelAnimationFrame(resizeFrame);resizeFrame=requestAnimationFrame(render)});
render();
})();
</script>
{% endblock %}
+1 -1
View File
@@ -194,7 +194,7 @@
{% endblock %}
{% block scripts %}
<script id="tl-json" type="application/json">{{ timeline_json|safe }}</script>
<script id="tl-json" type="application/json">{{ timeline_data|tojson }}</script>
<script>
(function(){
const viewport = document.getElementById('tl-viewport');
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

-48
View File
@@ -1,48 +0,0 @@
# CERV 图片内容识别说明
本文件记录 `data/KSP/CERV` 目录下现有截图的画面内容识别。图片均与 CERV 航天飞机相关,描述参考 `data/wiki/cerv_shuttle_zh.html` 中关于 CERV 的设定:CERV 采用轨道器、8.4 米外挂燃料箱和两枚 4 米液体燃料助推器的垂直发射/水平着陆构型,并具备整体式乘员舱全阶段逃逸能力。
为避免称呼含糊,本文统一使用以下名称:CERV 轨道器(Orbiter)、外挂燃料箱(External Tank, ET)、液体助推器(booster)、乘员逃逸舱。
## 总体判断
这批图片大致分为三组:
1. `screenshot52.png``screenshot55.png` 展示 CERV 全栈发射、上升和液体助推器分离相关画面。
2. `screenshot56.png``screenshot60.png` 以及 `screenshot64.png` 展示 CERV 轨道器在高空、近空间和再入阶段的飞行画面。
3. `screenshot61.png``screenshot63.png` 展示乘员舱整体逃逸测试和伞降回收画面。
## 逐图识别
| 文件 | 画面内容 | 对应 CERV 设定 | 建议用途 |
| --- | --- | --- | --- |
| `screenshot52.png` | CERV 全栈从发射台起飞。画面可见白色轨道器侧挂在大型棕色外挂燃料箱旁,两侧液体助推器点火,发射场建筑、跑道和天线阵列位于下方。 | 垂直发射构型;轨道器 + 8.4 m ET + 两枚 4 m 液体燃料助推器;发射场任务场景。 | 信息框主图或“发射与上升段”配图,适合作为 CERV 发射构型展示。 |
| `screenshot53.png` | CERV 全栈在蓝天中继续上升,视角从下后方观察,可见轨道器、外挂燃料箱和两枚助推器的发动机尾焰。 | 上升段由两枚液体助推器与三台 RS-25D 主发动机共同提供推力。 | “任务剖面/发射与上升段”配图,强调多发动机联合上升。 |
| `screenshot55.png` | 高空近空间环境下的 CERV 全栈,中央轨道器和外挂燃料箱继续飞行,两侧液体助推器已经分离并向外展开,地平线和大气层边缘清晰可见。 | 助推器分离后执行再入和反推回收;轨道器主发动机继续工作直至主发动机关机。 | “液体燃料助推器”或“任务剖面/助推器分离”配图,展示 CERV 与 STS 不同的液体助推器路线。 |
| `screenshot56.png` | CERV 轨道器位于近空间环境中,机体周围出现橙红色等离子体或高速气动加热痕迹,下方为地球大气层。 | CERV 再入阶段由改进型通用隔热瓦、隔热涂层和机翼前缘增强碳碳材料承受气动加热。 | “返回与着陆”或“热防护系统”配图,展示轨道器再入热流。 |
| `screenshot57.png` | CERV 轨道器在再入边缘高速飞行,画面右侧为轨道器,周围有强烈热流发光,后方或侧后方可见明显尾迹。 | 再入阶段电传飞控管理攻角、滚转和侧滑,以控制热流、航程和姿态。 | “返回与着陆”配图,适合说明高空再入和热流控制。 |
| `screenshot58.png` | CERV 轨道器近距离特写,机体被高亮等离子体和尾迹包裹,显示其在高速再入或高超声速飞行中穿越大气。 | 轨道器热防护系统在再入段承受极端热流,隔热瓦和下层涂层提供冗余保护。 | “热防护系统”配图,强调再入热环境和机体防护。 |
| `screenshot59.png` | CERV 轨道器位于画面右侧,地球弧面下方可见,机体被明亮热流包裹,画面中有一条较长的高温尾迹。 | CERV 作为有翼轨道器返回时以升力体滑翔方式减速,并通过姿态控制管理热流。 | “任务剖面/返回与着陆”配图,可展示再入轨迹与气动加热。 |
| `screenshot60.png` | CERV 轨道器在高空再入过程中从画面右侧掠过,带有明亮等离子体尾迹和较长气动或热流轨迹,下方可见地球表面。 | 轨道器从轨道返回后进入大气层,再入热流逐渐增强,随后转入滑翔下降和喷气发动机辅助着陆流程。 | “返回与着陆”配图,可作为再入段与后续着陆段之间的过渡画面。 |
| `screenshot61.png` | 发射场上空出现小型逃逸舱垂直上升,尾部有推进火焰;下方可见发射场跑道和地面设施,底部露出 CERV 全栈一部分。 | 发射台静态逃逸或低空逃逸测试场景;整体式乘员舱可在地面待发阶段脱离轨道器。 | “哥伦比亚事故与安全改进需求”或“乘员舱整体逃逸系统”配图,说明发射台逃逸能力。 |
| `screenshot62.png` | 高俯视角下,逃逸舱从发射场/跑道区域上方飞离,尾部有推进尾迹,下方可见发射中心建筑群和停机坪标记。 | 发射台或低空逃逸流程中的横向远离动作,用于让乘员舱脱离全栈危险区域。 | “乘员舱整体逃逸系统”配图,展示逃逸舱离开发射设施的轨迹。 |
| `screenshot63.png` | 逃逸舱已进入降落伞回收阶段。大型降落伞完全展开,舱体悬挂在伞下,背景是蓝天和远处发射场。 | 逃逸飞行后通过引导伞和主伞系统水面或陆地着陆,设计着陆速度不高于 8 m/s。 | “逃逸动力”或“乘员舱整体逃逸系统”末段配图,展示伞降回收。 |
| `screenshot64.png` | 近空间/高空再入氛围图,右侧可见 CERV 轨道器局部,背景为地球弧面、日出/日落色带和星空。 | CERV 轨道器在高空返回阶段经历大气边缘热流与姿态控制。 | 可作为“返回与着陆”或条目顶部氛围图;若需要严谨说明,建议标注为“高空返回/再入阶段渲染”。 |
## 可用于 Wiki 的图片定位建议
| 条目位置 | 推荐图片 | 说明 |
| --- | --- | --- |
| 信息框 | `screenshot52.png` | 最直观展示 CERV 全栈发射构型。 |
| 发射与上升段 | `screenshot53.png` | 展示轨道器、外挂燃料箱和液体助推器共同工作。 |
| 液体燃料助推器 | `screenshot55.png` | 展示助推器分离与回收流程的起点。 |
| 乘员舱整体逃逸系统 | `screenshot61.png`, `screenshot62.png`, `screenshot63.png` | 分别表现发射场逃逸、逃逸飞离和伞降回收。 |
| 再入与热防护 | `screenshot56.png`, `screenshot57.png`, `screenshot58.png`, `screenshot59.png`, `screenshot60.png` | 展示 CERV 轨道器高空再入时的热流包络和气动尾迹。 |
| 返回与着陆 | `screenshot64.png` | 可作为高空返回阶段的氛围图,但不宜单独用作常规跑道着陆图。 |
## 注意事项
- 这些截图更像任务过程渲染或 KSP 内拍摄画面,不是严格工程三视图。
- 当前目录中未看到直接展示 CERV 轨道器三视图、助推器发动机 8+1 布局、气闸舱与 1.875 m 可伸缩对接口的专门图片。
- 只有 `screenshot61.png``screenshot62.png``screenshot63.png` 是乘员舱整体逃逸相关图片;其余截图应按 CERV 轨道器或 CERV 全栈(轨道器 + 外挂燃料箱 + 液体助推器)任务画面处理。
- `screenshot64.png` 画面视觉效果强,但主体只露出局部,适合做氛围图或返回阶段示意,不适合作为结构说明图。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 675 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

+132
View File
@@ -0,0 +1,132 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { font-family: "Linux Libertine", Georgia, "Times New Roman", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 8px; font-size: 2.15em; line-height: 1.25; }
.wiki-article h2 { clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article h3 { margin: 1.05em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.35em 0 0.9em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.18em; }
.wiki-article .infobox { float: right; clear: right; width: 330px; margin: 0 0 18px 24px; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 88%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 8px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.12em; }
.wiki-article .infobox caption span { display: block; font-size: 0.92em; font-weight: normal; }
.wiki-article .infobox td { border: 1px solid #a2a9b1; padding: 6px 8px; vertical-align: top; }
.wiki-article .infobox-image { text-align: center; padding: 8px 10px !important; }
.wiki-article .infobox-image img { max-width: 100%; height: auto; }
.wiki-article .image-placeholder { min-height: 150px; border: 1px dashed #72777d; background: #eaecf0; color: #54595d; display: flex; align-items: center; justify-content: center; padding: 10px; text-align: center; box-sizing: border-box; }
.wiki-article .infobox .image-placeholder { min-height: 185px; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .thumbcaption { font-size: 0.88em; color: #202122; padding: 4px 3px 2px; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .toc { display: inline-block; min-width: 260px; margin: 0.45em 0 1.2em; padding: 8px 12px; border: 1px solid #a2a9b1; background: #f8f9fa; font-size: 92%; }
.wiki-article .toc-title { text-align: center; font-weight: bold; margin-bottom: 4px; }
.wiki-article .toc ol { margin: 0 0 0 1.5em; }
.wiki-article > table:not(.infobox) { width: 100%; margin: 1em 0; border-collapse: collapse; font-size: 92%; background: #fff; }
.wiki-article > table:not(.infobox) th, .wiki-article > table:not(.infobox) td { border: 1px solid #a2a9b1; padding: 6px 8px; text-align: left; vertical-align: top; }
.wiki-article > table:not(.infobox) th { background: #eaecf0; font-weight: bold; }
.wiki-article > table:not(.infobox) tr:nth-child(even) td { background: #f8f9fa; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .wiki-article .infobox { float: none; width: 100%; margin: 0.75em 0 1em; } .wiki-article .toc { display: block; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮可复用着陆器</h1>
<table class="infobox">
<caption>冰轮<span>可复用月面着陆器 / 燃料运输</span></caption>
<tbody>
<tr><td class="infobox-image"><div class="image-placeholder">冰轮着陆器侧面图</div><div class="thumbcaption">冰轮着陆器构型示意</div></td></tr>
<tr><td><b>类型</b>: 可复用月面着陆器(货运 / ISRU 双构型)</td></tr>
<tr><td><b>版本</b>: Block 2(当前生产型)</td></tr>
<tr><td><b>干重</b>: 28.194 tBlock 2</td></tr>
<tr><td><b>推进剂</b>: 液氢 + 液氧</td></tr>
<tr><td><b>内部燃料容量</b>: 121.6 tBlock 2</td></tr>
<tr><td><b>外挂油箱容量</b>: 95 t(货运型专属,模式 C 使用)</td></tr>
<tr><td><b>全高</b>: 36.7 mBlock 2,燃料箱和货仓延长)</td></tr>
<tr><td><b>发电能力</b>: 25 kW(极限)</td></tr>
<tr><td><b>可重复使用</b>: ✅</td></tr>
<tr><td><b>低温加注</b>: ✅(月面 ISRU 补给)</td></tr>
<tr><td><b>部署方式</b>: CZ-16 发射至 LEO,自行飞往月面</td></tr>
</tbody>
</table>
<p><b>冰轮着陆器</b><a href="/home/mission/Guanghan_Program">广寒计划</a>的核心物流资产,一款可重复使用的液氢液氧月面着陆器。冰轮在全计划中承担双重角色:ISRU 型负责在月面生产氢氧燃料,货运型负责在月面和近月轨道之间往返运输燃料与物资。</p>
<p>冰轮着陆器经历了从 Block 1 到 Block 2 的版本演进。Block 1(冰轮 #1 和 #2)干重 25 吨,内部燃料容量 96.5 吨。基于广寒计划前期运营经验,Block 2 延长了燃料箱和货仓,全高增至 36.7 米,取消了顶部保温燃料箱(其功能由储箱本身的 MLI 增强层替代),干重增至 28.194 吨,内部燃料容量提升至 121.6 吨。Block 2 的燃料增量为模式 C(燃料上行)和模式 D(取货下行)提供了更大的 Δv 余量。</p>
<p>冰轮具备两种构型——<b>ISRU 型</b>集成 12 吨月面资源利用载荷(ISRU 模块 9 t、采矿设备 2.5 t、散热器 0.5 t),月昼期间可日产 3 吨氢氧燃料,月夜依靠电池维持最低温控后停产;<b>货运型</b>设有外挂油箱接口,可在模式 C 下携带 95 吨外挂燃料上行至近月轨道交付金蟾转移级。两种构型共享同一箭体平台,ISRU 型的生产模块可在后期由乘组拆除,恢复为货运型。</p>
<nav class="toc" aria-label="Contents">
<div class="toc-title">目录</div>
<ol>
<li><a href="#profiles">飞行剖面</a></li>
<li><a href="#isru">ISRU 集成</a></li>
<li><a href="#fleet">舰队</a></li>
<li><a href="#specs">技术参数</a></li>
<li><a href="#seealso">参见</a></li>
</ol>
</nav>
<h2 id="profiles">飞行剖面</h2>
<table>
<thead><tr><th>模式</th><th>航程</th><th>燃料用量</th><th>载荷</th><th>用途</th></tr></thead>
<tbody>
<tr><td><b>A — 初始部署</b></td><td>LEO→LLO→月面</td><td>Block 1: 96.5 t / Block 2: 121.6 t</td><td>≤15 t</td><td>每台冰轮的首航,长征十六号运载火箭投放至 LEO 后自行飞往月面</td></tr>
<tr><td><b>C — 燃料上行</b></td><td>月面→LLO→月面</td><td>Block 1: 96.5 t / Block 2: 121.6 t(自用)</td><td>外挂 95 t 燃料交付 LLO 金蟾</td><td>燃料物流主模式</td></tr>
<tr><td><b>D — 取货下行</b></td><td>月面→LLO→月面</td><td>Block 1: 96.5 t / Block 2: 121.6 t(自用)</td><td>从 LLO 取 60 t 货物回月面</td><td>物资下行,与金蟾 60 t 运力匹配</td></tr>
</tbody>
</table>
<p><b>模式 B</b>(LLO→月面单程,理论载荷 120 t)受货仓体积限制不可用,本计划不采用。</p>
<h2 id="isru">ISRU 集成(ISRU 型)</h2>
<table>
<thead><tr><th>组件</th><th>质量</th><th>功能</th></tr></thead>
<tbody>
<tr><td>ISRU 模块</td><td>9.0 t</td><td>氢氧燃料生产核心</td></tr>
<tr><td>采矿设备</td><td>2.5 t</td><td>月壤 / 水冰开采</td></tr>
<tr><td>散热器</td><td>0.5 t</td><td>生产热管理</td></tr>
</tbody>
</table>
<p>运行参数:冰轮自身供电 20 kW(ISRU 专用);产能 3 吨氢氧燃料 / 天(月昼);月夜依靠电池维持最低温控,停产;全自动无人运行。后期可由乘组拆除 ISRU 模块,恢复为货运型。</p>
<h2 id="fleet">舰队</h2>
<table>
<thead><tr><th>编号</th><th>构型</th><th>位置</th><th>状态</th><th>任务</th></tr></thead>
<tbody>
<tr><td>冰轮 #1</td><td>Block 1 / ISRU 型</td><td>月面东方海</td><td>运行中</td><td><a href="/home/mission/Guanghan_Program/BL-01">冰轮部署任务-01</a> 部署,氢氧燃料生产。计划后期拆除 ISRU 模块转为货运型</td></tr>
<tr><td>冰轮 #2</td><td>Block 1 / 货运型</td><td>月面东方海</td><td>运行中</td><td><a href="/home/mission/Guanghan_Program/BL-02">冰轮部署任务-02</a> 部署。<a href="/home/mission/Guanghan_Program/GHC-03">广寒基地建设任务-03</a> 后明确为专职燃料运输冰轮</td></tr>
<tr><td>冰轮 #3</td><td>Block 2 / 货运型</td><td>转移中</td><td>飞行中</td><td><a href="/home/mission/Guanghan_Program/BL-03">冰轮部署任务-03</a> 部署,首艘 Block 2 冰轮。9/22 近月制动</td></tr>
</tbody>
</table>
<h2 id="specs">技术参数</h2>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>版本</td><td>Block 1:干重 25 t,燃料 96.5 t,全高 ~30 m</td></tr>
<tr><td></td><td>Block 2:干重 28.194 t,燃料 121.6 t,全高 36.7 m</td></tr>
<tr><td>推进剂</td><td>液氢 + 液氧</td></tr>
<tr><td>外挂油箱容量</td><td>95 t(货运型,Block 1 与 Block 2 通用)</td></tr>
<tr><td>ISRU 载荷</td><td>12 tISRU 型)</td></tr>
<tr><td>ISRU 产能</td><td>3 t 氢氧燃料 / 天(月昼)</td></tr>
<tr><td>发电能力</td><td>25 kW(极限)</td></tr>
<tr><td>长征十六号运载火箭发射总重(Block 2)</td><td>≤164.8 t(干 28.2 + 燃料 121.6 + 货 ≤15</td></tr>
</tbody>
</table>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/mission/Guanghan_Program">广寒计划</a></li>
<li><a href="/home/Spacecraft/Jinchan_Transfer_Stage">金蟾可复用转移级</a> — 冰轮在月球轨道的物流搭档</li>
<li><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a> — 冰轮的运载火箭</li>
</ul>
</article>
@@ -0,0 +1,314 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { font-family: "Linux Libertine", Georgia, "Times New Roman", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 8px; font-size: 2.15em; line-height: 1.25; }
.wiki-article h2 { clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article h3 { margin: 1.05em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article h4 { margin: 0.9em 0 0.25em; font-size: 1.02em; font-weight: bold; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.35em 0 0.9em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.18em; }
.wiki-article .infobox { float: right; clear: right; width: 330px; margin: 0 0 18px 24px; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 88%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 8px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.12em; }
.wiki-article .infobox caption span { display: block; font-size: 0.92em; font-weight: normal; }
.wiki-article .infobox td { border: 1px solid #a2a9b1; padding: 6px 8px; vertical-align: top; }
.wiki-article .infobox-image { text-align: center; padding: 8px 10px !important; }
.wiki-article .infobox-image img { max-width: 100%; height: auto; }
.wiki-article .image-placeholder { min-height: 150px; border: 1px dashed #72777d; background: #eaecf0; color: #54595d; display: flex; align-items: center; justify-content: center; padding: 10px; text-align: center; box-sizing: border-box; }
.wiki-article .infobox .image-placeholder { min-height: 185px; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article img[data-wiki-asset] { cursor: zoom-in; }
.wiki-article .media-link { display: block; color: inherit; text-decoration: none; }
.wiki-article .media-link:hover { text-decoration: none; }
.wiki-article .media-link:hover .image-placeholder { border-color: #36c; background: #f8f9fa; color: #202122; }
.wiki-article .thumb { width: 265px; border: 1px solid #c8ccd1; background: #f8f9fa; padding: 3px; font-size: 88%; line-height: 1.4; box-sizing: border-box; }
.wiki-article .tright { float: right; clear: right; margin: 0.35em 0 1em 1.4em; }
.wiki-article .tleft { float: left; clear: left; margin: 0.35em 1.4em 1em 0; }
.wiki-article .thumbcaption { padding: 4px 3px 2px; text-align: left; color: #202122; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .toc { display: inline-block; min-width: 260px; margin: 0.45em 0 1.2em; padding: 8px 12px; border: 1px solid #a2a9b1; background: #f8f9fa; font-size: 92%; }
.wiki-article .toc-title { text-align: center; font-weight: bold; margin-bottom: 4px; }
.wiki-article .toc ol { margin: 0 0 0 1.5em; }
.wiki-article > table:not(.infobox) { width: 100%; margin: 1em 0; border-collapse: collapse; font-size: 92%; background: #fff; }
.wiki-article > table:not(.infobox) th, .wiki-article > table:not(.infobox) td { border: 1px solid #a2a9b1; padding: 6px 8px; text-align: left; vertical-align: top; }
.wiki-article > table:not(.infobox) th { background: #eaecf0; font-weight: bold; }
.wiki-article > table:not(.infobox) tr:nth-child(even) td { background: #f8f9fa; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .wiki-article .infobox, .wiki-article .thumb { float: none; width: 100%; margin: 0.75em 0 1em; } .wiki-article .toc { display: block; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">嫦娥载人飞船</h1>
<table class="infobox">
<caption>嫦娥<span>载人飞船 · 月球探测</span></caption>
<tbody>
<tr><td class="infobox-image"><img src="/chang_e/chang_e_orbital_config.png" data-wiki-asset="/chang_e/chang_e_orbital_config.png" alt="嫦娥飞船与CZ-10E二级分离"><div class="thumbcaption">嫦娥飞船与长征十号戊型运载火箭二级分离:左侧为 CZ-10E 二级,右侧为嫦娥飞船</div></td></tr>
<tr><td><b>类型</b>: 载人飞船(月球轨道 / LEO 多任务)</td></tr>
<tr><td><b>设计方</b>: [待补充]</td></tr>
<tr><td><b>制造商</b>: [待补充]</td></tr>
<tr><td><b>组成</b>: 服务舱 + 返回舱</td></tr>
<tr><td><b>发射质量</b>: 28 t7 人构型)</td></tr>
<tr><td><b>推进剂</b>: 液氢 + 液氧,15,383 kg</td></tr>
<tr><td><b>主发动机</b>: 1× CE-10 Hecate 液氢发动机</td></tr>
<tr><td><b>轨道机动能力</b>: 3,700 m/s</td></tr>
<tr><td><b>乘员</b>: 6 人(标准)/ 7 人(紧急)</td></tr>
<tr><td><b>载人自持力</b>: 15 天</td></tr>
<tr><td><b>无人驻留</b>: 210 天(低功耗模式)</td></tr>
<tr><td><b>电力</b>: 8 组氢氧燃料电池(21.6 kW)</td></tr>
<tr><td><b>返回舱</b>: 梦舟改进型,热盾 + 主伞 + 气囊着陆</td></tr>
<tr><td><b>前身</b>: <a href="/home/Spacecraft/Mengzhou">梦舟载人飞船</a>2005 年首飞)</td></tr>
<tr><td><b>研发</b>: 2015 年</td></tr>
<tr><td><b>首飞</b>: 2020 年</td></tr>
<tr><td><b>状态</b>: [待补充]</td></tr>
</tbody>
</table>
<p><b>嫦娥载人飞船</b>(简称<b>嫦娥</b>)是中国载人航天飞船谱系中的第三代产品,一款面向月球轨道和近地轨道任务的多用途飞船。嫦娥飞船是<a href="/home/Spacecraft/Mengzhou">梦舟载人飞船</a>的深度改进型号——2015 年启动研发,2020 年首飞,在梦舟平台的基础上进行了航电系统全面升级和舱内空间布局优化,显著提升了月球轨道任务的可靠性和乘员舒适度。</p>
<p>嫦娥飞船具备灵活的任务适配能力。在登月构型中,它由<a href="/home/Launch_Vehicles/CZ-16A">长征十六号甲型运载火箭</a>搭载<a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a>组合发射,负责将组合体送入地月转移轨道、执行月球轨道插入制动,并在月面任务完成后携带乘组返回地球。在独立月球轨道任务中,嫦娥飞船由<a href="/home/Launch_Vehicles/CZ-10E">长征十号戊型运载火箭</a>单独发射,长征十号戊型运载火箭负责部分地月转移燃烧(约 2 km/s),剩余 1.1 km/s 由嫦娥飞船主发动机完成。在近地轨道任务中,嫦娥飞船可由 CZ-10A 发射至 LEO 承担空间站运输等任务。其任务弹性与阿波罗指挥/服务舱(CSM)类似。</p>
<nav class="toc" aria-label="Contents">
<div class="toc-title">目录</div>
<ol>
<li><a href="#design">总体设计</a></li>
<li><a href="#sm">服务舱</a></li>
<li><a href="#rc">返回舱</a></li>
<li><a href="#escape">发射逃逸系统</a></li>
<li><a href="#docking">交会对接</a></li>
<li><a href="#power">电力与生命保障</a></li>
<li><a href="#mission">任务剖面</a></li>
<li><a href="#specs">技术参数</a></li>
<li><a href="#seealso">参见</a></li>
</ol>
</nav>
<h2 id="design">总体设计</h2>
<p>嫦娥飞船采用服务舱-返回舱两舱构型,发射质量 28 吨(7 人构型)。服务舱位于后段,集成主推进、轨道机动和电力供应功能;返回舱位于前段,承载乘员并在任务末段执行大气再入与着陆。全船推进剂为液氢液氧,总携带量 15,383 kg,配合 Hecate 发动机的 480 s 高比冲,可提供 3,700 m/s 的轨道机动能力。</p>
<h3>发展背景</h3>
<p>嫦娥飞船是中国载人航天飞船谱系的第三代产品,其技术演化路径如下:</p>
<ul>
<li><b>神舟飞船(第一代)</b>:1980 年代研发,1985 年首飞。近地轨道载人飞船,奠定了中国载人航天的技术基础。</li>
<li><b>梦舟飞船(第二代)</b>:21 世纪初研发,2005 年首飞。深空载人飞船,具备月球轨道飞行能力,在乘员容量和自持力方面较神舟有显著提升。</li>
<li><b>嫦娥飞船(第三代)</b>:2015 年启动研发,2020 年首飞。在梦舟基础上深度改进——航电系统全面换代,舱内空间重新布局以提升长时间任务的乘员舒适度。嫦娥飞船不仅继承了梦舟的月球轨道飞行能力,更通过发射构型的模块化设计实现了近地轨道、独立月球轨道和月球组合体三种任务模式的灵活切换。</li>
</ul>
<h3>对接设计</h3>
<p>飞船前向设有一个标准对接口,用于在月球轨道与吴刚着陆器对接。对接完成后,乘员通过对接通道在两艘飞船之间转移,全程无需舱外活动(EVA)。对接方案与阿波罗 CSM 与登月舱的对接口逻辑一致。</p>
<h3>推进剂体系</h3>
<p>服务舱使用液氢液氧推进剂,液氢与液氧的体积配比为 72.76% : 27.24%。储箱采用多层隔热(MLI)低温储存方案,将推进剂维持在液态所需温度。低温储存过程中产生的蒸发气体并非浪费——它们被导入氢氧燃料电池反应转化为电力和水,形成推进剂与电力的一体化闭环。</p>
<h2 id="sm">服务舱</h2>
<p>服务舱是嫦娥飞船的推进、电力与热控核心,干重 7 吨。其搭载的 1 台 CE-10 Hecate 液氢发动机负责全部主推进任务:地月转移轨道中途修正、月球轨道插入(LOI)制动,以及月球轨道逃逸返回地球。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>干重</td><td>7 t</td></tr>
<tr><td>主发动机</td><td>1× CE-10 Hecate 液氢发动机</td></tr>
<tr><td>推力</td><td>70 kN(真空)</td></tr>
<tr><td>比冲</td><td>480 s(真空)/ 100 s(海平面)</td></tr>
<tr><td>推进剂</td><td>液态氢 + 液态氧,15,383 kg</td></tr>
<tr><td>推进剂配比</td><td>液氢 72.76% + 液氧 27.24%(体积比)</td></tr>
<tr><td>储箱容积</td><td>~42,452 L(利用率 93%</td></tr>
<tr><td>储箱隔热</td><td>多层隔热(MLI),100 层</td></tr>
<tr><td>轨道机动能力</td><td>3,700 m/s</td></tr>
<tr><td>RCS</td><td>8 组液氢液氧热气推力器(32 喷口,1 kN/喷口)</td></tr>
<tr><td>燃料电池</td><td>8 组氢氧燃料电池,总功率 21.6 kW(2,700 W/组)</td></tr>
<tr><td>热控</td><td>2 组主动散热系统</td></tr>
</tbody>
</table>
<p>CE-10 Hecate 是一款液氢液氧发动机,真空比冲高达 480 s,特别适合深空任务的长时间轨道机动。嫦娥飞船服务舱配备 1 台,吴刚着陆器配备 2 台,两型飞行器共享同一发动机型号,降低了研发和维护成本。</p>
<h2 id="rc">返回舱</h2>
<p>返回舱位于飞船前段,是乘员在发射、轨道飞行和再入阶段的驻留舱段。返回舱以梦舟飞船返回舱为基础改进而来,核心升级在于航电系统全面换代和舱内空间重新布局,干重 5.6 吨,最大乘员容量 7 人,标准登月任务搭载 6 人。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>基础型号</td><td>梦舟返回舱(改进型)</td></tr>
<tr><td>干重</td><td>5.6 t</td></tr>
<tr><td>乘员</td><td>7 人(最大)/ 6 人(标准任务)</td></tr>
<tr><td>热盾</td><td>烧蚀材料热盾,400 公斤烧蚀材料</td></tr>
<tr><td>减速系统</td><td>引导伞 + 主降落伞(70 m 展开直径)+ 着陆气囊</td></tr>
<tr><td>RCS</td><td>肼燃料,400 kg</td></tr>
<tr><td>对接口</td><td>前向标准对接口(与吴刚着陆器对接)</td></tr>
</tbody>
</table>
<h3>再入与回收</h3>
<p>返回舱采用弹道再入方案。再入前,服务舱分离抛弃;返回舱以热盾朝前姿态进入大气层,烧蚀材料在气动加热中逐步消耗。降至低空后,引导伞先行展开稳定姿态,主伞随后展开(直径 70 米)进一步减速。正常回收为陆地着陆:主伞减速至安全速度后,舱底着陆气囊充气展开,吸收着陆冲击,实现地面软着陆。</p>
<p>海面溅落仅作为紧急备份回收方案——例如轨道偏差超出陆地回收窗口范围,或回收区气象条件恶劣不宜陆地着陆时启用。</p>
<h2 id="escape">发射逃逸系统</h2>
<p>嫦娥飞船在发射段配备固体火箭逃逸系统,总质量 6 吨,安装于返回舱顶部。逃逸系统由两部分组成:</p>
<table>
<thead><tr><th>组件</th><th>功能</th><th>推进剂</th></tr></thead>
<tbody>
<tr><td>分离发动机</td><td>仅用于逃逸塔与火箭分离</td><td>PBAN 固体</td></tr>
<tr><td>主逃逸发动机</td><td>用于紧急逃逸,将返回舱从故障火箭上拖离</td><td>PBAN 固体</td></tr>
</tbody>
</table>
<p>逃逸塔的分离时机为二级发动机建立稳定推力之后——此时火箭已飞出大气稠密段且二级工作正常,不再需要逃逸保护,逃逸塔由分离发动机点火抛弃。若发射段二级发动机点火前出现紧急情况,主逃逸发动机可随时点火,将返回舱拖离故障火箭,保障乘员安全。</p>
<h2 id="docking">交会对接</h2>
<p>嫦娥飞船前向标准对接口与吴刚着陆器完全兼容。在月球轨道任务中的对接流程如下:</p>
<ol>
<li>吴刚着陆器完成月面任务后,2 台 Hecate 发动机点火从月面起飞,进入近月轨道</li>
<li>吴刚着陆器与嫦娥飞船进行交会,前向对接口完成硬捕获和密封锁定</li>
<li>乘员经对接通道从吴刚着陆器转移至嫦娥飞船返回舱,全程无需 EVA</li>
<li>对接解锁,两艘飞行器分离——嫦娥飞船准备地月返回,吴刚着陆器留轨等待加注或退役</li>
</ol>
<h2 id="power">电力与生命保障</h2>
<h3>氢氧燃料电池</h3>
<p>嫦娥飞船配备 8 组氢氧燃料电池,每组可提供 2,700 W 电力,总发电功率 21.6 kW。燃料电池利用推进剂储箱的蒸发气体作为反应物,生成电力的同时副产可饮用水。此方案具有三重优势:</p>
<ul>
<li><b>取消太阳能电池板</b>:省去展开机构,消除月面任务中的细尘污染风险</li>
<li><b>提高推进剂利用效率</b>:蒸发损失被转化为可用能源,而非白白排放</li>
<li><b>闭环水补给</b>:反应生成的水直接输入生命保障系统,补充乘员饮用水和卫生用水</li>
</ul>
<h3>生命保障</h3>
<p>飞船携带 640 公斤维生资源,可支持 7 人 14 天的飞行任务。维生资源包括氧气、食物、水等消耗品,分布于返回舱和居住区储罐中。服务舱航电模块内置分布式蓄电池作为电力缓冲,平衡瞬时负载波动。</p>
<h2 id="mission">任务剖面</h2>
<p>嫦娥飞船支持三种任务构型,以下重点描述登月任务剖面(长征十六号甲型运载火箭组合体构型)和独立月球任务剖面(长征十号戊型运载火箭构型)。</p>
<h3>发射构型总览</h3>
<table>
<thead><tr><th>构型</th><th>运载火箭</th><th>目标轨道</th><th>任务类型</th></tr></thead>
<tbody>
<tr><td>月球组合体</td><td><a href="/home/Launch_Vehicles/CZ-16A">长征十六号甲型运载火箭</a></td><td>TLI → LLO</td><td>搭载吴刚着陆器,载人登月</td></tr>
<tr><td>独立月球</td><td><a href="/home/Launch_Vehicles/CZ-10E">长征十号戊型运载火箭</a></td><td>LLO</td><td>独立月球轨道任务(长征十号戊型运载火箭执行部分 TLI)</td></tr>
<tr><td>近地轨道</td><td>CZ-10A</td><td>LEO</td><td>近地空间站乘员运输与物资补给</td></tr>
</tbody>
</table>
<h3>登月任务剖面(长征十六号甲型运载火箭组合体构型)</h3>
<h4>地月转移段</h4>
<ol>
<li>长征十六号甲型运载火箭二级完成 TLI 注入后,展开式整流罩解锁——花瓣展开并锁定,暴露有效载荷</li>
<li>嫦娥飞船服务舱 Hecate 发动机点火,从整流罩中分离</li>
<li>飞船调头 180°,前向对接口朝向仍固定在整流罩桁架上的吴刚着陆器</li>
<li>嫦娥飞船与吴刚着陆器前向对接,从整流罩中拖出着陆器</li>
<li>组合体继续飞往月球,嫦娥飞船负责中途修正机动</li>
</ol>
<h4>月球轨道段</h4>
<ol>
<li>组合体接近月球,嫦娥飞船服务舱 Hecate 发动机执行月球轨道插入(LOI)制动,进入近月低轨道</li>
<li>吴刚着陆器与嫦娥飞船分离,独立执行动力下降和月面着陆</li>
<li>嫦娥飞船在月球轨道待命,可维持无人驻留状态最长 210 天</li>
</ol>
<h4>返回段</h4>
<ol>
<li>吴刚着陆器完成月面任务后从月面起飞,进入 LLO 与嫦娥飞船交会对接</li>
<li>乘员经对接通道转移至返回舱</li>
<li>嫦娥飞船服务舱 Hecate 发动机点火,执行月球轨道逃逸机动</li>
<li>地月返回途中,服务舱分离抛弃</li>
<li>返回舱再入大气层——热盾承受气动加热,随后引导伞、主伞、着陆气囊依次展开</li>
<li>陆地软着陆,任务结束(紧急情况下执行海面溅落备份方案)</li>
</ol>
<h3>独立月球任务剖面(长征十号戊型运载火箭构型)</h3>
<h4>发射与地月转移</h4>
<ol>
<li><a href="/home/Launch_Vehicles/CZ-10E">长征十号戊型运载火箭</a>将嫦娥飞船送入地月转移轨道,长征十号戊型运载火箭负责约 2 km/s 的地月转移燃烧</li>
<li>一二级分离后,二级继续推进完成长征十号戊型运载火箭份额的 TLI 注入</li>
<li>嫦娥飞船与长征十号戊型运载火箭二级分离,飞船主发动机点火完成剩余 1.1 km/s 的 TLI 补充燃烧</li>
</ol>
<blockquote>
<strong>中止模式</strong>:若嫦娥飞船主发动机无法点火,飞船进入中止(abort)状态——利用 RCS 推力器降低远地点高度,使返回舱进入大气层再入走廊,执行紧急返回。
</blockquote>
<h4>月球轨道与返回</h4>
<ol>
<li>嫦娥飞船独自飞往月球,Hecate 发动机执行 LOI 制动进入 LLO</li>
<li>完成月球轨道任务(科学观测、轨道机动等)</li>
<li>Hecate 发动机执行月球轨道逃逸,地月返回</li>
<li>返回舱再入,陆地着陆回收</li>
</ol>
<h4>长征十号戊型运载火箭回收</h4>
<p>长征十号戊型运载火箭一级在完成推进任务后执行回收——一级再入大气层,通过栅格翼气动减速和发动机反推,在航区海上回收驳船上垂直软着陆回收。此回收方案与<a href="/home/Launch_Vehicles/CZ-16A">长征十六号甲型运载火箭</a>一级的陆地回收形成互补。</p>
<figure class="thumb tright"><a class="media-link" href="#chimg-launch"><img src="/chang_e/chang_e_cz10e_launch.png" alt="CZ-10E 发射嫦娥飞船" data-wiki-asset="/chang_e/chang_e_cz10e_launch.png"></a><figcaption class="thumbcaption">长征十号戊型运载火箭搭载嫦娥飞船升空</figcaption></figure>
<figure class="thumb tright"><a class="media-link" href="#chimg-staging"><img src="/chang_e/chang_e_cz10e_staging.png" alt="CZ-10E 一二级分离" data-wiki-asset="/chang_e/chang_e_cz10e_staging.png"></a><figcaption class="thumbcaption">长征十号戊型运载火箭一二级分离,一级开始回收流程</figcaption></figure>
<h2 id="specs">技术参数</h2>
<h3>全船参数</h3>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>发射质量</td><td>28 t7 人构型)</td></tr>
<tr><td>服务舱干重</td><td>7 t</td></tr>
<tr><td>返回舱干重</td><td>5.6 t</td></tr>
<tr><td>推进剂</td><td>液氢 + 液氧,15,383 kg</td></tr>
<tr><td>主发动机</td><td>1× CE-10 Hecate70 kNISP 480 s</td></tr>
<tr><td>轨道机动能力</td><td>3,700 m/s</td></tr>
<tr><td>RCS</td><td>8 组 × 4 喷口(32 喷口,1 kN/喷口),液氢液氧</td></tr>
<tr><td>燃料电池</td><td>8 组 × 2,700 W,总功率 21.6 kW</td></tr>
<tr><td>热控</td><td>2 组主动散热系统</td></tr>
<tr><td>乘员</td><td>7 人(最大)/ 6 人(标准任务)</td></tr>
<tr><td>载人自持力</td><td>14 天(7 人)/ 15 天(6 人)</td></tr>
<tr><td>无人驻留</td><td>210 天(低功耗模式)</td></tr>
<tr><td>维生资源</td><td>640 kg,支持 7 人 14 天</td></tr>
</tbody>
</table>
<h3>返回舱参数</h3>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>干重</td><td>5.6 t</td></tr>
<tr><td>乘员</td><td>7 人(最大)/ 6 人(标准任务)</td></tr>
<tr><td>热盾</td><td>400 公斤烧蚀材料</td></tr>
<tr><td>减速系统</td><td>引导伞 + 70 m 主伞 + 着陆气囊</td></tr>
<tr><td>RCS</td><td>肼燃料,400 kg</td></tr>
<tr><td>对接口</td><td>前向标准对接口</td></tr>
</tbody>
</table>
<h3>逃逸系统参数</h3>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>总质量</td><td>6 t</td></tr>
<tr><td>组成</td><td>分离发动机 + 主逃逸发动机</td></tr>
<tr><td>分离时机</td><td>二级发动机建立稳定推力后</td></tr>
</tbody>
</table>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/Spacecraft/Mengzhou">梦舟载人飞船</a> — 嫦娥飞船的前身型号</li>
<li><a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a> — 嫦娥飞船的月面任务搭档</li>
<li><a href="/home/Launch_Vehicles/CZ-16A">CZ-16A 长征十六号甲</a> — 月球组合体构型运载火箭</li>
<li><a href="/home/Launch_Vehicles/CZ-10E">CZ-10E 长征十号戊</a> — 独立月球轨道构型运载火箭</li>
</ul>
</article>
+203
View File
@@ -0,0 +1,203 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { font-family: "Linux Libertine", Georgia, "Times New Roman", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 8px; font-size: 2.15em; line-height: 1.25; }
.wiki-article h2 { clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article h3 { margin: 1.05em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article h4 { margin: 0.9em 0 0.25em; font-size: 1.02em; font-weight: bold; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.35em 0 0.9em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.18em; }
.wiki-article .infobox { float: right; clear: right; width: 330px; margin: 0 0 18px 24px; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 88%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 8px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.12em; }
.wiki-article .infobox caption span { display: block; font-size: 0.92em; font-weight: normal; }
.wiki-article .infobox td { border: 1px solid #a2a9b1; padding: 6px 8px; vertical-align: top; }
.wiki-article .infobox-image { text-align: center; padding: 8px 10px !important; }
.wiki-article .infobox-image img { max-width: 100%; height: auto; }
.wiki-article .image-placeholder { min-height: 150px; border: 1px dashed #72777d; background: #eaecf0; color: #54595d; display: flex; align-items: center; justify-content: center; padding: 10px; text-align: center; box-sizing: border-box; }
.wiki-article .infobox .image-placeholder { min-height: 185px; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .thumbcaption { font-size: 0.88em; color: #202122; padding: 4px 3px 2px; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .toc { display: inline-block; min-width: 260px; margin: 0.45em 0 1.2em; padding: 8px 12px; border: 1px solid #a2a9b1; background: #f8f9fa; font-size: 92%; }
.wiki-article .toc-title { text-align: center; font-weight: bold; margin-bottom: 4px; }
.wiki-article .toc ol { margin: 0 0 0 1.5em; }
.wiki-article > table:not(.infobox) { width: 100%; margin: 1em 0; border-collapse: collapse; font-size: 92%; background: #fff; }
.wiki-article > table:not(.infobox) th, .wiki-article > table:not(.infobox) td { border: 1px solid #a2a9b1; padding: 6px 8px; text-align: left; vertical-align: top; }
.wiki-article > table:not(.infobox) th { background: #eaecf0; font-weight: bold; }
.wiki-article > table:not(.infobox) tr:nth-child(even) td { background: #f8f9fa; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .wiki-article .infobox { float: none; width: 100%; margin: 0.75em 0 1em; } .wiki-article .toc { display: block; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">长征十号戊运载火箭</h1>
<table class="infobox">
<caption>CZ-10E<span>长征十号戊 · 中型运载火箭</span></caption>
<tbody>
<tr><td class="infobox-image"><div class="image-placeholder">CZ-10E 全箭侧面图</div><div class="thumbcaption">CZ-10E 全箭构型示意</div></td></tr>
<tr><td><b>型号</b>: CZ-10E(长征十号戊)</td></tr>
<tr><td><b>类型</b>: 中型运载火箭(一级可回收)</td></tr>
<tr><td><b>制造商</b>: [待补充]</td></tr>
<tr><td><b>全箭高度</b>: 91 m20 m 整流罩构型)</td></tr>
<tr><td><b>级数</b>: 2</td></tr>
<tr><td><b>箭体直径</b>: 5 m</td></tr>
<tr><td><b>整流罩直径</b>: 5 m / 6.25 m / 7.5 m</td></tr>
<tr><td><b>一级发动机</b>: 9× YF-150</td></tr>
<tr><td><b>一级推进剂</b>: 液氧煤油</td></tr>
<tr><td><b>二级发动机</b>: 1× YF-215X Vac</td></tr>
<tr><td><b>二级推进剂</b>: 液氧甲烷</td></tr>
<tr><td><b>起飞推力</b>: 14,850 kN</td></tr>
<tr><td><b>起飞推重比</b>: 1.2255 t 载荷)</td></tr>
<tr><td><b>LEO 运力</b>: 55 t(航区回收)</td></tr>
<tr><td><b>TLI 运力</b>: 18 t</td></tr>
<tr><td><b>一级回收</b>: 栅格翼 + 发动机反推垂直着陆</td></tr>
<tr><td><b>载人能力</b>: 支持</td></tr>
<tr><td><b>首飞</b>: [待补充]</td></tr>
<tr><td><b>状态</b>: [待补充]</td></tr>
</tbody>
</table>
<p><b>长征十号戊</b><b>CZ-10E</b>)是一款中型两级运载火箭,一级具备可回收复用能力。CZ-10E 采用混合推进剂体系——一级使用液氧煤油、二级使用液氧甲烷——是长征运载火箭家族中推进剂组合较为特殊的一个型号。火箭全箭直径 5 m,搭配 20 m 整流罩时全高 91 m。</p>
<p>CZ-10E 支持载人任务,可搭配<a href="/home/Spacecraft/Chang_E_Crewed_Exploration_Vehicle">嫦娥载人飞船</a><a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a>独立发射至地月转移轨道。受限于二级推进剂容量,CZ-10E 仅执行部分 TLI 点火(约 2 km/s),剩余速度增量由有效载荷自行完成——嫦娥飞船或吴刚着陆器的主发动机在分离后独立完成剩余约 1.1 km/s 的 TLI 补充燃烧。</p>
<nav class="toc" aria-label="Contents">
<div class="toc-title">目录</div>
<ol>
<li><a href="#design">总体设计</a></li>
<li><a href="#s1">一级</a></li>
<li><a href="#s2">二级</a></li>
<li><a href="#recovery">一级回收系统</a></li>
<li><a href="#performance">运载能力</a></li>
<li><a href="#specs">技术参数</a></li>
<li><a href="#seealso">参见</a></li>
</ol>
</nav>
<h2 id="design">总体设计</h2>
<p>CZ-10E 采用两级串联布局,全箭直径 5 m,搭配 20 m 整流罩时全高 91 m。火箭采用混合推进剂体系:一级使用液氧煤油,二级使用液氧甲烷。这一设计的工程逻辑在于——一级在稠密大气层内工作,液氧煤油密度比冲高,同等推力下箭体直径更紧凑,有利于减小气动阻力;二级在真空中工作,液氧甲烷比冲更高,且与 CZ-16 系列共享 YF-215X Vac 发动机型号,降低研发和维护成本。</p>
<h3>推进剂体系</h3>
<p>一级装载 796 t 液氧煤油燃料,通过 9 台 YF-150 补燃循环发动机燃烧。一级姿控采用冷气 RCS,工质为储箱蒸发液氧,无需独立的 RCS 燃料。二级装载 339 t 液氧甲烷燃料,由 1 台 YF-215X Vac 全流量补燃循环发动机提供推力;姿控采用肼燃料 RCS(装载量 200 kg)。</p>
<p>一级储箱设计继承了 CZ-16 系列的中央防晃导管方案——储箱中央贯穿一根加粗燃料导管,在返场和再入制动等回收谱段中利用轴向过载维持稳定液柱,保障发动机在储箱内推进剂大幅晃动时仍能获得可靠燃料供应。二级的气球型储箱则依靠储箱自身张力维持结构,无需额外增压系统。</p>
<h2 id="s1">一级</h2>
<p>一级为可回收复用助推级,箭体高 45.6 m,直径 5 m。干重 47.5 t,最大可装载 796 t 液氧煤油燃料。安装 9 台 YF-150 液氧煤油补燃循环发动机,单台海平面推力 1,650 kN,比冲 308 s(海平面)/ 340 s(真空)。发动机单台干重 1.8 t,9 台合计 16.2 t。起飞总推力 14,850 kN(海平面),搭配 55 t 有效载荷时起飞推重比 1.22。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>45.6 m</td></tr>
<tr><td>直径</td><td>5 m</td></tr>
<tr><td>干重</td><td>47.5 t</td></tr>
<tr><td>最大燃料</td><td>796 t(液氧煤油)</td></tr>
<tr><td>发动机</td><td>9× YF-150</td></tr>
<tr><td>单台推力</td><td>1,650 kN(海平面)/ 1,821.4 kN(真空)</td></tr>
<tr><td>总推力</td><td>14,850 kN(海平面)/ 16,393 kN(真空)</td></tr>
<tr><td>比冲</td><td>308 s(海平面)/ 340 s(真空)</td></tr>
<tr><td>单台干重</td><td>1.8 t</td></tr>
<tr><td>发动机总干重</td><td>16.2 t</td></tr>
<tr><td>发动机类型</td><td>补燃循环液氧煤油</td></tr>
<tr><td>姿控</td><td>冷气 RCS(工质:蒸发液氧)</td></tr>
<tr><td>栅格翼</td><td>4 片钛合金,90° 均匀分布,单片 280 kg</td></tr>
<tr><td>着陆腿展开包络</td><td>21.1 m</td></tr>
</tbody>
</table>
<h2 id="s2">二级</h2>
<p>二级箭体高 27 m(不含整流罩,含载荷支架),配备 20 m 整流罩时总高 45.4 m。直径 5 m,干重 11.7 t。安装 1 台 YF-215X Vac 全流量补燃循环液氧甲烷发动机——与 CZ-16/CZ-16A 系列的二级发动机同型号。YF-215X Vac 具备飞行中多次点火能力,可在入轨后长时间滑行待机,然后在月球转移窗口重新启动注入 TLI。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>27 m(不含整流罩)/ 45.4 m(含 20 m 整流罩)</td></tr>
<tr><td>直径</td><td>5 m</td></tr>
<tr><td>干重</td><td>11.7 t</td></tr>
<tr><td>燃料</td><td>339 t(液氧甲烷)</td></tr>
<tr><td>发动机</td><td>1× YF-215X Vac</td></tr>
<tr><td>推力</td><td>2,800 kN(真空)</td></tr>
<tr><td>比冲</td><td>380 s(真空)/ 280 s(海平面)</td></tr>
<tr><td>发动机类型</td><td>全流量补燃循环液氧甲烷</td></tr>
<tr><td>RCS</td><td>肼燃料,200 kg</td></tr>
<tr><td>在轨能力</td><td>长时间待机,多次点火</td></tr>
</tbody>
</table>
<p>二级仅配备 1 台 YF-215X Vac,总推力 2,800 kN。这一推力水平足以完成 LEO 入轨,但对于 TLI 注入而言,不足以一次性将嫦娥飞船或吴刚着陆器送入完整的地月转移轨道。因此 CZ-10E 在月球任务中采用与有效载荷分担负重的模式——火箭二级完成约 2 km/s 的 TLI 份额,有效载荷在分离后自行点火补充剩余约 1.1 km/s。这种分工模式确保了 CZ-10E 无需为高能量轨道任务专门增大二级发动机规模,保持了火箭在 LEO 投送和月球任务之间的灵活性。</p>
<h2 id="recovery">一级回收系统</h2>
<p>CZ-10E 一级采用航区回收模式:分离后一级不执行返场点火,沿发射方向继续飞行,使用冷气 RCS 根据海上回收驳船位置进行落点修正。回收流程与 CZ-16 系列类似:</p>
<ol>
<li><b>分离与姿态调整</b>:一二级分离后,一级使用冷气 RCS 逐步调整姿态和落点。</li>
<li><b>再入制动</b>:再入大气层前,部分 YF-150 发动机重新点火执行再入制动,将速度降至栅格翼和箭体结构可承受的范围。</li>
<li><b>气动减速</b>:4 片钛合金栅格翼展开,进行气动减速和升力飞行。栅格翼采用 90° 均匀分布布局(而非 CZ-16 系列的 120°-60° 非对称布局),单片质量 280 kg(含制动器)。冷气 RCS 维持箭体姿态。</li>
<li><b>着陆点火</b>:接近海面时,发动机重新点火执行减速。4 条展开式着陆腿在着陆前展开,包络 21.1 m。</li>
<li><b>海上着陆</b>:一级垂直软着陆于回收驳船,经检测后复用。</li>
</ol>
<p>冷气 RCS 使用储箱蒸发液氧作为工质,避免了独立 RCS 燃料储箱的重量和复杂度,同时蒸发工质的持续补充特性使其在回收全程中保持稳定的姿态控制能力。</p>
<h2 id="performance">运载能力</h2>
<table>
<thead><tr><th>回收模式</th><th>LEO 运力</th></tr></thead>
<tbody>
<tr><td>航区回收</td><td>55 t</td></tr>
</tbody>
</table>
<table>
<thead><tr><th>轨道</th><th>运力</th><th>备注</th></tr></thead>
<tbody>
<tr><td>LEO</td><td>55 t</td><td>航区回收</td></tr>
<tr><td>TLI</td><td>18 t</td><td>部分 TLI(~2 km/s),剩余由有效载荷完成</td></tr>
</tbody>
</table>
<h3>典型任务</h3>
<ul>
<li><b>近地轨道投送</b>:55 t LEO 运力适用于大规模空间站补给、模块发射等任务。</li>
<li><b>嫦娥飞船独立月球任务</b>CZ-10E 将嫦娥飞船送入 TLI 轨道(提供约 2 km/s),嫦娥飞船主发动机独立完成剩余 1.1 km/s 的 TLI 补充和月球轨道插入制动。</li>
<li><b>吴刚着陆器独立部署</b>:CZ-10E 将吴刚着陆器送入 TLI 轨道(提供约 2 km/s),吴刚着陆器自行完成剩余 TLI 和月球轨道插入。此模式主要用于月面 ISRU 启动后大规模部署可复用着陆器。</li>
</ul>
<h2 id="specs">技术参数</h2>
<table>
<thead><tr><th>参数</th><th>一级</th><th>二级</th></tr></thead>
<tbody>
<tr><td>高度</td><td>45.6 m</td><td>27 m(不含整流罩)/ 45.4 m(含 20 m 整流罩)</td></tr>
<tr><td>直径</td><td colspan="2">5 m</td></tr>
<tr><td>干重</td><td>47.5 t</td><td>11.7 t</td></tr>
<tr><td>最大燃料</td><td>796 t(液氧煤油)</td><td>339 t(液氧甲烷)</td></tr>
<tr><td>发动机</td><td>9× YF-150</td><td>1× YF-215X Vac</td></tr>
<tr><td>发动机类型</td><td>补燃循环液氧煤油</td><td>全流量补燃循环液氧甲烷</td></tr>
<tr><td>总推力</td><td>14,850 kN(海平面)</td><td>2,800 kN(真空)</td></tr>
<tr><td>比冲(海平面/真空)</td><td>308 s / 340 s</td><td>280 s / 380 s</td></tr>
<tr><td>姿控</td><td>冷气 RCS(蒸发液氧)</td><td>肼燃料 RCS200 kg</td></tr>
<tr><td>栅格翼</td><td>4 片,90° 均匀布局,单片 280 kg</td><td></td></tr>
<tr><td>着陆腿展开包络</td><td>21.1 m</td><td></td></tr>
<tr><td>回收模式</td><td>航区回收</td><td></td></tr>
</tbody>
</table>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a> — 重型运载火箭,一级与 CZ-10E 同属可回收系列</li>
<li><a href="/home/Launch_Vehicles/CZ-16A">CZ-16A 长征十六号甲</a> — 高能量轨道优化型号</li>
<li><a href="/home/Spacecraft/Chang_E_Crewed_Exploration_Vehicle">嫦娥载人飞船</a> — CZ-10E 独立月球构型的搭载飞船</li>
<li><a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a> — CZ-10E 独立部署构型的搭载着陆器</li>
</ul>
</article>
+213
View File
@@ -0,0 +1,213 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { font-family: "Linux Libertine", Georgia, "Times New Roman", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 8px; font-size: 2.15em; line-height: 1.25; }
.wiki-article h2 { clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article h3 { margin: 1.05em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article h4 { margin: 0.9em 0 0.25em; font-size: 1.02em; font-weight: bold; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.35em 0 0.9em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.18em; }
.wiki-article .infobox { float: right; clear: right; width: 330px; margin: 0 0 18px 24px; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 88%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 8px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.12em; }
.wiki-article .infobox caption span { display: block; font-size: 0.92em; font-weight: normal; }
.wiki-article .infobox td { border: 1px solid #a2a9b1; padding: 6px 8px; vertical-align: top; }
.wiki-article .infobox-image { text-align: center; padding: 8px 10px !important; }
.wiki-article .infobox-image img { max-width: 100%; height: auto; }
.wiki-article .image-placeholder { min-height: 150px; border: 1px dashed #72777d; background: #eaecf0; color: #54595d; display: flex; align-items: center; justify-content: center; padding: 10px; text-align: center; box-sizing: border-box; }
.wiki-article .infobox .image-placeholder { min-height: 185px; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .thumbcaption { font-size: 0.88em; color: #202122; padding: 4px 3px 2px; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .toc { display: inline-block; min-width: 260px; margin: 0.45em 0 1.2em; padding: 8px 12px; border: 1px solid #a2a9b1; background: #f8f9fa; font-size: 92%; }
.wiki-article .toc-title { text-align: center; font-weight: bold; margin-bottom: 4px; }
.wiki-article .toc ol { margin: 0 0 0 1.5em; }
.wiki-article > table:not(.infobox) { width: 100%; margin: 1em 0; border-collapse: collapse; font-size: 92%; background: #fff; }
.wiki-article > table:not(.infobox) th, .wiki-article > table:not(.infobox) td { border: 1px solid #a2a9b1; padding: 6px 8px; text-align: left; vertical-align: top; }
.wiki-article > table:not(.infobox) th { background: #eaecf0; font-weight: bold; }
.wiki-article > table:not(.infobox) tr:nth-child(even) td { background: #f8f9fa; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .wiki-article .infobox { float: none; width: 100%; margin: 0.75em 0 1em; } .wiki-article .toc { display: block; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">长征十六号运载火箭</h1>
<table class="infobox">
<caption>CZ-16<span>长征十六号 · 重型运载火箭</span></caption>
<tbody>
<tr><td class="infobox-image"><div class="image-placeholder">CZ-16 全箭侧面图</div><div class="thumbcaption">CZ-16 全箭构型示意</div></td></tr>
<tr><td><b>型号</b>: CZ-16(长征十六号)</td></tr>
<tr><td><b>类型</b>: 重型运载火箭(一级可回收)</td></tr>
<tr><td><b>制造商</b>: [待补充]</td></tr>
<tr><td><b>全箭高度</b>: 110 m20 m 整流罩构型)</td></tr>
<tr><td><b>级数</b>: 2</td></tr>
<tr><td><b>箭体直径</b>: 7.5 m(一级/二级)</td></tr>
<tr><td><b>整流罩直径</b>: 7.5 m(标配)/ 10 m、12 m(选装)</td></tr>
<tr><td><b>一级通用</b>: 与 <a href="/home/Launch_Vehicles/CZ-16A">CZ-16A</a> 共用</td></tr>
<tr><td><b>一级干重</b>: 135 t</td></tr>
<tr><td><b>一级燃料</b>: 2,128 t(最大)</td></tr>
<tr><td><b>起飞推重比</b>: 1.33</td></tr>
<tr><td><b>起飞推力</b>: 43,809 kN</td></tr>
<tr><td><b>一级发动机</b>: 15× YF-215X</td></tr>
<tr><td><b>二级发动机</b>: 2× YF-215X Vac</td></tr>
<tr><td><b>推进剂</b>: 液氧甲烷</td></tr>
<tr><td><b>LEO 运力(RTLS</b>: 135 t</td></tr>
<tr><td><b>LEO 运力(航区回收)</b>: 155 t</td></tr>
<tr><td><b>一级回收</b>: 栅格翼 + 发动机反推垂直着陆</td></tr>
<tr><td><b>首飞</b>: [待补充]</td></tr>
<tr><td><b>状态</b>: [待补充]</td></tr>
</tbody>
</table>
<p><b>长征十六号</b><b>CZ-16</b>)是一款重型两级运载火箭,一级具备可回收复用能力。CZ-16 是长征十六号系列的基础型号,主要用于向近地轨道(LEO)大规模投送有效载荷,也可搭配氢氧上面级完成高能量轨道任务。其改进型号<a href="/home/Launch_Vehicles/CZ-16A">CZ-16A</a>将二级燃料箱加长 6 m、发动机增至 3 台,针对月球及更远的高能量轨道进行了专项优化。</p>
<p>火箭采用两级串联构型,一级和二级燃料箱直径均为 7.5 m,全箭以液氧甲烷为统一推进剂。一二级均使用 YF-215X 全流量补燃循环液氧甲烷发动机,其中二级采用 2 台真空优化型 YF-215X Vac——该发动机支持长时间在轨待机和多次点火,使二级具备灵活的多脉冲轨道机动能力。一级与 CZ-16A 完全通用,两者共享相同的发动机、储箱、回收系统和航电架构。</p>
<nav class="toc" aria-label="Contents">
<div class="toc-title">目录</div>
<ol>
<li><a href="#design">总体设计</a></li>
<li><a href="#s1">一级</a></li>
<li><a href="#s2">二级</a></li>
<li><a href="#recovery">一级回收系统</a></li>
<li><a href="#performance">运载能力</a></li>
<li><a href="#comparison">与 CZ-16A 的定位差异</a></li>
<li><a href="#specs">技术参数</a></li>
<li><a href="#seealso">参见</a></li>
</ol>
</nav>
<h2 id="design">总体设计</h2>
<p>CZ-16 采用两级串联布局,搭配标准 20 m 整流罩时全箭高度 110 m。一级和二级燃料箱直径均为 7.5 m,全箭以液氧甲烷为统一推进剂。甲烷燃料燃烧清洁、不易积碳,有利于发动机在多次复用中保持性能稳定。</p>
<p>一级安装 15 台 YF-215X 全流量补燃循环液氧甲烷发动机——中央 3 台通过万向节自由摆动(TVC 范围 ±15°),外围 12 台固定安装(矢量范围 ±3°)——起飞总推力 43,809 kN。二级安装 2 台 YF-215X Vac 真空优化型发动机,单台真空推力 2,800 kN,支持长时间在轨待机和多次点火,可执行复杂的多脉冲轨道注入序列。</p>
<h3>推进剂体系</h3>
<p>一级主储箱容积约 2,392,274 L;二级主储箱容积约 1,104,466 L,采用气球型低温储箱以实现 100% 容积利用率。全箭使用液氧甲烷(液态甲烷 + 液态氧)统一推进剂方案。</p>
<p>一级储箱中央贯穿一根直径 2.5 m 的加粗燃料导管,自储箱顶部延伸至发动机舱。管道在储箱内部起到防晃隔板的作用——在返场、再入制动和着陆点火等回收谱段中,箭体经历大幅度姿态变化和轴向减速过载,常规储箱内的推进剂晃动可能导致燃料供应中断。中央导管的粗直径使其内部始终保持充足的液柱高度,确保发动机在各回收阶段均能获得稳定的燃料供应,无需另行设置独立的回收专用储箱。</p>
<h2 id="s1">一级</h2>
<p>一级为可回收复用助推级,与 CZ-16A 完全通用。箭体高 67.5 m,直径 7.5 m,干重 135 t,最大可装载 2,128 t 液氧甲烷燃料。15 台 YF-215X 发动机的单台海平面推力 2,920.6 kN,比冲 330 s(海平面)/ 351 s(真空)。起飞推重比 1.33。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>67.5 m</td></tr>
<tr><td>直径</td><td>7.5 m</td></tr>
<tr><td>干重</td><td>135 t</td></tr>
<tr><td>最大燃料</td><td>2,128 t</td></tr>
<tr><td>发动机</td><td>15× YF-215X</td></tr>
<tr><td>布置方式</td><td>中央 3 台(TVC ±15°,万向节自由摆动)+ 外围 12 台(矢量 ±3°)</td></tr>
<tr><td>单台推力</td><td>2,920.6 kN(海平面)</td></tr>
<tr><td>总推力</td><td>43,809 kN</td></tr>
<tr><td>比冲</td><td>330 s(海平面)/ 351 s(真空)</td></tr>
<tr><td>推进剂</td><td>液态甲烷 + 液态氧</td></tr>
<tr><td>储箱容积</td><td>~2,392,274 L(中央贯穿 2.5 m 防晃燃料导管)</td></tr>
<tr><td>发动机总干质量</td><td>22.875 t</td></tr>
<tr><td>着陆腿展开包络</td><td>29.4 m</td></tr>
</tbody>
</table>
<p>储箱中央的 2.5 m 直径燃料导管贯穿全箱高度,兼作防晃结构。在回收谱段的轴向减速过载下,导管内始终维持稳定液柱,确保发动机燃料供应不因储箱内推进剂大幅晃动而中断。</p>
<h2 id="s2">二级</h2>
<p>二级是 CZ-16 与 CZ-16A 的核心差异所在。CZ-16 二级箭体高 24.1 m(不含整流罩),配备 20 m 整流罩时总高 42.5 m,采用 7.5 m 直径燃料箱。安装 2 台 YF-215X Vac 真空优化型发动机。YF-215X 全系列发动机均具备飞行中多次点火能力,无需额外的重复点火部件——二级可在入轨后持续滑行数小时再点燃,或在轨道面修正后重新启动注入目标轨道。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>24.1 m(不含整流罩)/ 42.5 m(含 20 m 整流罩)</td></tr>
<tr><td>直径</td><td>7.5 m</td></tr>
<tr><td>发动机</td><td>2× YF-215X Vac</td></tr>
<tr><td>单台推力</td><td>2,800 kN(真空)</td></tr>
<tr><td>总推力</td><td>5,600 kN</td></tr>
<tr><td>比冲</td><td>380 s(真空)/ 280 s(海平面)</td></tr>
<tr><td>推进剂</td><td>液态甲烷 + 液态氧</td></tr>
<tr><td>储箱容积</td><td>~1,104,466 L(气球型低温储箱)</td></tr>
<tr><td>RCS</td><td>8 组(32 喷口),肼燃料</td></tr>
<tr><td>在轨能力</td><td>长时间待机,多次点火</td></tr>
</tbody>
</table>
<h2 id="recovery">一级回收系统</h2>
<p>CZ-16 一级回收系统与 CZ-16A 完全一致,支持<b>返场回收(RTLS</b><b>航区回收</b>两种模式。</p>
<h3>返场回收(RTLS</h3>
<ol>
<li><b>分离与调头</b>:一二级分离后,一级立即启动 RCS 翻转。5 秒后中央 3 台 YF-215X 重新点火辅助调头,缩短转向时间。</li>
<li><b>返场点火</b>:姿态稳定后,外围 6 台同步点火,中央 3 台 + 外围 6 台合计 9 台执行返场点火,全程节流控制过载 ≤10G。</li>
<li><b>再入制动</b>:再次进入大气层前,同样的 9 台 YF-215X 执行再入制动,过载 ≤10G。</li>
<li><b>气动滑行</b>:再入制动完成后,4 片钛合金栅格翼(120°-60°-120°-60° 非对称布局,单片 960 kg,含制动器)进行气动减速和升力飞行,将落点逐步引导至回收区。</li>
<li><b>着陆点火</b>:中央 3 台 YF-215X 着陆点火,建立推力后关闭 1 台(发动机失效冗余),4 条着陆腿展开,垂直软着陆。</li>
</ol>
<h3>航区回收</h3>
<p>分离后一级不执行返场点火。RCS 根据回收驳船位置进行落点修正,仅保留再入制动和着陆点火,在海上回收驳船垂直着陆。航区回收模式下节省了返场点火的推进剂消耗,换取更高的有效载荷运力。</p>
<h3>安全设计</h3>
<p>再入制动完成后,一级的弹道自然落点距回收设施至少 3 km。气动滑行段借助栅格翼升力将实际落点修正至回收区。若 RCS 或发动机异常,箭体将无害坠落在安全区内。</p>
<h2 id="performance">运载能力</h2>
<table>
<thead><tr><th>回收模式</th><th>LEO 运力</th></tr></thead>
<tbody>
<tr><td>返场回收(RTLS</td><td>135 t</td></tr>
<tr><td>航区回收(Downrange</td><td>155 t</td></tr>
</tbody>
</table>
<p>RTLS 模式下,一级需分配推进剂用于返场点火,运力略有下降(135 t);航区回收省略返场点火,一级将更多推进剂留给发射段,LEO 运力可达 155 t。航区回收的代价是回收驳船需要部署在距发射场数百至数千公里的海域,并承担海上回收的天气和海况风险。</p>
<p>对于超出 LEO 的高能量轨道任务,CZ-16 可搭配氢氧上面级。上面级由 CZ-16 送入 LEO 后独立点火,将有效载荷送入地月转移轨道、地球同步转移轨道或行星际转移轨道。</p>
<h2 id="comparison">与 CZ-16A 的定位差异</h2>
<p>CZ-16 与 CZ-16A 共享同一枚一级箭体,差异集中在二级配置和任务定位上:</p>
<table>
<thead><tr><th>参数</th><th>CZ-16</th><th><a href="/home/Launch_Vehicles/CZ-16A">CZ-16A</a></th></tr></thead>
<tbody>
<tr><td>二级发动机</td><td>2× YF-215X Vac</td><td>3× YF-215X Vac</td></tr>
<tr><td>LEO 运力(RTLS</td><td>135 t</td><td>受结构限制 ≤75 t</td></tr>
<tr><td>月球运力</td><td>需搭配上面级</td><td>65 t(独立 TLI</td></tr>
<tr><td>任务定位</td><td>LEO 大规模投送 / 搭配上面级的高能轨道</td><td>高能量轨道专项优化(月球及以远)</td></tr>
</tbody>
</table>
<p>CZ-16 的核心优势在于 LEO 运力——航区回收下 155 吨的投送能力使其成为近地轨道大规模部署的主力火箭。而 CZ-16A 以降低 LEO 载荷上限为代价(结构承重限制 75 吨),通过 3 台二级发动机换取独立将 65 吨载荷送入月球轨道的能力。两者的互补关系使长征十六号系列能够覆盖从近地大规模货运到深空载人探测的完整任务谱段。</p>
<h2 id="specs">技术参数</h2>
<table>
<thead><tr><th>参数</th><th>一级</th><th>二级</th></tr></thead>
<tbody>
<tr><td>发动机</td><td>15× YF-215X</td><td>2× YF-215X Vac</td></tr>
<tr><td>推进剂</td><td colspan="2">液态甲烷 + 液态氧</td></tr>
<tr><td>燃料箱直径</td><td colspan="2">7.5 m</td></tr>
<tr><td>总推力</td><td>43,809 kN</td><td>5,600 kN</td></tr>
<tr><td>比冲(真空)</td><td>351 s</td><td>380 s</td></tr>
<tr><td>储箱容积</td><td>~2,392,274 L</td><td>~1,104,466 L</td></tr>
<tr><td>RCS</td><td>热气推力器 4×15 kN(甲烷/液氧)</td><td>8 组 32 喷口,肼燃料</td></tr>
<tr><td>发动机布置</td><td>中央 3(TVC ±15°)+ 外围 12(矢量 ±3°)</td><td></td></tr>
<tr><td>栅格翼</td><td>4 片,120°-60°-120°-60° 非对称布局</td><td></td></tr>
<tr><td>回收能力</td><td>RTLS 或航区回收</td><td></td></tr>
</tbody>
</table>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/Launch_Vehicles/CZ-16A">CZ-16A 长征十六号甲</a> — 高能量轨道优化型号,一级与 CZ-16 通用</li>
<li><a href="/home/Spacecraft/Chang_E_Crewed_Exploration_Vehicle">嫦娥载人飞船</a> — CZ-16A 搭载的月球载人飞船</li>
<li><a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a> — CZ-16A 搭载的月面着陆器</li>
</ul>
</article>
+252
View File
@@ -0,0 +1,252 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { font-family: "Linux Libertine", Georgia, "Times New Roman", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 8px; font-size: 2.15em; line-height: 1.25; }
.wiki-article h2 { clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article h3 { margin: 1.05em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article h4 { margin: 0.9em 0 0.25em; font-size: 1.02em; font-weight: bold; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.35em 0 0.9em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.18em; }
.wiki-article .infobox { float: right; clear: right; width: 330px; margin: 0 0 18px 24px; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 88%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 8px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.12em; }
.wiki-article .infobox caption span { display: block; font-size: 0.92em; font-weight: normal; }
.wiki-article .infobox td { border: 1px solid #a2a9b1; padding: 6px 8px; vertical-align: top; }
.wiki-article .infobox-image { text-align: center; padding: 8px 10px !important; }
.wiki-article .infobox-image img { max-width: 100%; height: auto; }
.wiki-article .image-placeholder { min-height: 150px; border: 1px dashed #72777d; background: #eaecf0; color: #54595d; display: flex; align-items: center; justify-content: center; padding: 10px; text-align: center; box-sizing: border-box; }
.wiki-article .infobox .image-placeholder { min-height: 185px; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .thumbcaption { font-size: 0.88em; color: #202122; padding: 4px 3px 2px; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .toc { display: inline-block; min-width: 260px; margin: 0.45em 0 1.2em; padding: 8px 12px; border: 1px solid #a2a9b1; background: #f8f9fa; font-size: 92%; }
.wiki-article .toc-title { text-align: center; font-weight: bold; margin-bottom: 4px; }
.wiki-article .toc ol { margin: 0 0 0 1.5em; }
.wiki-article > table:not(.infobox) { width: 100%; margin: 1em 0; border-collapse: collapse; font-size: 92%; background: #fff; }
.wiki-article > table:not(.infobox) th, .wiki-article > table:not(.infobox) td { border: 1px solid #a2a9b1; padding: 6px 8px; text-align: left; vertical-align: top; }
.wiki-article > table:not(.infobox) th { background: #eaecf0; font-weight: bold; }
.wiki-article > table:not(.infobox) tr:nth-child(even) td { background: #f8f9fa; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .wiki-article .infobox { float: none; width: 100%; margin: 0.75em 0 1em; } .wiki-article .toc { display: block; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">长征十六号甲运载火箭</h1>
<table class="infobox">
<caption>CZ-16A<span>长征十六号甲 · 重型运载火箭</span></caption>
<tbody>
<tr><td class="infobox-image"><div class="image-placeholder">CZ-16A 全箭侧面图</div><div class="thumbcaption">CZ-16A 全箭构型示意</div></td></tr>
<tr><td><b>型号</b>: CZ-16A(长征十六号甲)</td></tr>
<tr><td><b>类型</b>: 重型运载火箭(一级可回收)</td></tr>
<tr><td><b>制造商</b>: [待补充]</td></tr>
<tr><td><b>全箭高度</b>: 125.4 m(嫦娥-吴刚组合体构型)</td></tr>
<tr><td><b>级数</b>: 2 + 逃逸塔</td></tr>
<tr><td><b>箭体直径</b>: 7.5 m(一级/二级)</td></tr>
<tr><td><b>整流罩直径</b>: 7.5 m(标配)/ 10 m、12 m(选装)</td></tr>
<tr><td><b>一级通用</b>: 与 <a href="/home/Launch_Vehicles/CZ-16">CZ-16</a> 共用</td></tr>
<tr><td><b>一级干重</b>: 135 t</td></tr>
<tr><td><b>一级燃料</b>: 2,128 t(最大)</td></tr>
<tr><td><b>起飞推重比</b>: 1.33</td></tr>
<tr><td><b>起飞推力</b>: 43,809 kN</td></tr>
<tr><td><b>一级发动机</b>: 15× YF-215X</td></tr>
<tr><td><b>二级发动机</b>: 3× YF-215X Vac</td></tr>
<tr><td><b>推进剂</b>: 液氧甲烷</td></tr>
<tr><td><b>一级回收</b>: 栅格翼气动减速 + 发动机反推垂直着陆</td></tr>
<tr><td><b>首飞</b>: [待补充]</td></tr>
<tr><td><b>状态</b>: [待补充]</td></tr>
</tbody>
</table>
<p><b>长征十六号甲</b><b>CZ-16A</b>)是一款重型运载火箭,为<a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a>的改进型号。CZ-16A 沿袭了 CZ-16 系列的一级垂直回收设计,主要改进集中在二级:燃料箱加长 6 m,容积相应增大,发动机数量由 2 台增至 3 台,显著提升了地月转移轨道(TLI)的运载能力。火箭采用两级串联构型,一级和二级燃料箱直径均为 7.5 m,发射嫦娥-吴刚组合体时全箭高度 125.4 m。一二级均使用 YF-215X 全流量补燃循环液氧甲烷发动机,其中二级使用真空优化型 YF-215X Vac。一级与 CZ-16 完全通用,两者共享相同的发动机、储箱、回收系统和航电架构。</p>
<nav class="toc" aria-label="Contents">
<div class="toc-title">目录</div>
<ol>
<li><a href="#design">总体设计</a></li>
<li><a href="#s1">一级</a></li>
<li><a href="#s2">二级</a></li>
<li><a href="#escape">发射逃逸系统</a></li>
<li><a href="#recovery">一级回收系统</a>
<ol>
<li><a href="#rec-rtls">返场回收(RTLS</a></li>
<li><a href="#rec-downrange">航区回收</a></li>
<li><a href="#rec-gridfin">栅格翼</a></li>
<li><a href="#rec-safety">落点安全</a></li>
<li><a href="#rec-landing">着陆点火</a></li>
</ol></li>
<li><a href="#profile">飞行剖面</a></li>
<li><a href="#specs">技术参数</a></li>
<li><a href="#seealso">参见</a></li>
</ol>
</nav>
<h2 id="design">总体设计</h2>
<p>CZ-16A 采用两级串联布局。一级和二级燃料箱直径均为 7.5 m,其中二级燃料箱较 CZ-16 加长 6 m,以容纳推进 TLI 所需的额外推进剂。全箭以液氧甲烷为统一推进剂。甲烷燃料燃烧清洁、不易积碳,有利于发动机在多次复用中保持性能稳定,也便于未来在轨推进剂长期储存。一级与 CZ-16 完全通用——两者可以互换使用同一枚一级箭体,仅二级根据任务需求选择 2 台(CZ-16)或 3 台(CZ-16A)发动机的构型。</p>
<h3>动力布局</h3>
<p>一级安装 15 台 YF-215X 全流量补燃循环液氧甲烷发动机,单台海平面推力 2,920.6 kN,起飞总推力 43,809 kN。15 台发动机以中央 3 台 + 外围 12 台的方式布置:中央 3 台通过万向节自由摆动,推力矢量控制(TVC)范围为 ±15°,提供全箭的主姿态控制能力;外围 12 台固定安装,矢量范围 ±3°,提供辅助控制。二级安装 3 台 YF-215X Vac——YF-215X 的真空优化型号,单台真空推力 2,800 kN,二级总推力 8,400 kN,负责完成入轨和 TLI 注入。</p>
<h3>推进剂体系</h3>
<p>一级主储箱容积约 2,392,274 L;二级主储箱容积约 1,104,466 L,采用气球型低温储箱以实现 100% 容积利用率。全箭使用液氧甲烷(液态甲烷 + 液态氧)统一推进剂方案。</p>
<p>一级储箱中央贯穿一根直径 2.5 m 的加粗燃料导管,自储箱顶部延伸至发动机舱。该导管在储箱内部起到防晃隔板的作用——回收谱段中箭体经历大幅度姿态变化和轴向减速过载,常规储箱内的推进剂晃动可能导致燃料供应中断。中央导管的粗直径使其内部始终保持充足的液柱高度,确保发动机在返场、再入制动和着陆点火阶段均能获得稳定的燃料供应,无需另行设置独立的回收专用储箱。</p>
<h3>整流罩</h3>
<p>CZ-16A 采用展开式整流罩,由 4 片花瓣面板组成。TLI 注入完成后,整流罩解锁展开并锁定于开放位置,而非传统抛离。此设计避免了抛离碎片与有效载荷碰撞的风险,并使有效载荷(飞船和着陆器)可在整流罩展开后直接从桁架上取出。</p>
<h2 id="s1">一级</h2>
<p>一级为可回收复用助推级,与 CZ-16 完全通用。箭体高 67.5 m,直径 7.5 m,干重 135 t,最大可装载 2,128 t 液氧甲烷燃料。15 台 YF-215X 发动机的单台海平面推力 2,920.6 kN,比冲 330 s(海平面)/ 351 s(真空)。起飞推重比 1.33。YF-215X 全系列发动机均具备飞行中多次点火能力,无需额外的重复点火部件。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>67.5 m</td></tr>
<tr><td>直径</td><td>7.5 m</td></tr>
<tr><td>干重</td><td>135 t</td></tr>
<tr><td>最大燃料</td><td>2,128 t</td></tr>
<tr><td>发动机</td><td>15× YF-215X</td></tr>
<tr><td>布置方式</td><td>中央 3 台(TVC ±15°,万向节自由摆动)+ 外围 12 台(矢量 ±3°)</td></tr>
<tr><td>单台推力</td><td>2,920.6 kN(海平面)</td></tr>
<tr><td>总推力</td><td>43,809 kN</td></tr>
<tr><td>比冲</td><td>330 s(海平面)/ 351 s(真空)</td></tr>
<tr><td>推进剂</td><td>液态甲烷 + 液态氧</td></tr>
<tr><td>推进剂配比</td><td>甲烷 41.37% + 液氧 58.63%</td></tr>
<tr><td>储箱容积</td><td>~2,392,274 L(中央贯穿 2.5 m 防晃燃料导管)</td></tr>
<tr><td>发动机总干质量</td><td>22.875 t</td></tr>
<tr><td>着陆腿展开包络</td><td>29.4 m</td></tr>
</tbody>
</table>
<p>储箱中央的 2.5 m 直径燃料导管贯穿全箱高度,在回收谱段的轴向减速过载下始终保持稳定液柱,确保发动机燃料供应不因储箱内推进剂大幅晃动而中断。</p>
<h2 id="s2">二级</h2>
<p>二级是 CZ-16A 区别于 CZ-16 的核心区段:燃料箱较 CZ-16 加长 6 m,箭体高 30.1 m(不含整流罩),容积相应增大,发动机由 CZ-16 的 2 台增至 3 台。采用与一级相同的 7.5 m 直径燃料箱,配备 3 台 YF-215X Vac 真空优化型发动机。YF-215X 全系列发动机均具备飞行中多次点火能力——二级可在入轨后待机滑行,然后在适当时机重新启动注入目标轨道。</p>
<table>
<thead><tr><th>参数</th><th>数值</th></tr></thead>
<tbody>
<tr><td>高度</td><td>30.1 m(不含整流罩)</td></tr>
<tr><td>直径</td><td>7.5 m</td></tr>
<tr><td>发动机</td><td>3× YF-215X Vac</td></tr>
<tr><td>单台推力</td><td>2,800 kN(真空)</td></tr>
<tr><td>总推力</td><td>8,400 kN</td></tr>
<tr><td>比冲</td><td>380 s(真空)/ 280 s(海平面)</td></tr>
<tr><td>推进剂</td><td>液态甲烷 + 液态氧</td></tr>
<tr><td>推进剂配比</td><td>甲烷 41.37% + 液氧 58.63%</td></tr>
<tr><td>储箱容积</td><td>~1,104,466 L(气球型低温储箱)</td></tr>
<tr><td>RCS</td><td>8 组(32 喷口),肼燃料</td></tr>
</tbody>
</table>
<p>3 台 YF-215X Vac 的配置使 CZ-16A 的 TLI 运载能力显著优于 CZ-16,能够将嫦娥飞船与吴刚着陆器的组合体送入地月转移轨道。</p>
<h2 id="escape">发射逃逸系统</h2>
<p>发射逃逸系统随有效载荷搭载,安装于飞船返回舱顶部,总质量 6 吨,由分离发动机和主逃逸发动机两部分组成。分离发动机仅用于正常飞行中将逃逸塔从火箭上分离抛弃;主逃逸发动机用于紧急逃逸——若发射段二级发动机点火前出现异常,主逃逸发动机可随时点火将返回舱从故障火箭上拖离。</p>
<p>逃逸塔的分离时机为二级发动机建立稳定推力之后。此时火箭已飞离大气稠密段且二级工作正常,不再需要逃逸保护。</p>
<h2 id="recovery">一级回收系统</h2>
<p>CZ-16A 一级继承了 CZ-16 的完整垂直回收能力,回收模式分为<b>返场回收(RTLS</b><b>航区回收</b>两种,根据任务对运载能力的需求灵活选择。</p>
<h3 id="rec-rtls">返场回收(RTLS</h3>
<p>返场回收模式下,一级分离后返回发射场附近的陆地回收区。流程如下:</p>
<ol>
<li><b>分离与调头</b>:一二级分离后,一级立即启动 RCS 进行姿态翻转,5 秒后中央 3 台 YF-215X 重新点火辅助调头,缩短转向时间。</li>
<li><b>返场点火</b>:姿态稳定后,外围 6 台 YF-215X 同步点火,与中央 3 台合计 9 台发动机执行返场点火(Boostback Burn),将一级的飞行方向从远离发射场翻转为返回发射场。全程节流控制,确保过载不超过 10G。</li>
<li><b>再入制动</b>:一级再次进入大气层前,同样的 9 台 YF-215X 执行再入制动点火(Entry Burn),将速度降低至栅格翼和箭体结构可承受的范围,同样控制过载 ≤10G。</li>
<li><b>气动滑行</b>:再入点火完成后,一级以栅格翼进行气动减速和升力飞行。通过攻角控制,一级可将弹道落点从远离回收区的自然弹道点逐步引导至回收场。</li>
<li><b>着陆点火</b>:接近地面时执行着陆减速(见下方着陆点火章节)。</li>
</ol>
<h3 id="rec-downrange">航区回收</h3>
<p>当任务对运载能力要求较高、返场回收的推进剂预算不足时,采用航区回收模式。一级不在分离后翻转返回,而是沿发射方向继续飞行,在海上回收驳船降落:</p>
<ol>
<li><b>分离与姿态调整</b>:一二级分离后,一级使用 RCS 逐步调整姿态,根据回收驳船的实时位置进行落点修正,省略返场点火。</li>
<li><b>再入制动</b>:与返场回收相同,中央 3 台 + 外围 6 台 YF-215X 执行再入制动,过载 ≤10G。</li>
<li><b>海上着陆</b>:气动减速后,中央 3 台 YF-215X 执行着陆点火,在回收驳船上垂直软着陆。</li>
</ol>
<h3 id="rec-gridfin">栅格翼</h3>
<p>一级安装 4 片钛合金栅格翼,每片质量 960 kg(含制动器)。与常见的 90° 等间隔布局不同,CZ-16A/CZ-16 的栅格翼采用<b>120°-60°-120°-60°</b>的非对称间隔布置。此布局允许一级在气动滑行段以更大攻角飞行,从而产生更大的升力,提升横向机动能力和减速效率,有效降低了对反推推进剂的消耗。</p>
<h3 id="rec-safety">落点安全设计</h3>
<p>再入制动点火完成后,一级的弹道自然落点被设计在距离回收设施(陆地回收场或海上驳船)<b>至少 3 km</b>以外的位置。这是一项主动安全措施:在再入点火后的气动滑行段,一级借助栅格翼产生的升力逐步将实际落点从自然弹道点修正至回收区。若在此过程中 RCS 姿态控制失效或发动机点火异常,箭体将无害地坠落在远离回收设施的预定安全区内,而不会危及地面人员或设备。</p>
<h3 id="rec-landing">着陆点火</h3>
<p>无论返场回收还是航区回收,最后的着陆点火策略一致:中央 3 台 YF-215X 重新点火执行减速。建立推力后,关闭其中 1 台发动机,仅保留 2 台工作至着陆完成。此设计提供发动机失效冗余——若 3 台中任意 1 台在着陆段出现故障,其余 2 台仍可完成安全着陆。4 条展开式着陆腿(每条约 0.55 吨)在着陆前展开,吸收最终着陆冲击。</p>
<h2 id="profile">飞行剖面</h2>
<h3>发射段</h3>
<table>
<thead><tr><th>时序</th><th>事件</th><th>触发条件</th></tr></thead>
<tbody>
<tr><td>T3 s</td><td>一级 15 台 YF-215X 点火</td><td>手动</td></tr>
<tr><td>T+0 s</td><td>6 组发射卡钳释放,火箭离台</td><td>级间指令</td></tr>
<tr><td>T+55 s</td><td>一级节流,渡过最大动压区(Max-Q</td><td>飞行程序</td></tr>
<tr><td>T+75 s</td><td>一级恢复最大推力</td><td>飞行程序</td></tr>
<tr><td>T+2 min 35 s</td><td>一级主发动机关机(MECO</td><td>级间指令</td></tr>
<tr><td>T+2 min 37 s</td><td>一二级分离(分离固体火箭点火)</td><td>级间指令</td></tr>
<tr><td>T+2 min 42 s</td><td>二级 3 台 YF-215X Vac 点火</td><td>级间指令</td></tr>
<tr><td>二级推力稳定后</td><td>发射逃逸塔分离抛弃</td><td>二级推力确认</td></tr>
</tbody>
</table>
<h3>在轨段</h3>
<table>
<thead><tr><th>阶段</th><th>事件</th></tr></thead>
<tbody>
<tr><td>近地轨道(LEO</td><td>二级完成入轨,滑行准备 TLI</td></tr>
<tr><td>地月转移轨道(TLI</td><td>二级再次点火,注入 TLI</td></tr>
<tr><td>TLI 完成后</td><td>展开式整流罩解锁展开,暴露有效载荷</td></tr>
</tbody>
</table>
<h3>一级回收段(返场回收)</h3>
<table>
<thead><tr><th>阶段</th><th>事件</th></tr></thead>
<tbody>
<tr><td>分离后</td><td>RCS 翻转 + 5 s 后中央 3 台 YF-215X 辅助调头</td></tr>
<tr><td>返场点火</td><td>中央 3 + 外围 6 台 YF-215X 返场点火,节流控制过载≤10G</td></tr>
<tr><td>再入制动</td><td>中央 3 + 外围 6 台 YF-215X 再入制动,过载≤10G</td></tr>
<tr><td>气动滑行</td><td>栅格翼(120°-60° 布局)升力飞行,落点修正至回收区</td></tr>
<tr><td>着陆</td><td>中央 3 台 YF-215X 着陆点火,建立推力后关 1 台,4 腿展开,垂直软着陆</td></tr>
</tbody>
</table>
<h2 id="specs">技术参数</h2>
<table>
<thead><tr><th>参数</th><th>一级</th><th>二级</th></tr></thead>
<tbody>
<tr><td>发动机</td><td>15× YF-215X</td><td>3× YF-215X Vac</td></tr>
<tr><td>推进剂</td><td colspan="2">液态甲烷 + 液态氧</td></tr>
<tr><td>燃料箱直径</td><td colspan="2">7.5 m</td></tr>
<tr><td>总推力</td><td>43,809 kN</td><td>8,400 kN</td></tr>
<tr><td>比冲(真空)</td><td>351 s</td><td>380 s</td></tr>
<tr><td>储箱容积</td><td>~2,392,274 L</td><td>~1,104,466 L</td></tr>
<tr><td>RCS</td><td>热气推力器 4×15 kN(甲烷/液氧)</td><td>8 组 32 喷口,肼燃料</td></tr>
<tr><td>发动机布置</td><td>中央 3(TVC ±15°)+ 外围 12(矢量 ±3°)</td><td></td></tr>
<tr><td>栅格翼</td><td>4 片,120°-60°-120°-60° 非对称布局</td><td></td></tr>
<tr><td>回收能力</td><td>返场回收(RTLS)或航区回收</td><td></td></tr>
</tbody>
</table>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a> — 基础型号,一级与 CZ-16A 通用</li>
<li><a href="/home/Spacecraft/Chang_E_Crewed_Exploration_Vehicle">嫦娥载人飞船</a> — CZ-16A 搭载的月球载人飞船</li>
<li><a href="/home/Spacecraft/Wugang_Lunar_Lander">吴刚月面着陆器</a> — CZ-16A 搭载的月面着陆器</li>
</ul>
</article>
+197
View File
@@ -0,0 +1,197 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; margin: 0 0 8px; font-size: 2.15em; }
.wiki-article h2 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .media-link { display: block; color: inherit; text-decoration: none; }
.wiki-article .thumb { width: 265px; border: 1px solid #c8ccd1; background: #f8f9fa; padding: 3px; font-size: 88%; line-height: 1.4; box-sizing: border-box; }
.wiki-article .tright { float: right; clear: right; margin: 0.35em 0 1em 1.4em; }
.wiki-article .tleft { float: left; clear: left; margin: 0.35em 1.4em 1em 0; }
.wiki-article .thumbcaption { padding: 4px 3px 2px; text-align: left; color: #202122; }
.wiki-article .gallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; margin: 1em 0; }
.wiki-article .gallery-item { border: 1px solid #c8ccd1; background: #f8f9fa; padding: 4px; font-size: 88%; line-height: 1.4; }
.wiki-article .gallery-item img { display: block; width: 100%; cursor: zoom-in; }
.wiki-article .gallery-item .thumbcaption { padding: 4px 2px 2px; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .gallery-grid { grid-template-columns: 1fr; } }
/* mission-gallery-enhancements:start */
.wiki-article .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
align-items: stretch;
}
.wiki-article .gallery-item {
display: grid;
grid-template-rows: auto 1fr;
overflow: hidden;
content-visibility: auto;
contain-intrinsic-size: 340px 300px;
}
.wiki-article .gallery-item img[data-wiki-asset] {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: contain;
background: #202122;
cursor: zoom-in;
}
.wiki-article .gallery-item .thumbcaption {
padding: 8px 7px 7px;
}
.wiki-article .gallery-notice {
margin: 1em 0 1.25em;
padding: 10px 12px;
border-left: 4px solid #36c;
background: #f1f4fd;
color: #202122;
}
.wiki-article .image-placeholder {
position: relative;
border: 1px dashed #72777d;
background: linear-gradient(135deg, #f8f9fa, #eaecf0);
color: #54595d;
}
.wiki-article.gallery-planning .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr));
gap: 12px;
}
.wiki-article.gallery-planning .gallery-item {
display: block;
content-visibility: visible;
contain-intrinsic-size: none;
border-color: #a2a9b1;
background: #fff;
box-shadow: 0 1px 2px rgba(32, 33, 34, 0.08);
}
.wiki-article.gallery-planning .image-placeholder {
min-height: 0 !important;
display: block;
padding: 14px 14px 12px;
border: 0;
border-left: 4px solid #72777d;
background: #f8f9fa;
color: #202122;
text-align: left;
font-size: 13px;
font-weight: 600;
line-height: 1.65;
}
.wiki-article.gallery-planning .gallery-item .thumbcaption {
padding: 10px 14px 12px;
border-top: 1px solid #eaecf0;
color: #54595d;
}
.wiki-article.gallery-planning > .image-placeholder {
min-height: 0;
padding: 22px 18px;
border-left: 4px solid #72777d;
}
.wiki-image-lightbox {
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(32, 33, 34, 0.88);
z-index: 10000;
box-sizing: border-box;
}
.wiki-image-lightbox[hidden] { display: none; }
.wiki-image-lightbox-panel {
position: relative;
display: grid;
grid-template-columns: 44px minmax(0, 1fr) 44px;
grid-template-areas: "close close close" "prev image next" "counter caption caption";
gap: 8px;
width: min(1320px, 96vw);
max-height: 94vh;
overflow: auto;
margin: 0;
padding: 10px;
border: 1px solid #a2a9b1;
background: #fff;
box-shadow: 0 12px 38px rgba(0, 0, 0, 0.35);
box-sizing: border-box;
}
.wiki-image-lightbox-panel > img {
grid-area: image;
width: 100%;
height: min(78vh, 900px);
object-fit: contain;
background: #000;
}
.wiki-image-lightbox-close {
grid-area: close;
justify-self: end;
position: static;
float: none;
width: 34px;
height: 34px;
margin: 0;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 22px;
line-height: 30px;
cursor: pointer;
}
.wiki-image-lightbox-close:hover,
.wiki-image-lightbox-close:focus { background: #fff; }
.wiki-image-lightbox-prev { grid-area: prev; }
.wiki-image-lightbox-next { grid-area: next; }
.wiki-image-lightbox-nav {
align-self: center;
width: 40px;
height: 56px;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 26px;
cursor: pointer;
}
.wiki-image-lightbox-nav:hover,
.wiki-image-lightbox-nav:focus { background: #fff; }
.wiki-image-lightbox-counter { grid-area: counter; color: #54595d; white-space: nowrap; }
.wiki-image-lightbox-panel .thumbcaption { grid-area: caption; padding: 0 4px 3px; }
body.wiki-image-lightbox-open { overflow: hidden; }
@media (max-width: 820px) {
.wiki-article .gallery-grid { grid-template-columns: 1fr; }
.wiki-image-lightbox-panel {
grid-template-columns: 36px minmax(0, 1fr) 36px;
width: 98vw;
}
.wiki-image-lightbox-panel > img { height: 70vh; }
.wiki-image-lightbox-nav { width: 34px; height: 48px; }
}
/* mission-gallery-enhancements:end */
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮部署任务-01 任务图集</h1>
<p style="margin-bottom:1.5em;"><a href="/home/mission/Guanghan_Program/BL-01">← 返回任务页</a> 共 3 张影像</p>
<p style="margin-bottom:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-02/Gallery">BL-02 图集 →</a></p>
<p>冰轮部署任务-01 是广寒计划的开篇——将首座全自动氢氧燃料工厂送上月面。以下影像记录了冰轮一号从长征十六号运载火箭释放到月面着陆、直至 ISRU 模块投入运行的全过程。</p>
<h2>地月转移</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-01/binglun_isru_tli.png" alt="冰轮ISRU TLI点火" data-wiki-asset="/guanghan-bl-01/binglun_isru_tli.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">长征十六号运载火箭二级执行 TLI 点火,将冰轮一号送入地月转移轨道。冰轮一号此时仍由转移级承载,4 天后将抵达月球。</div></div>
</div>
<h2>月面着陆</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-01/binglun_isru_landing.png" alt="冰轮ISRU月面着陆" data-wiki-asset="/guanghan-bl-01/binglun_isru_landing.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">2024 年 4 月 19 日 22:58,冰轮一号动力下降着陆于月球东方海。着陆腿展开吸收冲击,发动机羽流在月面扬起浅色月尘。东方海盆地的暗色玄武岩地表在远处延伸至地平线。</div></div>
</div>
<h2>ISRU 运行</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-01/binglun_isru_working.png" alt="冰轮ISRU工作中" data-wiki-asset="/guanghan-bl-01/binglun_isru_working.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">着陆后数小时,冰轮一号展开太阳能电池板(25 kW 峰值功率),自动化采矿机构开始采集月壤水冰原料。ISRU 模块以日产 3 吨氢氧燃料的速率持续生产,直至 5 月 1 日月夜降临进入休眠。画面中太阳能电池板后方可隐约看出 ISRU 模块的散热格栅。</div></div>
</div>
<p style="margin-top:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-02/Gallery">BL-02 图集 →</a></p>
<p style="margin-top:1.5em;"><a href="/home/mission/Guanghan_Program/BL-01">← 返回任务页</a></p>
+240
View File
@@ -0,0 +1,240 @@
<style>
body:has(.wiki-article) .page-header-section { display: none !important; }
@media (min-width: 1264px) {
body:has(.wiki-article) .page-col-sd { top: 118px !important; }
}
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 15px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { color: #202122 !important; font-family: "Linux Libertine", Georgia, "Noto Serif SC", "Songti SC", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 0.35em !important; font-size: 2em; line-height: 1.3; }
.wiki-article h2 { clear: none; overflow: hidden; margin: 1em 0 0.45em; padding-bottom: 0.12em; font-size: 1.5em; line-height: 1.35; }
.wiki-article h3 { margin: 1.1em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article p { margin: 0.5em 0 1em; }
.wiki-article .infobox-overlap-section { min-width: 0; overflow: hidden; }
.wiki-article .infobox-overlap-section .wikitable { table-layout: fixed; overflow-wrap: anywhere; }
.wiki-article a { color: #36c; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.4em 0 1em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.25em; }
.wiki-article table.infobox { float: right; clear: right; width: 360px; margin: 0 0 24px 48px !important; border: 1px solid #a2a9b1 !important; border-collapse: separate !important; border-spacing: 0 !important; table-layout: fixed; background: #f8f9fa; font-size: 84%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 9px 12px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.15em; line-height: 1.35; }
.wiki-article .infobox caption span { display: block; margin-top: 3px; color: #54595d; font-size: 0.86em; font-weight: normal; }
.wiki-article .infobox th, .wiki-article .infobox td { border: 0 !important; box-shadow: none !important; vertical-align: top; }
.wiki-article table.infobox th.infobox-label { width: 31%; padding: 7px 5px 7px 11px !important; background: #f8f9fa !important; box-shadow: inset 0 1px 0 #eaecf0 !important; color: #54595d; text-align: left; font-weight: 600; white-space: nowrap; }
.wiki-article table.infobox td.infobox-data { width: 69%; padding: 7px 11px 7px 7px !important; background: #f8f9fa !important; box-shadow: inset 0 1px 0 #eaecf0 !important; color: #202122; }
.wiki-article .infobox-section th { padding: 6px 9px !important; border-top: 1px solid #a2a9b1 !important; border-bottom: 1px solid #a2a9b1 !important; background: #eaecf0 !important; color: #202122; text-align: center; font-weight: bold; }
.wiki-article .infobox-image { padding: 8px 10px 5px !important; border: 0 !important; background: #f8f9fa !important; text-align: center; }
.wiki-article .infobox-image img { display: block; width: 100%; height: auto; cursor: pointer; }
.wiki-article .thumbcaption { padding: 4px 3px 2px; color: #202122; font-size: 0.88em; line-height: 1.4; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .wikitable { width: 100%; margin: 1em 0; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 90%; }
.wiki-article .wikitable th, .wiki-article .wikitable td { padding: 6px 8px; border: 1px solid #a2a9b1; text-align: left; vertical-align: top; }
.wiki-article .wikitable th { background: #eaecf0; font-weight: bold; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (min-width: 601px) and (max-width: 820px) { .wiki-article .wikitable { display: block; overflow-x: auto; white-space: nowrap; } }
@media (max-width: 600px) {
.wiki-article { padding: 18px 14px 36px; font-size: 14px; }
.wiki-article h1 { font-size: 1.8em; }
.wiki-article table.infobox { float: none; width: 100%; margin: 0.75em 0 1em !important; }
.wiki-article .wikitable { display: block; overflow-x: auto; white-space: nowrap; }
}
.wiki-article img[data-wiki-asset] { cursor: zoom-in; }
.wiki-image-lightbox { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(32,33,34,0.84); z-index: 10000; box-sizing: border-box; }
.wiki-image-lightbox[hidden] { display: none; }
.wiki-image-lightbox-panel { position: relative; width: min(1120px, 96vw); max-height: 92vh; overflow: auto; margin: 0; padding: 10px; border: 1px solid #a2a9b1; background: #fff; box-shadow: 0 12px 38px rgba(0,0,0,0.35); box-sizing: border-box; }
.wiki-image-lightbox-panel img { display: block; width: 100%; height: auto; max-height: 82vh; object-fit: contain; background: #000; }
.wiki-image-lightbox-close { position: sticky; top: 0; float: right; width: 30px; height: 30px; margin: -2px -2px 8px 10px; border: 1px solid #a2a9b1; background: #eaecf0; color: #202122; font-weight: bold; line-height: 26px; cursor: pointer; }
.wiki-image-lightbox-close:hover, .wiki-image-lightbox-close:focus { background: #fff; }
body.wiki-image-lightbox-open { overflow: hidden; }
@media (max-width: 820px) { .wiki-image-lightbox { padding: 12px; } .wiki-image-lightbox-panel { width: 98vw; max-height: 94vh; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮部署任务-01</h1>
<table class="infobox">
<caption>BL-01<span>广寒计划 · 冰轮 ISRU 首航</span></caption>
<tbody>
<tr><td class="infobox-image" colspan="2"><img src="/guanghan-bl-01/binglun_isru_landing.png" data-wiki-asset="/guanghan-bl-01/binglun_isru_landing.png" alt="冰轮一号月面着陆"><div class="thumbcaption">冰轮一号着陆于月球东方海</div></td></tr>
<tr class="infobox-section"><th colspan="2">任务概况</th></tr>
<tr><th class="infobox-label" scope="row">任务编号</th><td class="infobox-data">BL-01</td></tr>
<tr><th class="infobox-label" scope="row">所属计划</th><td class="infobox-data"><a href="/home/mission/Guanghan_Program">广寒计划</a></td></tr>
<tr><th class="infobox-label" scope="row">任务目标</th><td class="infobox-data">首艘冰轮着陆东方海,启动 ISRU 燃料生产</td></tr>
<tr><th class="infobox-label" scope="row">任务状态</th><td class="infobox-data">✅ 成功</td></tr>
<tr class="infobox-section"><th colspan="2">发射与着陆</th></tr>
<tr><th class="infobox-label" scope="row">发射日期</th><td class="infobox-data">2024-04-15</td></tr>
<tr><th class="infobox-label" scope="row">运载火箭</th><td class="infobox-data"><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a></td></tr>
<tr><th class="infobox-label" scope="row">载荷</th><td class="infobox-data"><a href="/home/Spacecraft/Binglun_Lander">冰轮一号</a>ISRU 型)</td></tr>
<tr><th class="infobox-label" scope="row">着陆日期</th><td class="infobox-data">2024-04-19</td></tr>
<tr><th class="infobox-label" scope="row">着陆点</th><td class="infobox-data">月球东方海</td></tr>
<tr class="infobox-section"><th colspan="2">任务导航</th></tr>
<tr><th class="infobox-label" scope="row">任务导航</th><td class="infobox-data"><a href="/home/mission/Guanghan_Program/BL-02">BL-02</a></td></tr>
</tbody>
</table>
<p><b>冰轮部署任务-01</b>是广寒计划的<b>首次发射</b>,也是整个计划中最重要的基石任务。2024 年 4 月 15 日,<a href="/home/Launch_Vehicles/CZ-16">长征十六号运载火箭</a>将首艘<a href="/home/Spacecraft/Binglun_Lander">冰轮着陆器</a>(ISRU 构型)送上月球东方海——在任何人造结构或宇航员抵达之前,先把一座全自动氢氧燃料工厂部署到位。冰轮一号搭载的 12 吨 ISRU 模块在着陆后 9 小时内启动,以日产 3 吨的速率持续生产液氢液氧,为后续所有月面任务提供燃料基础。</p>
<p>这一任务的逻辑前提简单而深远:如果每一次登月任务都需要从地球携带全部推进剂,月面基地的运营成本将不可持续。月面 ISRU 的成功与否,决定了广寒计划是可持续的物流循环体系,还是一次性的"插旗式"登月。冰轮部署任务-01 用一座 12 吨重的 ISRU 模块回答了这个问题——在 <a href="/home/mission/Guanghan_Program/GHC-02">广寒基地建设任务-02</a> 乘组抵达之前,冰轮一号已累计生产超过 80 吨氢氧燃料。</p>
<section class="infobox-overlap-section" aria-labelledby="background">
<h2 id="background">任务背景</h2>
<p>广寒计划的核心前提是月面 ISRU——在月球当地生产氢氧燃料,反哺地月运输系统。如果每一次登月任务都需要从地球携带全部推进剂,月面基地的运营成本将不可持续。冰轮部署任务-01 是整个广寒计划的基石任务:在任何人造结构或宇航员抵达之前,先把一座全自动燃料工厂送到月面。</p>
<p>冰轮一号选装的 ISRU 载荷重 12 吨,包含三个核心子系统:氢氧燃料生产模块(从月壤水冰中电解提取氢和氧)、自动化采矿机构(采集原料),以及配套的散热系统。在月昼期间,冰轮一号以 3 吨/天的速率持续生产氢氧燃料;月夜降临时,电池维持最低温控,系统休眠等待日出。</p>
<p>着陆点东方海位于月球风暴洋最西缘的泰勒环形山附近,是月球上最重要的大型撞击盆地构造之一。选址此处基于前期遥感数据的评估——该区域极地水冰沉积较为丰富,且地势平坦适合着陆和后续建设。</p>
<p>冰轮部署任务-01 的成功意味着广寒计划拥有了第一个月面燃料来源。后续每一艘抵达月面的飞船——冰轮二号、广寒核心舱、吴刚着陆器——都将依赖于这座无人燃料工厂的持续产出。</p>
</section>
<h2 id="details">任务详情</h2>
<h3>发射与月面着陆(4 月 15 日至 19 日)</h3>
<p>2024 年 4 月 15 日,<a href="/home/Launch_Vehicles/CZ-16">长征十六号运载火箭</a>搭载<a href="/home/Spacecraft/Binglun_Lander">冰轮一号</a>(ISRU 构型)从文昌发射场发射升空。这是广寒计划的首次发射,一级在完成任务后于海上驳船成功回收。经过约 4 天的地月转移飞行,冰轮一号于 4 月 19 日执行近月制动,进入 100×100 km 绕月轨道(LLO)。同日 22 时 58 分,冰轮一号在 Hecate 液氧液氢发动机的动力下降下成功着陆于月球东方海——在任何人造结构或宇航员抵达之前,广寒计划的第一件硬件已就位。</p>
<h3>ISRU 部署与燃料生产启动(4 月 20 日)</h3>
<p>着陆后次日凌晨 01 时 01 分,冰轮一号展开折叠式太阳能电池板,稳定输出功率 25 kW。太阳能电池板部署完成后,冰轮一号航电系统进入全功能运行模式。上午 08 时 25 分,自动化采矿机构从着陆器两侧展开——两台六轮独立驱动采矿车沿导轨滑出,钻探臂和月壤输送带就位。ISRU 模块的固态氧化物电解堆开始预热,进料系统启动首批月壤样本的处理。在着陆后不到 10 小时,广寒计划的月面燃料生产正式启动。</p>
<h3>ISRU 技术系统</h3>
<p>冰轮一号搭载的 ISRU 模块(质量 12 吨)是广寒计划中技术密度最高的单体载荷,设计目标为在无人工干预条件下连续运行至少 6 个月。系统由三个核心子系统组成:</p>
<ul>
<li><b>氢氧燃料生产模块</b>:通过固态氧化物电解(SOE)技术,在约 800°C 高温下将月壤水冰中的水分子电解为氢气和氧气。与传统低温电解(PEM)相比,SOE 的效率高出约 15%,且对原料水纯度要求较低——月壤中的杂质水冰无需精炼即可直接进入电解流程。产出气体经低温液化后分别储存在冰轮着陆器的内置液氢和液氧储箱中。</li>
<li><b>自动化采矿机构</b>:由两台六轮独立驱动的采矿车组成,每台配备钻探臂和月壤输送带。采矿车从着陆器两侧展开,采掘半径约 150 m,采集的含冰月壤经破碎、筛分后由输送带传送至生产模块的进料口。采矿车由冰轮着陆器通过脐带电缆供电,单台功耗约 4 kW。</li>
<li><b>散热系统</b>:SOE 电解高温段和液化段的余热通过大面积折叠式散热器排放至空间。散热器阵列部署在着陆器背阴侧(北侧),以避免月昼直射阳光对散热效率的影响。散热面积为 42 m²,在月昼正午 120°C 环境温度下仍能将系统内部热端维持在 60°C 以下。</li>
</ul>
<p>ISRU 系统的日产速率 3 吨/天是基于东方海区域月壤水冰含量(经遥感估算约 5.6±1.2 wt%)和采矿车采集速率(~120 kg/h)的设计值。在实际运行中,由于局部水冰含量高于预期,冰轮一号在部分月昼期间的峰值产量达到了 3.4 吨/天。</p>
<h3>首个月夜与日出恢复(5 月 1 日至 17 日)</h3>
<p>5 月 1 日 16 时 49 分,东方海进入日落,月面温度急剧下降。冰轮一号的 ISRU 系统按程序进入休眠状态——采矿车停机归位、电解模块降温、管路排空,电池组维持航电计算机和温控系统的最低功耗运行。这是冰轮着陆器设计的首次月夜生存测试。</p>
<p>5 月 17 日 23 时 01 分,日出后太阳能电池板重新发电,冰轮一号自动唤醒——采矿车重新展开,ISRU 模块恢复预热和进料,燃料生产无缝恢复。冰轮一号成功通过了首个完整月夜周期的考验,验证了 ISRU 系统的长期无人运行可行性。</p>
<h2 id="achievements">任务成果</h2>
<ul>
<li><b>广寒计划首次发射与首次月面着陆</b>:冰轮一号于 2024 年 4 月 19 日着陆东方海,验证了冰轮着陆器从发射到月面着陆的完整飞行流程。</li>
<li><b>月面 ISRU 成功启动</b>:在着陆后不到 10 小时内,12 吨 ISRU 模块完成部署并启动燃料生产,日产速率 3 吨/天(峰值 3.4 吨/天),验证了月面无人自动燃料工厂的技术可行性。</li>
<li><b>首个月夜生存</b>:冰轮一号成功度过首个 14 天月夜并自动恢复运行,证明 ISRU 系统具备长期无人值守的月面生存能力。</li>
<li><b>燃料储备基础</b>:截至 <a href="/home/mission/Guanghan_Program/GHC-02">广寒基地建设任务-02</a> 乘组抵达时,冰轮一号已累计生产超过 80 吨氢氧燃料,为后续所有载人任务提供了燃料基础。冰轮一号的设计允许后期由乘组拆除 ISRU 模块,恢复为标准货运型——届时它将继续作为燃料运输器服务于物流闭环。</li>
</ul>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/mission/Guanghan_Program">广寒计划总览</a></li>
<li><a href="/home/mission/Guanghan_Program/BL-01/Gallery">BL-01 任务图集</a></li>
<li><a href="/home/Spacecraft/Binglun_Lander">冰轮可复用着陆器</a></li>
<li><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a></li>
</ul>
<script>
(function () {
function ready(fn) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', fn, { once: true });
} else {
fn();
}
}
function captionFor(image) {
var container = image.closest('figure, td, tr, .infobox-image, .gallery-item');
if (!container) {
return image.alt || '';
}
var caption = container.querySelector('.thumbcaption');
return caption ? caption.textContent.trim() : (image.alt || '');
}
function install(article) {
if (!article || article.dataset.lightboxReady === '1') {
return;
}
article.dataset.lightboxReady = '1';
var overlay = document.createElement('div');
overlay.className = 'wiki-image-lightbox';
overlay.hidden = true;
overlay.innerHTML = '<figure class="wiki-image-lightbox-panel" role="dialog" aria-modal="true"><button class="wiki-image-lightbox-close" type="button" aria-label="Close image preview">x</button><img alt=""><figcaption class="thumbcaption"></figcaption></figure>';
document.body.appendChild(overlay);
var previewImage = overlay.querySelector('img');
var previewCaption = overlay.querySelector('figcaption');
var closeButton = overlay.querySelector('.wiki-image-lightbox-close');
function closePreview() {
overlay.hidden = true;
previewImage.removeAttribute('src');
previewCaption.textContent = '';
document.body.classList.remove('wiki-image-lightbox-open');
}
function openPreview(image, event) {
event.preventDefault();
event.stopPropagation();
if (event.stopImmediatePropagation) {
event.stopImmediatePropagation();
}
previewImage.src = image.currentSrc || image.src;
previewImage.alt = image.alt || '';
previewCaption.textContent = captionFor(image);
overlay.hidden = false;
document.body.classList.add('wiki-image-lightbox-open');
closeButton.focus();
}
article.querySelectorAll('img[data-wiki-asset]').forEach(function (image) {
if (image.dataset.lightboxBound === '1') {
return;
}
image.dataset.lightboxBound = '1';
image.addEventListener('click', function (event) {
openPreview(image, event);
}, true);
});
article.addEventListener('click', function (event) {
var image = event.target.closest && event.target.closest('img[data-wiki-asset]');
if (!image || !article.contains(image) || image.closest('.wiki-image-lightbox')) {
return;
}
openPreview(image, event);
});
closeButton.addEventListener('click', closePreview);
overlay.addEventListener('click', function (event) {
if (event.target === overlay) {
closePreview();
}
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && !overlay.hidden) {
closePreview();
}
});
}
function installAll() {
document.querySelectorAll('.wiki-article, .vulture-article').forEach(install);
}
ready(function () {
installAll();
if (window.MutationObserver) {
var observer = new MutationObserver(installAll);
observer.observe(document.body, { childList: true, subtree: true });
}
window.setTimeout(installAll, 500);
window.setTimeout(installAll, 1500);
window.setTimeout(installAll, 3000);
});
}());
</script>
</article>
+198
View File
@@ -0,0 +1,198 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; margin: 0 0 8px; font-size: 2.15em; }
.wiki-article h2 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .media-link { display: block; color: inherit; text-decoration: none; }
.wiki-article .thumb { width: 265px; border: 1px solid #c8ccd1; background: #f8f9fa; padding: 3px; font-size: 88%; line-height: 1.4; box-sizing: border-box; }
.wiki-article .tright { float: right; clear: right; margin: 0.35em 0 1em 1.4em; }
.wiki-article .thumbcaption { padding: 4px 3px 2px; text-align: left; color: #202122; }
.wiki-article .gallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; margin: 1em 0; }
.wiki-article .gallery-item { border: 1px solid #c8ccd1; background: #f8f9fa; padding: 4px; font-size: 88%; line-height: 1.4; }
.wiki-article .gallery-item img { display: block; width: 100%; cursor: zoom-in; }
.wiki-article .gallery-item .thumbcaption { padding: 4px 2px 2px; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .gallery-grid { grid-template-columns: 1fr; } }
/* mission-gallery-enhancements:start */
.wiki-article .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
align-items: stretch;
}
.wiki-article .gallery-item {
display: grid;
grid-template-rows: auto 1fr;
overflow: hidden;
content-visibility: auto;
contain-intrinsic-size: 340px 300px;
}
.wiki-article .gallery-item img[data-wiki-asset] {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: contain;
background: #202122;
cursor: zoom-in;
}
.wiki-article .gallery-item .thumbcaption {
padding: 8px 7px 7px;
}
.wiki-article .gallery-notice {
margin: 1em 0 1.25em;
padding: 10px 12px;
border-left: 4px solid #36c;
background: #f1f4fd;
color: #202122;
}
.wiki-article .image-placeholder {
position: relative;
border: 1px dashed #72777d;
background: linear-gradient(135deg, #f8f9fa, #eaecf0);
color: #54595d;
}
.wiki-article.gallery-planning .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr));
gap: 12px;
}
.wiki-article.gallery-planning .gallery-item {
display: block;
content-visibility: visible;
contain-intrinsic-size: none;
border-color: #a2a9b1;
background: #fff;
box-shadow: 0 1px 2px rgba(32, 33, 34, 0.08);
}
.wiki-article.gallery-planning .image-placeholder {
min-height: 0 !important;
display: block;
padding: 14px 14px 12px;
border: 0;
border-left: 4px solid #72777d;
background: #f8f9fa;
color: #202122;
text-align: left;
font-size: 13px;
font-weight: 600;
line-height: 1.65;
}
.wiki-article.gallery-planning .gallery-item .thumbcaption {
padding: 10px 14px 12px;
border-top: 1px solid #eaecf0;
color: #54595d;
}
.wiki-article.gallery-planning > .image-placeholder {
min-height: 0;
padding: 22px 18px;
border-left: 4px solid #72777d;
}
.wiki-image-lightbox {
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(32, 33, 34, 0.88);
z-index: 10000;
box-sizing: border-box;
}
.wiki-image-lightbox[hidden] { display: none; }
.wiki-image-lightbox-panel {
position: relative;
display: grid;
grid-template-columns: 44px minmax(0, 1fr) 44px;
grid-template-areas: "close close close" "prev image next" "counter caption caption";
gap: 8px;
width: min(1320px, 96vw);
max-height: 94vh;
overflow: auto;
margin: 0;
padding: 10px;
border: 1px solid #a2a9b1;
background: #fff;
box-shadow: 0 12px 38px rgba(0, 0, 0, 0.35);
box-sizing: border-box;
}
.wiki-image-lightbox-panel > img {
grid-area: image;
width: 100%;
height: min(78vh, 900px);
object-fit: contain;
background: #000;
}
.wiki-image-lightbox-close {
grid-area: close;
justify-self: end;
position: static;
float: none;
width: 34px;
height: 34px;
margin: 0;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 22px;
line-height: 30px;
cursor: pointer;
}
.wiki-image-lightbox-close:hover,
.wiki-image-lightbox-close:focus { background: #fff; }
.wiki-image-lightbox-prev { grid-area: prev; }
.wiki-image-lightbox-next { grid-area: next; }
.wiki-image-lightbox-nav {
align-self: center;
width: 40px;
height: 56px;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 26px;
cursor: pointer;
}
.wiki-image-lightbox-nav:hover,
.wiki-image-lightbox-nav:focus { background: #fff; }
.wiki-image-lightbox-counter { grid-area: counter; color: #54595d; white-space: nowrap; }
.wiki-image-lightbox-panel .thumbcaption { grid-area: caption; padding: 0 4px 3px; }
body.wiki-image-lightbox-open { overflow: hidden; }
@media (max-width: 820px) {
.wiki-article .gallery-grid { grid-template-columns: 1fr; }
.wiki-image-lightbox-panel {
grid-template-columns: 36px minmax(0, 1fr) 36px;
width: 98vw;
}
.wiki-image-lightbox-panel > img { height: 70vh; }
.wiki-image-lightbox-nav { width: 34px; height: 48px; }
}
/* mission-gallery-enhancements:end */
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮部署任务-02 任务图集</h1>
<p style="margin-bottom:1.5em;"><a href="/home/mission/Guanghan_Program/BL-02">← 返回任务页</a> 共 5 张影像,按任务阶段排列</p>
<p style="margin-bottom:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-01/Gallery">← BL-01 图集</a> <a href="/home/mission/Guanghan_Program/BL-03/Gallery">BL-03 图集 →</a></p>
<p>冰轮部署任务-02 将第二艘冰轮着陆器(货运构型)送上月面。与冰轮一号的 ISRU 构型不同,冰轮二号的货仓装载空置氢氧燃料罐——它将成为月面燃料储存和分发的中转节点,与冰轮一号的燃料生产能力形成互补。</p>
<h2>发射与上升</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-02/bl02_launch.png" alt="冰轮02发射" data-wiki-asset="/guanghan-bl-02/bl02_launch.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">长征十六号运载火箭搭载冰轮二号从文昌发射场升空。与冰轮部署任务-01 相同的长征十六号运载火箭构型,但载荷由 ISRU 型切换为货运型——货仓内装载空置氢氧燃料罐而非 ISRU 模块。</div></div>
<div class="gallery-item"><img src="/guanghan-bl-02/bl02_launch2.png" alt="冰轮02发射" data-wiki-asset="/guanghan-bl-02/bl02_launch2.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">冰轮二号上升段另一视角。长征十六号运载火箭一级 15 台 YF-215X 发动机喷出的甲烷燃烧尾焰呈淡蓝色半透明状,几乎不含碳烟——这正是全流量补燃循环液氧甲烷发动机的优点之一。</div></div>
</div>
<h2>地月转移</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-02/bl02_tli.png" alt="冰轮02 TLI点火" data-wiki-asset="/guanghan-bl-02/bl02_tli.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">长征十六号运载火箭二级执行 TLI 点火。二级 2 台 YF-215X Vac 发动机将冰轮二号推向地月转移轨道。此次发射后仅一天,金蟾部署任务-01 的金蟾一号也由长征十号戊型运载火箭送入 LEO——广寒计划在 24 小时内连续执行两次发射。</div></div>
<div class="gallery-item"><img src="/guanghan-bl-02/bl02_tli_sep.png" alt="TLI点火及二级分离" data-wiki-asset="/guanghan-bl-02/bl02_tli_sep.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">TLI 点火后,长征十六号运载火箭二级与冰轮二号/转移级组合体分离。二级任务完成,冰轮二号将依靠自身的转移级完成剩余航程。</div></div>
</div>
<h2>月面着陆</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-02/bl02_landing.png" alt="月面着陆" data-wiki-asset="/guanghan-bl-02/bl02_landing.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">2024 年 6 月 23 日 05:23,冰轮二号成功着陆于月球东方海,着陆点位于广寒核心舱以东约 112 m。着陆精度在月面环境下达到亚米级控制水平,为后续广寒基地建设任务-02 乘组使用柔性管道连接冰轮一号与二号创造了精确的位置条件。背景中可见东方海盆地的月壤层次和撞击溅射物分布。</div></div>
</div>
<p style="margin-top:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-01/Gallery">← BL-01 图集</a> <a href="/home/mission/Guanghan_Program/BL-03/Gallery">BL-03 图集 →</a></p>
<p style="margin-top:1.5em;"><a href="/home/mission/Guanghan_Program/BL-02">← 返回任务页</a></p>
+238
View File
@@ -0,0 +1,238 @@
<style>
body:has(.wiki-article) .page-header-section { display: none !important; }
@media (min-width: 1264px) {
body:has(.wiki-article) .page-col-sd { top: 118px !important; }
}
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 15px; line-height: 1.65; }
.wiki-article h1, .wiki-article h2 { color: #202122 !important; font-family: "Linux Libertine", Georgia, "Noto Serif SC", "Songti SC", serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; }
.wiki-article h1 { margin: 0 0 0.35em !important; font-size: 2em; line-height: 1.3; }
.wiki-article h2 { clear: none; overflow: hidden; margin: 1em 0 0.45em; padding-bottom: 0.12em; font-size: 1.5em; line-height: 1.35; }
.wiki-article h3 { margin: 1.1em 0 0.35em; font-size: 1.18em; font-weight: bold; }
.wiki-article p { margin: 0.5em 0 1em; }
.wiki-article .infobox-overlap-section { min-width: 0; overflow: hidden; }
.wiki-article .infobox-overlap-section .wikitable { table-layout: fixed; overflow-wrap: anywhere; }
.wiki-article a { color: #36c; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article ul, .wiki-article ol { margin: 0.4em 0 1em 1.65em; padding: 0; }
.wiki-article li { margin-bottom: 0.25em; }
.wiki-article table.infobox { float: right; clear: right; width: 360px; margin: 0 0 24px 48px !important; border: 1px solid #a2a9b1 !important; border-collapse: separate !important; border-spacing: 0 !important; table-layout: fixed; background: #f8f9fa; font-size: 84%; line-height: 1.45; }
.wiki-article .infobox caption { padding: 9px 12px; background: #eaecf0; border: 1px solid #a2a9b1; border-bottom: 0; font-weight: bold; font-size: 1.15em; line-height: 1.35; }
.wiki-article .infobox caption span { display: block; margin-top: 3px; color: #54595d; font-size: 0.86em; font-weight: normal; }
.wiki-article .infobox th, .wiki-article .infobox td { border: 0 !important; box-shadow: none !important; vertical-align: top; }
.wiki-article table.infobox th.infobox-label { width: 31%; padding: 7px 5px 7px 11px !important; background: #f8f9fa !important; box-shadow: inset 0 1px 0 #eaecf0 !important; color: #54595d; text-align: left; font-weight: 600; white-space: nowrap; }
.wiki-article table.infobox td.infobox-data { width: 69%; padding: 7px 11px 7px 7px !important; background: #f8f9fa !important; box-shadow: inset 0 1px 0 #eaecf0 !important; color: #202122; }
.wiki-article .infobox-section th { padding: 6px 9px !important; border-top: 1px solid #a2a9b1 !important; border-bottom: 1px solid #a2a9b1 !important; background: #eaecf0 !important; color: #202122; text-align: center; font-weight: bold; }
.wiki-article .infobox-image { padding: 8px 10px 5px !important; border: 0 !important; background: #f8f9fa !important; text-align: center; }
.wiki-article .infobox-image img { display: block; width: 100%; height: auto; cursor: pointer; }
.wiki-article .thumbcaption { padding: 4px 3px 2px; color: #202122; font-size: 0.88em; line-height: 1.4; text-align: left; }
.wiki-article .infobox .thumbcaption { padding: 4px 0 2px; text-align: center; }
.wiki-article .wikitable { width: 100%; margin: 1em 0; border: 1px solid #a2a9b1; border-collapse: collapse; background: #f8f9fa; font-size: 90%; }
.wiki-article .wikitable th, .wiki-article .wikitable td { padding: 6px 8px; border: 1px solid #a2a9b1; text-align: left; vertical-align: top; }
.wiki-article .wikitable th { background: #eaecf0; font-weight: bold; }
.wiki-article blockquote { border-left: 3px solid #a2a9b1; padding-left: 14px; margin: 12px 0; color: #54595d; }
@media (min-width: 601px) and (max-width: 820px) { .wiki-article .wikitable { display: block; overflow-x: auto; white-space: nowrap; } }
@media (max-width: 600px) {
.wiki-article { padding: 18px 14px 36px; font-size: 14px; }
.wiki-article h1 { font-size: 1.8em; }
.wiki-article table.infobox { float: none; width: 100%; margin: 0.75em 0 1em !important; }
.wiki-article .wikitable { display: block; overflow-x: auto; white-space: nowrap; }
}
.wiki-article img[data-wiki-asset] { cursor: zoom-in; }
.wiki-image-lightbox { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(32,33,34,0.84); z-index: 10000; box-sizing: border-box; }
.wiki-image-lightbox[hidden] { display: none; }
.wiki-image-lightbox-panel { position: relative; width: min(1120px, 96vw); max-height: 92vh; overflow: auto; margin: 0; padding: 10px; border: 1px solid #a2a9b1; background: #fff; box-shadow: 0 12px 38px rgba(0,0,0,0.35); box-sizing: border-box; }
.wiki-image-lightbox-panel img { display: block; width: 100%; height: auto; max-height: 82vh; object-fit: contain; background: #000; }
.wiki-image-lightbox-close { position: sticky; top: 0; float: right; width: 30px; height: 30px; margin: -2px -2px 8px 10px; border: 1px solid #a2a9b1; background: #eaecf0; color: #202122; font-weight: bold; line-height: 26px; cursor: pointer; }
.wiki-image-lightbox-close:hover, .wiki-image-lightbox-close:focus { background: #fff; }
body.wiki-image-lightbox-open { overflow: hidden; }
@media (max-width: 820px) { .wiki-image-lightbox { padding: 12px; } .wiki-image-lightbox-panel { width: 98vw; max-height: 94vh; } }
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮部署任务-02</h1>
<table class="infobox">
<caption>BL-02<span>广寒计划 · 第二艘冰轮</span></caption>
<tbody>
<tr><td class="infobox-image" colspan="2"><img src="/guanghan-bl-02/bl02_launch.png" data-wiki-asset="/guanghan-bl-02/bl02_launch.png" alt="冰轮二号发射"><div class="thumbcaption">CZ-16 搭载冰轮二号发射升空</div></td></tr>
<tr class="infobox-section"><th colspan="2">任务概况</th></tr>
<tr><th class="infobox-label" scope="row">任务编号</th><td class="infobox-data">BL-02</td></tr>
<tr><th class="infobox-label" scope="row">所属计划</th><td class="infobox-data"><a href="/home/mission/Guanghan_Program">广寒计划</a></td></tr>
<tr><th class="infobox-label" scope="row">任务状态</th><td class="infobox-data">✅ 成功</td></tr>
<tr class="infobox-section"><th colspan="2">发射与着陆</th></tr>
<tr><th class="infobox-label" scope="row">发射日期</th><td class="infobox-data">2024-06-18 01:47</td></tr>
<tr><th class="infobox-label" scope="row">运载火箭</th><td class="infobox-data"><a href="/home/Launch_Vehicles/CZ-16">CZ-16</a></td></tr>
<tr><th class="infobox-label" scope="row">载荷</th><td class="infobox-data"><a href="/home/Spacecraft/Binglun_Lander">冰轮二号</a>(货运型,携带空置氢氧燃料罐)</td></tr>
<tr><th class="infobox-label" scope="row">着陆日期</th><td class="infobox-data">2024-06-23 05:23</td></tr>
<tr><th class="infobox-label" scope="row">着陆点</th><td class="infobox-data">月球东方海(广寒核心舱以东 112 m)</td></tr>
<tr class="infobox-section"><th colspan="2">任务导航</th></tr>
<tr><th class="infobox-label" scope="row">任务导航</th><td class="infobox-data"><a href="/home/mission/Guanghan_Program/BL-01">BL-01</a> · <a href="/home/mission/Guanghan_Program/BL-03">BL-03</a></td></tr>
</tbody>
</table>
<p><b>冰轮部署任务-02</b>于 2024 年 6 月 18 日发射——紧随前一日 <a href="/home/mission/Guanghan_Program/JC-01">金蟾部署任务-01</a> 金蟾部署之后,广寒计划在 24 小时内连续执行两次发射。冰轮部署任务-02 将<a href="/home/Spacecraft/Binglun_Lander">冰轮二号</a>着陆器(货运构型,货仓装载空置氢氧燃料罐)精确着陆于广寒核心舱以东仅 112 m 处,着陆精度在月面环境下达到亚米级。冰轮二号与已在月面运行两个月的冰轮一号 ISRU 着陆器形成互补——一个生产燃料,一个储存和分发燃料,为即将到来的 <a href="/home/mission/Guanghan_Program/GHC-02">广寒基地建设任务-02</a> 首次载人任务中的燃料传输验证做好了硬件准备。</p>
<p>冰轮二号的着陆精度——距广寒核心舱仅 112 m——在月面制导领域具有标杆意义。在无 GPS、无大气辅助、纯惯性制导加地形匹配的着陆条件下,亚米级精度的月面着陆为后续设施之间的精确布局和柔性管道连接(管长有限、不可延长)奠定了基础。</p>
<section class="infobox-overlap-section" aria-labelledby="background">
<h2 id="background">任务背景</h2>
<p>冰轮一号在月面持续生产氢氧燃料,但仅有一台 ISRU 着陆器无法构成物流闭环——燃料需要被运输到需要它的地方,也需要接收来自地球的物资。冰轮部署任务-02 将第二艘冰轮着陆器(货运构型)送上月面,其任务定位与冰轮一号形成互补。</p>
<p>与冰轮一号不同,冰轮二号未安装 ISRU 模块,而是以货运构型发射——货仓内装载一组空置氢氧燃料罐。这些空罐是物流闭环的第一个"容器":它们将被冰轮一号的 ISRU 产出的燃料填充,然后通过柔性管道传输至其他月面设施或航天器。空罐本身设计为可拆卸单元——当满载燃料后,可由乘组从冰轮二号货仓中取出,通过月面运输车(后续任务部署)转移至吴刚着陆器或其他需要燃料的设施。</p>
<p>冰轮二号发射时携带的空罐组包括 4 个大型液氧罐和 4 个液氢罐,总空载质量约 1.6 吨,满载容量约 85 吨氢氧燃料。加上冰轮一号自身储箱中积累的产量,两艘冰轮组合体的理论燃料库存可达 200 吨以上——足够维持数次吴刚着陆器月面起飞+金蟾转移级 LLO↔LEO 往返。</p>
</section>
<h2 id="details">任务详情</h2>
<h3>发射与月面着陆(6 月 18 日至 23 日)</h3>
<p>2024 年 6 月 18 日 01 时 47 分,<a href="/home/Launch_Vehicles/CZ-16">长征十六号运载火箭</a>搭载<a href="/home/Spacecraft/Binglun_Lander">冰轮二号</a>(货运构型,货仓装载空置氢氧燃料罐)从文昌发射场发射升空。这是广寒计划在 24 小时内执行的第二次发射——前一日(6 月 17 日)<a href="/home/mission/Guanghan_Program/JC-01">金蟾部署任务-01</a> 刚刚将金蟾一号部署入轨。发射后一级采用航区回收模式,在海上驳船成功着陆回收。01 时 52 分一二级分离,01 时 56 分二级 TLI 注入完成,冰轮二号进入地月转移轨道。</p>
<p>经过约 5 天的地月转移飞行,冰轮二号于 6 月 23 日 02 时 48 分执行近月制动,进入 100×100 km 绕月轨道(LLO)。04 时 52 分,冰轮二号开始动力下降——Hecate 液氧液氢主发动机点火减速,着陆雷达启动地形匹配末制导。05 时 23 分,冰轮二号成功着陆于月球东方海,着陆点位于广寒核心舱以东仅 112 米处,着陆精度达到亚米级。</p>
<h3>着陆精度与制导</h3>
<p>冰轮二号的着陆精度是本任务的一个技术亮点。着陆点位于广寒核心舱以东约 112 米处——在月面环境下这一精度意味着着陆制导系统达到了亚米级控制水平。实现这一精度的关键技术包括:</p>
<ul>
<li><b>地形匹配末制导</b>:在下降末段(高度 < 2 km着陆雷达对下方月面进行实时扫描与预装的高分辨率数字高程模型DEM进行匹配比对每分钟更新多次位置修正量</li>
<li><b>着陆点特征锁定</b>:广寒核心舱着陆时产生的浅碟形冲刷坑和发动机羽流扰动区在其着陆后被轨道成像识别,形成了对比度极高的视觉标志——冰轮二号的末制导系统锁定了这一"人工路标"进行相对位置校准。</li>
<li><b>Hecate 发动机节流能力</b>:冰轮着陆器配备的 Hecate 液氧液氢发动机具备深度节流能力(最低 35% 额定推力),允许在末段进行精细的速度和位置微调,避免因推力过大导致的过度修正。</li>
</ul>
<h3>物流角色与任务定位</h3>
<p>冰轮二号在广寒计划物流体系中的角色经历了三个阶段:</p>
<ol>
<li><b>初期 · 被动接收(广寒基地建设任务-02 期间)</b>:冰轮二号着陆后处于待命状态。广寒基地建设任务-02 乘组通过 EVA 使用柔性管道将冰轮一号与冰轮二号连接——这是月面首次跨着陆器燃料传输。冰轮二号被动接收冰轮一号 ISRU 产出的氢氧燃料,充填货仓内的空置燃料罐。</li>
<li><b>中期 · 主动分发(广寒基地建设任务-02 后期)</b>:冰轮二号在燃料罐填充完成后,通过第二套柔性管道连接吴刚着陆器,将燃料从 ISRU 经冰轮二号中继传输至吴刚——验证了"ISRU → 储存 → 用户"的三节点月面燃料分发链路。</li>
<li><b>远期 · 燃料上行(广寒基地建设任务-03 及以后)</b>:在金蟾物流环启动后,冰轮二号将成为燃料上行运输的主力——携带外挂油箱从月面起飞至 LLO,将 95 吨液氢液氧交付给待命的金蟾转移级。这是月面 ISRU 燃料进入地月物流闭环的"最后一公里"。</li>
</ol>
<h2 id="achievements">任务成果</h2>
<ul>
<li><b>亚米级着陆精度</b>:冰轮二号着陆于广寒核心舱以东仅 112 米处,验证了地形匹配末制导和"人工路标"相对定位技术在月面环境下的实战能力。</li>
<li><b>24 小时内双发射</b>BL-02 紧随 <a href="/home/mission/Guanghan_Program/JC-01">金蟾部署任务-01</a> 发射,广寒计划首次在 24 小时内执行两次独立发射任务,体现了计划的发射节奏和物流协调能力。</li>
<li><b>冰轮 ISRU-货运互补编队形成</b>:冰轮二号(货运型)与冰轮一号(ISRU 型)在月面形成互补——一个生产燃料,一个储存和分发燃料——为 <a href="/home/mission/Guanghan_Program/GHC-02">广寒基地建设任务-02</a> 的首次燃料传输验证奠定了硬件基础。</li>
<li><b>三节点燃料分发链路就绪</b>:冰轮二号的空置燃料罐组(总容量约 85 吨)和货仓设计为"ISRU → 储存 → 用户"的月面燃料链路提供了关键中间节点,月面燃料物流从单点生产走向网络化分发。</li>
</ul>
<h2 id="seealso">参见</h2>
<ul>
<li><a href="/home/mission/Guanghan_Program">广寒计划总览</a></li>
<li><a href="/home/mission/Guanghan_Program/BL-02/Gallery">BL-02 任务图集</a></li>
<li><a href="/home/mission/Guanghan_Program/GHC-02">GHC-02 — 首次载人着陆</a>(完成冰轮一号与二号的柔性管道连接)</li>
<li><a href="/home/Spacecraft/Binglun_Lander">冰轮可复用着陆器</a></li>
<li><a href="/home/Launch_Vehicles/CZ-16">CZ-16 长征十六号</a></li>
</ul>
<script>
(function () {
function ready(fn) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', fn, { once: true });
} else {
fn();
}
}
function captionFor(image) {
var container = image.closest('figure, td, tr, .infobox-image, .gallery-item');
if (!container) {
return image.alt || '';
}
var caption = container.querySelector('.thumbcaption');
return caption ? caption.textContent.trim() : (image.alt || '');
}
function install(article) {
if (!article || article.dataset.lightboxReady === '1') {
return;
}
article.dataset.lightboxReady = '1';
var overlay = document.createElement('div');
overlay.className = 'wiki-image-lightbox';
overlay.hidden = true;
overlay.innerHTML = '<figure class="wiki-image-lightbox-panel" role="dialog" aria-modal="true"><button class="wiki-image-lightbox-close" type="button" aria-label="Close image preview">x</button><img alt=""><figcaption class="thumbcaption"></figcaption></figure>';
document.body.appendChild(overlay);
var previewImage = overlay.querySelector('img');
var previewCaption = overlay.querySelector('figcaption');
var closeButton = overlay.querySelector('.wiki-image-lightbox-close');
function closePreview() {
overlay.hidden = true;
previewImage.removeAttribute('src');
previewCaption.textContent = '';
document.body.classList.remove('wiki-image-lightbox-open');
}
function openPreview(image, event) {
event.preventDefault();
event.stopPropagation();
if (event.stopImmediatePropagation) {
event.stopImmediatePropagation();
}
previewImage.src = image.currentSrc || image.src;
previewImage.alt = image.alt || '';
previewCaption.textContent = captionFor(image);
overlay.hidden = false;
document.body.classList.add('wiki-image-lightbox-open');
closeButton.focus();
}
article.querySelectorAll('img[data-wiki-asset]').forEach(function (image) {
if (image.dataset.lightboxBound === '1') {
return;
}
image.dataset.lightboxBound = '1';
image.addEventListener('click', function (event) {
openPreview(image, event);
}, true);
});
article.addEventListener('click', function (event) {
var image = event.target.closest && event.target.closest('img[data-wiki-asset]');
if (!image || !article.contains(image) || image.closest('.wiki-image-lightbox')) {
return;
}
openPreview(image, event);
});
closeButton.addEventListener('click', closePreview);
overlay.addEventListener('click', function (event) {
if (event.target === overlay) {
closePreview();
}
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && !overlay.hidden) {
closePreview();
}
});
}
function installAll() {
document.querySelectorAll('.wiki-article, .vulture-article').forEach(install);
}
ready(function () {
installAll();
if (window.MutationObserver) {
var observer = new MutationObserver(installAll);
observer.observe(document.body, { childList: true, subtree: true });
}
window.setTimeout(installAll, 500);
window.setTimeout(installAll, 1500);
window.setTimeout(installAll, 3000);
});
}());
</script>
</article>
+196
View File
@@ -0,0 +1,196 @@
<style>
.wiki-article { max-width: 1180px; margin: 0 auto; padding: 24px 32px 48px; color: #202122; background: #fff; font-family: sans-serif; font-size: 14px; line-height: 1.65; }
.wiki-article h1 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; margin: 0 0 8px; font-size: 2.15em; }
.wiki-article h2 { font-family: "Linux Libertine", Georgia, serif; font-weight: normal; border-bottom: 1px solid #a2a9b1; clear: both; margin: 1.35em 0 0.6em; padding-bottom: 0.18em; font-size: 1.55em; }
.wiki-article p { margin: 0.45em 0 0.85em; }
.wiki-article a { color: #0645ad; text-decoration: none; }
.wiki-article a:hover { text-decoration: underline; }
.wiki-article img { max-width: 100%; height: auto; }
.wiki-article .gallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; margin: 1em 0; }
.wiki-article .gallery-item { border: 1px solid #c8ccd1; background: #f8f9fa; padding: 4px; font-size: 88%; line-height: 1.4; }
.wiki-article .gallery-item img { display: block; width: 100%; cursor: zoom-in; }
.wiki-article .gallery-item .thumbcaption { padding: 4px 2px 2px; }
@media (max-width: 820px) { .wiki-article { padding: 18px 16px 36px; } .gallery-grid { grid-template-columns: 1fr; } }
/* mission-gallery-enhancements:start */
.wiki-article .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
align-items: stretch;
}
.wiki-article .gallery-item {
display: grid;
grid-template-rows: auto 1fr;
overflow: hidden;
content-visibility: auto;
contain-intrinsic-size: 340px 300px;
}
.wiki-article .gallery-item img[data-wiki-asset] {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: contain;
background: #202122;
cursor: zoom-in;
}
.wiki-article .gallery-item .thumbcaption {
padding: 8px 7px 7px;
}
.wiki-article .gallery-notice {
margin: 1em 0 1.25em;
padding: 10px 12px;
border-left: 4px solid #36c;
background: #f1f4fd;
color: #202122;
}
.wiki-article .image-placeholder {
position: relative;
border: 1px dashed #72777d;
background: linear-gradient(135deg, #f8f9fa, #eaecf0);
color: #54595d;
}
.wiki-article.gallery-planning .gallery-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr));
gap: 12px;
}
.wiki-article.gallery-planning .gallery-item {
display: block;
content-visibility: visible;
contain-intrinsic-size: none;
border-color: #a2a9b1;
background: #fff;
box-shadow: 0 1px 2px rgba(32, 33, 34, 0.08);
}
.wiki-article.gallery-planning .image-placeholder {
min-height: 0 !important;
display: block;
padding: 14px 14px 12px;
border: 0;
border-left: 4px solid #72777d;
background: #f8f9fa;
color: #202122;
text-align: left;
font-size: 13px;
font-weight: 600;
line-height: 1.65;
}
.wiki-article.gallery-planning .gallery-item .thumbcaption {
padding: 10px 14px 12px;
border-top: 1px solid #eaecf0;
color: #54595d;
}
.wiki-article.gallery-planning > .image-placeholder {
min-height: 0;
padding: 22px 18px;
border-left: 4px solid #72777d;
}
.wiki-image-lightbox {
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(32, 33, 34, 0.88);
z-index: 10000;
box-sizing: border-box;
}
.wiki-image-lightbox[hidden] { display: none; }
.wiki-image-lightbox-panel {
position: relative;
display: grid;
grid-template-columns: 44px minmax(0, 1fr) 44px;
grid-template-areas: "close close close" "prev image next" "counter caption caption";
gap: 8px;
width: min(1320px, 96vw);
max-height: 94vh;
overflow: auto;
margin: 0;
padding: 10px;
border: 1px solid #a2a9b1;
background: #fff;
box-shadow: 0 12px 38px rgba(0, 0, 0, 0.35);
box-sizing: border-box;
}
.wiki-image-lightbox-panel > img {
grid-area: image;
width: 100%;
height: min(78vh, 900px);
object-fit: contain;
background: #000;
}
.wiki-image-lightbox-close {
grid-area: close;
justify-self: end;
position: static;
float: none;
width: 34px;
height: 34px;
margin: 0;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 22px;
line-height: 30px;
cursor: pointer;
}
.wiki-image-lightbox-close:hover,
.wiki-image-lightbox-close:focus { background: #fff; }
.wiki-image-lightbox-prev { grid-area: prev; }
.wiki-image-lightbox-next { grid-area: next; }
.wiki-image-lightbox-nav {
align-self: center;
width: 40px;
height: 56px;
border: 1px solid #a2a9b1;
border-radius: 3px;
background: #eaecf0;
color: #202122;
font-size: 26px;
cursor: pointer;
}
.wiki-image-lightbox-nav:hover,
.wiki-image-lightbox-nav:focus { background: #fff; }
.wiki-image-lightbox-counter { grid-area: counter; color: #54595d; white-space: nowrap; }
.wiki-image-lightbox-panel .thumbcaption { grid-area: caption; padding: 0 4px 3px; }
body.wiki-image-lightbox-open { overflow: hidden; }
@media (max-width: 820px) {
.wiki-article .gallery-grid { grid-template-columns: 1fr; }
.wiki-image-lightbox-panel {
grid-template-columns: 36px minmax(0, 1fr) 36px;
width: 98vw;
}
.wiki-image-lightbox-panel > img { height: 70vh; }
.wiki-image-lightbox-nav { width: 34px; height: 48px; }
}
/* mission-gallery-enhancements:end */
</style>
<article class="mw-parser-output wiki-article">
<h1 id="top">冰轮部署任务-03 任务图集</h1>
<p style="margin-bottom:1.5em;"><a href="/home/mission/Guanghan_Program/BL-03">← 返回任务页</a> 共 6 张影像,按任务阶段排列</p>
<p style="margin-bottom:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-02/Gallery">← BL-02 图集</a></p>
<p>冰轮部署任务-03 是冰轮着陆器 Block 2 的首航——燃料箱延长至 36.7 m 全高,内部燃料容量从 96.6 吨提升至 121.6 吨,取消顶部保温箱改以 32 层 MLI 增强层替代。以下影像记录了冰轮三号从发射到加入东方海编队的全过程。</p>
<h2>发射</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-03/bl3_launch.png" alt="冰轮3号发射" data-wiki-asset="/guanghan-bl-03/bl3_launch.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">长征十六号运载火箭搭载冰轮三号(Block 2 货运型)从文昌发射场升空。冰轮三号全高 36.7 m——比 Block 1 高出 6.5 m——肉眼可见箭体长细比更大。</div></div>
<div class="gallery-item"><img src="/guanghan-bl-03/bl3_launch2.png" alt="冰轮3号发射" data-wiki-asset="/guanghan-bl-03/bl3_launch2.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">同一发射的另一视角。15 台 YF-215X 发动机的淡蓝色甲烷尾焰在上升段清晰可辨——全流量补燃循环几乎不产生碳烟沉积。</div></div>
</div>
<h2>地月转移与着陆</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-03/bl3_loi.png" alt="冰轮3号近月制动" data-wiki-asset="/guanghan-bl-03/bl3_loi.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">冰轮三号执行近月制动进入 LLO——此时正值广寒基地建设任务-03 任务期间,嫦娥 4 号乘组正在广寒基地执行电力模块安装。冰轮三号将在 LLO 等待着陆窗口。</div></div>
<div class="gallery-item"><img src="/guanghan-bl-03/bl3_descent_burn.png" alt="月面主减速段" data-wiki-asset="/guanghan-bl-03/bl3_descent_burn.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">冰轮三号从 LLO 开始动力下降。Hecate 主发动机以全推力进行主减速——Block 2 增加的燃料容量使着陆段拥有更充裕的 Δv 裕度。下方为月球东方海盆地的玄武岩月面。</div></div>
<div class="gallery-item"><img src="/guanghan-bl-03/bl3_landing.png" alt="月面着陆" data-wiki-asset="/guanghan-bl-03/bl3_landing.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">冰轮三号成功着陆于东方海广寒基地附近。着陆后冰轮编队增至三艘——冰轮一号(Block 1, ISRU)、冰轮二号(Block 1, 货运)和冰轮三号(Block 2, 大运力货运)。三艘冰轮的总燃料上行能力(单次 LLO 交付)超过 250 吨液氢液氧。</div></div>
</div>
<h2>冰轮编队</h2>
<div class="gallery-grid">
<div class="gallery-item"><img src="/guanghan-bl-03/bl_fleet_three.png" alt="三艘冰轮编队" data-wiki-asset="/guanghan-bl-03/bl_fleet_three.png" loading="lazy" decoding="async" fetchpriority="low"><div class="thumbcaption">广寒基地冰轮编队全景——从左往右依次为:冰轮三号(Block 2,最高/最宽)、冰轮二号(Block 1,左侧)、冰轮一号(Block 1,最右侧,ISRU 设备可见)。三艘冰轮围绕广寒核心舱呈弧形分布,构成广寒基地物流体系的月面支撑节点。冰轮一号将在后续任务中拆除 ISRU 模块、转为货运型,届时整个编队将实现单一物流职能。</div></div>
</div>
<p style="margin-top:1.5em;"><b>任务图集导航</b><a href="/home/mission/Guanghan_Program/BL-02/Gallery">← BL-02 图集</a></p>
<p style="margin-top:1.5em;"><a href="/home/mission/Guanghan_Program/BL-03">← 返回任务页</a></p>
</article>

Some files were not shown because too many files have changed in this diff Show More