先别往下翻
假设你是轨道保险的精算师:天上正要给一颗卫星上碰撞险。你预估,如果它被撞碎,会"碎出"多少片被追踪的碎片?
(在心里选一个,再往下看。)
碰撞:把一颗卫星彻底"拆"成碎片
轨道上发生碰撞时,关键数字不是"撞坏了几颗",而是"一颗变出多少片"。NASA 的《轨道碎片季刊》(ODQN)v13.3(2009 年 7 月)用一张表记下了几起定义性解体事件的编目数量——所谓"编目",就是美国空间监视网能追踪到的碎片总数:
| 事件 | 时间 | 类型 | 被编目碎片 | 被毁卫星数 |
|---|---|---|---|---|
| 风云一号C(Fengyun-1C) | 2007-01 | 碰撞(故意) | 2,529 | 1 |
| 铱星 33(Iridium 33) | 2009-02 | 碰撞(意外) | 336 | 1 |
| 宇宙 2251(Cosmos 2251) | 2009-02 | 碰撞(意外) | 795 | 1 |
数据年龄提示:上表数字不是"现在"的实时值,而是 NASA ODQN v13.3(2009-07)基于 2009-06-25 编目数据的冻结快照——它不是"当年实时追踪数",而是这一期公报公布的编目口径。三起事件是 2007/2009 的历史定义事件,年份已定格;追求实时在轨总数看 ESA/NASA 实时目录,追求逐字可核验看本文附录的冻结快照(含 ASOF 时间点)。
注意上面的"放大":一颗卫星,能"拆"出上千片。 把它归一化到"每颗被毁卫星"的放大倍数:
- 风云一号C(故意反卫,2007-01):2,529 / 1 = ×2,529
- 铱星 33 + 宇宙 2251(意外相撞,2009-02):336 + 795 = 1,131,两枚卫星 → ×566
换一种说法:一场碰撞炸碎的不是"一颗卫星",而是把一颗卫星拆成上千份大碎片,再顺着轨迹铺成一片"陪葬"的碎片云。
为什么偏偏"陪葬一片"会成问题:碎片都挤在 800 km
更要命的是,碰撞常发生在"最挤"的高度。NASA 这段话说明了铱星-宇宙碰撞后碎片的去向:
More than 1500 large (> 10 cm) debris from the collision had been identified by the US Space Surveillance Network. These debris are concentrated near 800 km altitude where a large number of spacecraft perform communications and Earth observation missions.
—— NASA ODQN v13.3(2009-07),UN COPUOS 就 Iridium-Cosmos 碰撞的更新
翻译过来:这次碰撞的 >10cm 碎片,集中在约 800 km 高度——正是大量卫星做通信与对地观测的繁忙高度。 换句话说,碰撞不是在空旷处"撒一地把",而是在最拥堵的"上班路上"撒了一把钉子。
那么当时天上到底多挤?同一期公报的"卫星 Box Score"(美国空间监视网编目,2009-07-01)按国别分列了在轨编目人口:
| 类型 | 数量 | 占比 |
|---|---|---|
| 活跃载荷(working payloads) | 3,226 | 23.2% |
| 火箭体 / 碎片(rocket bodies & debris) | 10,671 | 76.8% |
| 合计 | 13,897 | 100% |
也就是说:碎片与退役壳,是当时在轨编目人口的约 3.3 倍(10,671 ÷ 3,226)。 上下班的路上,干活的不到四分之一,其余早就不干活——但照样占着道。
保险在定价的,到底是什么
铺垫到这里,"轨道碰撞保险"要定价的核心风险就清楚了:碰撞风险 = 把你的一项资产,变成上千块别人也躲不掉的碎片。 它更接近"资产价值风险",而非"单次维修成本"——因为你永远不知道,下一回撞上的是你自己的卫星,还是别人"赔"出来的那片云。
但请听清这篇的诚实边界:保险只是这里的叙事框架(资产定价视角),文中不引用任何未核实的保费、理赔或市场规模数字。 那些数字要么是商业机密,要么是未公开的估算——我们无法逐字验证,就不放进可验证的文章里。这篇的可复现/可验证重量,全部落在 NASA ODQN 的碰撞与暴露数据上(见附录)。
这也顺带解释了为什么"碰撞保险"难做:你保的金额是几十亿美元的一颗卫星,可一旦触发,赔的不是一颗卫星的成本,而是一整片影响别人资产的碎片云的成本。 这类"我的事故影响你的人生"的定价,恰恰是保险里最难的那一类。
三个问题
1. 编目数 2,529 就是被打碎出来的全部碎片吗? 不是。这是"美国空间监视网能编目追踪到"的数目,属下限(编目碎片多为 >10cm 且能被追踪)。实际打碎出来的更小碎片要多一两个数量级。2,529 说的是"能数得清、追得上的那一部分",远不是"当场碎成多少块"。
2. 为什么风云一号C比铱星+宇宙碎得还多? 两者"发动方式"不同:风云一号C是 2007-01 的一次故意反卫试验(高能量受控解体),NASA 描述它是"史上最严重的在轨解体、对环境影响严重";铱星 33 与宇宙 2251 则是 2009-02 的意外相撞——两枚完好卫星首次意外碰撞。同是"一颗变上千块",但故意解体爆得更多。
3. 这是 2009 年的旧数据,现在还准吗? 本篇锚定的是 2007/2009 三起"历史定义"的碰撞事件。它们作为定性结构(一次碰撞会放大出大量碎片)是稳定不变的;具体编目数会因后续追删而变化,但"一次碰撞化出一片云"的结构结论不因数字微调而改变。追求实时在轨总数看 ESA/NASA 实时目录;追求逐字可核验看附录冻结快照。
你可以自己验
到这里的所有数字,都不是"我们说的",而是 NASA ODQN 公报原文算出来的:
- 两次事件编目数 2,529 / 336 / 795,合并 1,131:逐字取自 NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660,快照内每个 primary 锚点附原文引用句 quote + 出处定位 locator;
- 单星放大 ×2,529 / ×566、Box Score 汇总 3,226 / 10,671 / 13,897、占比 23.2% / 76.8%、碎片为载荷 3.31 倍:由脚本从快照常数重算。
脚本读取冻结快照 → 由 2,529 / 336 / 795 算出合并 1,131 与单星放大倍数,由 Box Score 算出 3,226 / 10,671 / 13,897/占比/比值 → 输出与正文完全一致的表格、证据层级与哈希。你(或任何 AI agent)都可以重跑核对,见附录。
附录:可复现验证
python3 verify_collision_insurance.py # 读默认快照,重跑并核对 python3 verify_collision_insurance.py collision_insurance.json # 指定快照文件
脚本会做四件事:
1. 校验快照 schema v2(证据门禁:primary 档必须带原文引用句 quote + 出处定位 locator);
2. 由 2,529 / 336 / 795 算出 Iridium+Cosmos 合并 1,131 与单星放大倍数;
3. 由 Box Score 算出载荷 3,226 / 碎片 10,671 / 合计 13,897 及占比与比值,并叠加"陪葬"量级(单场解体编目云占全部载荷之比);
4. 输出证据层级、快照 sha256 与验证方式。
说明:5 个 primary 锚点逐字取自 NASA《Orbital Debris Quarterly News》v13.3(2009-07,NTRS #20090027660)——风云一号C反卫试验、首次两颗完好卫星意外相撞、>10cm 碎片集中于 800 km、Table 1 两事件编目数、Satellite Box Score(2009-07-01 编目)。每个 primary 锚点内含原文引用句 quote 与出处定位 locator,可逐字复核。其中"事件编目数"为当时编目口径(表 1,基于 2009-06-25 编目数据);"Box Score"为同期(2009-07-01)在轨编目总人口按国检索。正文表格与派生数字由脚本从快照重算,冻结快照可精确复现。注意:编目数是被追踪碎片的下限,并非实际碎片总数。
原始材料(可直接复制)
下面的脚本与数据快照全文,供你(或任何 AI agent)直接复制使用,无需下载。
复现材料(含 sha256 锚点,随嵌入文件自动更新):
verify_collision_insurance.py(复现脚本) · sha256 7d217f4d62ce2832ccd010cfaa0e1db3077c160f3b51c9d6a297f3d110d754ad
collision_insurance.json(数据快照) · sha256 16858d9495b3e216259b74e3b790d1e72e6bac850ed1376d8a19cbf589228ed9
verify_collision_insurance.py — 复现脚本全文
#!/usr/bin/env python3
# verify_collision_insurance.py — 科普附录:验证「轨道碰撞保险:一颗卫星被撞,天上为什么陪葬一片」派生数字(零依赖)
# 输入:collision_insurance.json 冻结快照 v2(5 个 primary 锚点 + 事件常数 + 国家 Box Score + 碎片集中高度)
# 输出:事件编目数 / 单星放大倍数 / Box Score 载荷与碎片总量/占比 / 舰队相对占比 + 证据层级 + 快照 sha256
# 用法:python3 verify_collision_insurance.py (默认读 collision_insurance.json)
# python3 verify_collision_insurance.py FILE (指定快照文件)
# 退出码:0 成功;2 解析失败;3 证据契约违规(primary 缺 quote/locator)
import hashlib
import json
import sys
TIERS = ("primary", "secondary", "media")
def check_schema(snap):
"""证据门禁:primary 档必须带原文引用句 quote + 出处定位 locator(可复现≠可验证)。"""
errors = []
for a in snap.get("anchors", []):
tier = a.get("tier")
if tier not in TIERS:
errors.append(f"锚点 {a.get('label', '?')}: tier 缺失或非法({tier})")
continue
if tier == "primary":
if not a.get("quote", "").strip():
errors.append(f"锚点 {a.get('label', '?')}: primary 档缺 quote(原文引用句)")
if not a.get("locator", "").strip():
errors.append(f"锚点 {a.get('label', '?')}: primary 档缺 locator(出处定位)")
for key, item in snap.get("background", {}).items():
if isinstance(item, dict) and "tier" in item:
tier = item.get("tier")
if tier not in TIERS:
errors.append(f"background.{key}: tier 非法({tier})")
elif tier == "primary":
if not item.get("quote", "").strip():
errors.append(f"background.{key}: primary 档缺 quote")
if not item.get("locator", "").strip():
errors.append(f"background.{key}: primary 档缺 locator")
return errors
def main():
path = sys.argv[1] if len(sys.argv) > 1 else "collision_insurance.json"
with open(path, "rb") as f:
raw = f.read()
sha = hashlib.sha256(raw).hexdigest()
try:
snap = json.loads(raw.decode("utf-8"))
anchors = snap["anchors"]
c = snap["constants"]
bg = snap.get("background", {})
except Exception as e:
print(f"ERROR: 快照解析失败: {e}", file=sys.stderr)
return 2
schema_errors = check_schema(snap)
if schema_errors:
print("ERROR: 证据契约违规(可复现≠可验证):", file=sys.stderr)
for e in schema_errors:
print(f" - {e}", file=sys.stderr)
return 3
events = {e["name"]: e for e in c["events"]}
fyc = events["Fengyun-1C"]
irid = events["Iridium 33"]
cosmos = events["Cosmos 2251"]
# 两场意外碰撞合并编目数(同文两行相加)
irid_cosmos_combined = irid["cataloged"] + cosmos["cataloged"]
# 单星放大倍数 = 编目碎片 / 被毁卫星数
fyc_amp = fyc["cataloged"] / fyc["satellites_destroyed"]
ic_amp = irid_cosmos_combined / (irid["satellites_destroyed"] + cosmos["satellites_destroyed"])
# Box Score 国家分列之和
rows = c["box_score"]
payloads = sum(r["payloads"] for r in rows)
rb_debris = sum(r["rb_debris"] for r in rows)
total = payloads + rb_debris
share_payloads = payloads / total * 100.0
share_rb = 100.0 - share_payloads
ratio_rb_payloads = rb_debris / payloads
# 舰队相对占比:单场解体编目云占全部活跃载荷之比例(「陪葬」量级)
fyc_of_fleet = fyc["cataloged"] / payloads * 100.0
ic_of_fleet = irid_cosmos_combined / payloads * 100.0
print("=== 轨道碰撞事件 编目数(表1,2009-06-25 编目数据)===")
for name in ("Fengyun-1C", "Iridium 33", "Cosmos 2251"):
e = events[name]
print(f"{name} {e['date']} {e['cause']} cataloged={e['cataloged']} 被毁={e['satellites_destroyed']}")
print(f" · Iridium 33 + Cosmos 2251 合并 = {irid['cataloged']:,} + {cosmos['cataloged']:,} = {irid_cosmos_combined:,}")
print("-" * 52)
print("单星放大倍数(编目碎片 / 被毁卫星数:一场解体「冒出一片」的「陪葬」量级):")
print(f" · Fengyun-1C(反卫试验,故意) = {fyc['cataloged']:,}/{fyc['satellites_destroyed']} = ×{fyc_amp:,.0f}")
print(f" · Iridium 33 + Cosmos 2251(意外碰撞) = {irid_cosmos_combined:,}/{2} = ×{ic_amp:,.0f}")
print("-" * 52)
print("SATELLITE BOX SCORE 汇总(2009-07-01, 美国空间监视网编目):")
print(f" 活跃载荷 = {payloads:,}")
print(f" 火箭体/碎片 = {rb_debris:,}")
print(f" 总计 = {total:,}")
print(f" · 载荷占比 = {payloads:,}/{total:,} = {share_payloads:.1f}%")
print(f" · 碎片/火箭体占比 = {100.0 - share_payloads:.1f}%")
print(f" · 碎片为载荷的 {ratio_rb_payloads:.2f} 倍")
print("-" * 52)
print("碎片集中高度(primary 锚点 #3):")
print(f" 大型(>10cm)碎片集中在约 {c['fragment_concentration_km']} km 高度(通信/对地观测密集区)")
print("-" * 52)
print("「陪葬」量级:单场解体编目云占全部活跃载荷之比例")
print(f" · Fengyun-1C 云 {fyc['cataloged']:,} / 载荷 {payloads:,} = {fyc_of_fleet:.1f}%")
print(f" · Iridium+Cosmos 云 {irid_cosmos_combined:,} / 载荷 {payloads:,} = {ic_of_fleet:.1f}%")
print("-" * 52)
print("背景注:")
for key, item in bg.items():
if isinstance(item, dict):
print(f" {item.get('note', '')}")
print("-" * 52)
print("=== 证据层级(可复现≠可验证,quote 为外部正确性逐字证据)===")
primaries = [a["label"] for a in anchors if a.get("tier") == "primary"]
print(" primary(主源逐字, NASA ODQN v13.3, July 2009, NTRS #20090027660):")
for lab in primaries:
print(f" · {lab}")
print(f"快照格式: {snap.get('format', '?')} · 锚点行数 {snap.get('rows', '?')}")
print(f"快照 sha256: {sha}")
print("验证方式:重跑本脚本,与文章正文表格及派生数字逐项核对(编目数、单星放大、Box Score 占比、舰队相对占比)。")
return 0
if __name__ == "__main__":
sys.exit(main())
collision_insurance.json — 数据快照全文
{
"format": "chenji-collision-insurance-v2",
"schema": {
"version": 2,
"evidence_tiers": ["primary", "secondary", "media"],
"rule": "primary 档锚点必须带原文引用句(quote)+出处定位(locator);secondary 为归因清楚的官方二手;media 为媒体汇编。可复现≠可验证:quote 是外部正确性的逐字证据,让 AI agent 无需依赖权威即可核验。"
},
"generated": "2026-09-07",
"source": "NASA Orbital Debris Quarterly News (ODQN), Volume 13, Issue 3, July 2009, NTRS #20090027660 公开文献原文",
"rows": 5,
"constants": {
"events": [
{"name": "Fengyun-1C", "date": "2007-01", "cause": "Collision (deliberate)", "cataloged": 2529, "satellites_destroyed": 1},
{"name": "Iridium 33", "date": "2009-02", "cause": "Collision (accidental)", "cataloged": 336, "satellites_destroyed": 1},
{"name": "Cosmos 2251", "date": "2009-02", "cause": "Collision (accidental)", "cataloged": 795, "satellites_destroyed": 1}
],
"box_score": [
{"country": "CHINA", "payloads": 77, "rb_debris": 2855},
{"country": "CIS", "payloads": 1381, "rb_debris": 3637},
{"country": "ESA", "payloads": 39, "rb_debris": 36},
{"country": "FRANCE", "payloads": 49, "rb_debris": 410},
{"country": "INDIA", "payloads": 36, "rb_debris": 115},
{"country": "JAPAN", "payloads": 114, "rb_debris": 71},
{"country": "USA", "payloads": 1101, "rb_debris": 3449},
{"country": "OTHER", "payloads": 429, "rb_debris": 98}
],
"fragment_concentration_km": 800,
"note": "三起解体事件编目数(Table 1, 基于 2009-06-25 编目数据) + 'Satellite Box Score'(2009-07-01, 美国空间监视网编目) 按国家分行列出载荷与火箭体/碎片。事件编目数为主要解体事件当年 NASA ODQN 公布的编目口径;Box Score 为同期在轨编目总人口的分国统计。"
},
"anchors": [
{
"asof": "2009-07",
"label": "Fengyun-1C 反卫试验:史上最大解体与编目数",
"tier": "primary",
"quote": "The Fengyun-1C (FY-1C) anti-satellite test conducted by China on 11 January 2007. It was the worst on-orbit breakup in history and the damage to the environment is severe.",
"locator": "NASA ODQN v13.3 (July 2009)《Orbital Debris and Space Traffic》段;Table 1 之 Fengyun-1C 行",
"ref": "NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660"
},
{
"asof": "2009-07",
"label": "首次两颗完好卫星的意外碰撞",
"tier": "primary",
"quote": "The first ever accidental collision between two intact satellites, Iridium 33 and Cosmos 2251 (560 kg and 900 kg, respectively), highlighted the orbital debris problem in the low Earth orbit (LEO) region.",
"locator": "NASA ODQN v13.3 (July 2009)《Iridium-Cosmos Collision》正文段",
"ref": "NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660"
},
{
"asof": "2009-07",
"label": ">10cm 碎片数量与 800km 高度集中",
"tier": "primary",
"quote": "More than 1500 large (> 10 cm) debris from the collision had been identified by the US Space Surveillance Network. These debris are concentrated near 800 km altitude where a large number of spacecraft perform communications and Earth observation missions.",
"locator": "NASA ODQN v13.3 (July 2009) UN COPUOS 就 Iridium-Cosmos 碰撞的更新段",
"ref": "NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660"
},
{
"asof": "2009-07",
"label": "Table 1:Iridium 33 与 Cosmos 2251 各自编目数",
"tier": "primary",
"quote": "Iridium 33 Feb 2009 Collision (accidental) 336 327 323 | Cosmos 2251 Feb 2009 Collision (accidental) 795 789 773",
"locator": "NASA ODQN v13.3 Table 1 'A summary of recent major breakups (based on the 25 June 2009 catalog data)'",
"ref": "NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660"
},
{
"asof": "2009-07",
"label": "Satellite Box Score:载荷 vs 火箭体/碎片(2009-07-01 编目)",
"tier": "primary",
"quote": "SATELLITE BOX SCORE Payloads Rocket Bodies & Debris Total | CHINA 77 2855 2932 | USA 1101 3449 4550",
"locator": "NASA ODQN v13.3《SATELLITE BOX SCORE (as of 01 July 2009, as cataloged by the U.S. Space Surveillance Network)》表",
"ref": "NASA ODQN, Volume 13, Issue 3, July 2009, NTRS #20090027660"
}
],
"background": {
"collision_insurance_note": {
"tier": "secondary",
"locator": "概念框架:碰撞风险是卫星在轨保险要定价的核心风险(公开保险业通识);文中未引用任何未核实的具体保费/理赔数字,此处仅在概念上把碰撞风险归为'资产价值风险'而非'单次维修成本'。",
"note": "保险仅作叙事框架(资产定价视角),不用未核实的市场数字;本篇可复现/可验证的重量落在 NASA ODQN 的碰撞与暴露数据上。"
}
}
}
你该带走什么
一颗卫星在天上是单数资产,可一旦被撞,它"赔"出来的是整片碎片云。据 NASA ODQN v13.3 逐字记录:风云一号C一次故意反卫试验,单颗卫星化出 2,529 个被编目碎片(×2,529);铱星 33 与宇宙 2251 意外相撞,两枚完好卫星化出 1,131 个(×566),且大片碎片集中在约 800 km——正是大量卫星做通信与对地观测的繁忙高度。当时在轨编目人口里,碎片与退役壳是活跃载荷的约 3.3 倍(10,671 ÷ 3,226)。所以"轨道碰撞保险"要定价的不是单次维修成本,而是"把一颗卫星变成上千块别人也躲不掉的碎片"的资产价值风险。轨道是资产,不维护就贬值——而碰撞,是把资产一次清成负数的最快方式。
数据来源:NASA Orbital Debris Quarterly News (ODQN), Volume 13, Issue 3, July 2009, NTRS #20090027660——风云一号C反卫试验、首次两颗完好卫星意外相撞、>10cm 碎片集中于 800 km、Table 1 两事件编目数、Satellite Box Score(2009-07-01 编目)五段原文。
历史背景:本系列第 7 篇《轨道资产台账》——天上 >10cm 在轨物体约占 5.4 万,真正在干活的活跃载荷只约 9,300 颗(约 17%)。本篇承接:既然大部分在轨资产是闲置/报废物,那么一旦发生碰撞,它们从"占地的闲置"变成"扎人的碎片",正是"轨道是资产,不维护就贬值"的极端例证。
可验证声明 印记等级:完整可复现
- 数据可复现:文中数字可由文末脚本 + 冻结快照重跑核对
- 引用可溯源:锚点逐字回主源(原文引用句 + 出处定位)
- 结论可核对:证据层级已标注(主源逐字 / 官方二手 / 媒体汇编)