内化蓝图:Mini-INS 参考实现库(把 PSINS 拆成自己的惯导工具箱)¶
拆解 PSINS 系列第 0 篇 · 路线图。P1–P4 已经逐篇拆开了 PSINS 的机制(轨迹生成 → 纯惯导 → 航位推算 → SINS+DR 组合),本篇回答一个更大的问题:拆完之后怎么办?
答案是——内化:把 PSINS 的架构吸收成一套自己的模块化参考实现库 Mini-INS。代码自写、逐行注释、零依赖、有 API 边界和回归测试,让「从公式到仿真」的理解沉淀成可复用的工程资产,而不只是几篇学习笔记。
配套:PSINS 源码逐行注释系列
本内化蓝图讲"拆完之后怎么内化成自己的库";若你想先逐行读透 PSINS 原始源码(earth / insupdate / kfinit / kffk / kfupdate / kffeedback 等 11 个核心函数的逐行中文注释 + 数学公式 + 断点调试建议 + 配套练习),见同篇下的 逐行拆解(函数级 line-by-line) 子系列。两条线建议并行:读 line-by-line 抠细节,读内化蓝图看全局。
一、为什么要内化(三个理由)¶
- 费曼闭环:能自己把每个模块重写出来并跑对,才算真懂。拆解是"读",内化是"写",读写结合才能把 PSINS 变成自己的东西。
- 工程资产(oracle):一套 PC 端参考实现,是固件(C 代码)的 golden reference——固件在真机验证前,先在 PC 上用同一套数据对拍,这就是验证策略里 MIL/SIL/PIL 流程的 Phase 1 参考实现。
- 算法试验台:以后想试松/紧组合、FDI、GNSS 融合,在这套库里改一个模块就能出图,不用每次从零写。
二、三者关系:PSINS(参考)· Mini-INS(自写)· 固件(目标)¶
| PSINS | Mini-INS(本库) | AHRS 固件 | |
|---|---|---|---|
| 定位 | 工业级教学参考(30 年积累) | 自写参考实现库 | 量产目标实现 |
| 语言 | MATLAB | MATLAB 主 + Python 镜像 | C |
| 可读性 | 紧凑、依赖 global glv 全局量 | 逐行注释、新手可读 | 嵌入式约束 |
| 代码 | 抄不得(学架构) | 自写,API 对齐 PSINS | 独立实现 |
| 用途 | 对照 / 对拍基准 | SIL oracle、算法试验台 | 上板运行 |
三角关系:PSINS 是"老师"(架构与公式来源),Mini-INS 是"自己的笔记本"(可读的复述),固件是"考卷"(C 落地)。对拍链路:PSINS 原版 ⇄ Mini-INS ⇄ 固件 C(同一组数据,三方误差应在同一量级)。
三、模块落位图¶
库本体在 docs/惯性导航/assets/miniins/(2026-08-24 定:学习资产随 wiki 发布——与拆解系列同仓库,相对链接才能直达;M5 与固件 SIL 打通时再从 wiki 侧引用/同步)。
miniins/
├── README.md # 库总览:定位 / 设计铁律 / 三者关系
├── core/ # 核心函数(平铺目录,直接调用:q2cnb(q) 等)
│ ├── glvs.m # 地球模型常量(对标 PSINS glvs.m)
│ ├── data_classes.m # ★ 数据类:trj / imu / avp / ins / kf / dr 字段定义
│ ├── q2cnb/cnb2q/euler2cnb/cnb2euler # ★★ 基础转换(M1)
│ ├── qmul/qconj/qmulv/rv2q # ★★ 四元数运算(M1)
│ ├── rv2m/m2rv/rotv/skew/vecc # ★★ 旋转矢量与矩阵小工具(M1)
│ ├── earth.m # ★★ 地球模型(M1):RM / RN / g / wnie(新手可读版)
│ ├── insupdate.m # ★★ 机械编排(M1):姿态 / 速度 / 位置更新(逐行注释版)
│ ├── trjsegment.m / trjsimu.m # 轨迹生成(M2)
│ ├── drinit.m / drupdate.m # 航位推算(M3)
│ ├── kfinit.m / kfupdate.m # 卡尔曼框架(M4)
│ ├── kffk.m / kffeedback.m # 组合导航误差模型(M4)
│ └── plot_cmp.m # 真值 vs 多解对比绘图
├── demos/ # 场景脚本(对标 PSINS demos/)
├── verify/ # ★ 回归自检:verify_trans / verify_ins(确定性,无工具箱)
└── assets/ # 出图
设计铁律(写进库 README 开头,全系列遵守):
- API 签名对齐 PSINS——同名同参,PSINS ⇄ Mini-INS 对照零成本,对拍脚本直接复用;
- 每行都是教学注释——函数头给"公式层",体内逐行标注对应公式编号;
data_classes.m= 第 0 篇数据结构速查表的代码形态——wiki 写字段表,库写类定义,两处同步;- 零依赖——不调用 PSINS、不依赖任何工具箱,
verify/自证正确; - 确定性——误差注入的随机游走默认关(
web=wdb=0),保证双轨/对拍逐数字可复现。
四、写作规范:公式三件套(全系列统一格式)¶
每个公式必须配齐三件套,这是"新手可读 + 公式↔代码一一对应"的落点:
- 符号表:每个符号给「含义 / 单位 / 维度」——新手最大的坎是符号,先垫平;
- 公式块:带编号(
公式 2.3),先用"直觉版"(如 ω×v 的物理含义),再给严格版; - 代码锚定:逐行注释标注"这一行在算公式几的哪一项",一行对一行。
示例(四元数 → 姿态阵 q2cnb,M1 的 trans.m 按此标准写):
公式 2.3(q2cnb):由四元数 \(q=[w;x;y;z]\) 构造姿态阵 $\(\mathbf C_b^n=\begin{bmatrix}1-2(y^2+z^2)&2(xy-zw)&2(xz+yw)\\2(xy+zw)&1-2(x^2+z^2)&2(yz-xw)\\2(xz-yw)&2(yz+xw)&1-2(x^2+y^2)\end{bmatrix}\)$
对应代码(
trans.m,一行对一行,w=q(1), x=q(2), y=q(3), z=q(4)):Cbn = [1-2*(q(3)^2+q(4)^2), 2*(q(2)*q(3)-q(4)*q(1)), 2*(q(2)*q(4)+q(3)*q(1)); 2*(q(2)*q(3)+q(4)*q(1)), 1-2*(q(2)^2+q(4)^2), 2*(q(3)*q(4)-q(2)*q(1)); 2*(q(2)*q(4)-q(3)*q(1)), 2*(q(3)*q(4)+q(2)*q(1)), 1-2*(q(2)^2+q(3)^2)];新手备注:矩阵第 1 行只含 y、z 和交叉项,第 2 行只含 x、z——记不住没关系,
q2cnb是纯机械代换,你只需要会查表;真正要理解的是姿态阵的物理含义(三列 = 体轴在导航系的投影方向余弦)。
基础转换优先:trans.m 是 M1 的重中之重——姿态 / 速度 / 位置解算全部建立在其上。先讲透 NED↔body 的 Cbn、四元数 / 欧拉角 / 旋转矢量互转,后面机械编排才有共同语言。
五、里程碑¶
| 里程碑 | 内容 | 完成定义(DoD) |
|---|---|---|
| M1 ✅ | 第 0 篇读码地基 + 库骨架 + 纯惯导模块内化 | trans 系列/earth.m/insupdate.m 公式↔代码逐行对应;verify_trans(125 项)+verify_ins(2 项)全 PASS |
| M2 ✅(2026-08-24) | 轨迹生成内化 | trjsegment(8 基本航段)+trjsimu(正演六步)库化;verify_trj 正演→反演自洽 PASS(无误差注入时解算复现真值) |
| M3 ✅(2026-08-24) | 航位推算内化 | drinit/drupdate 库化(航向×里程:姿态 wm 推 + 里程转导航系 + 位置微分);verify_dr 自洽 PASS(Python 预验证:朝东/左转两场景 100.00 m 精确复现) |
| M4 🚧(2026-08-25 代码完成,待 MATLAB 验收) | 组合导航内化 | kfinit/kfupdate/kffk/kffeedback 库化(22 维 SINS+DR)+ demos/demo_sins_dr.m;代码已逐行对齐 P4 主循环(WAT 21 行 / odsimu / 体 y 里程 drupdate / Q·P0·R),Python 镜像验证数学正确,期望 MATLAB 跑出 SINS-only≈345 / DR-only≈151 / 组合≈45.5 m(对拍 P4 基准) |
| M5 | 扩展 | GNSS 量测并入(P5 规划)、松/紧组合、与固件 C SIL 打通 |
M1 范围:收口到"轨迹 → 纯惯导"(不含 DR/KF);DR/KF 在 M2–M4 逐个内化,每个模块 = wiki 一篇拆解 + 库一个模块 + 一组对拍。
六、与拆解系列的对应¶
拆解 PSINS 系列 Mini-INS 库(内化产物)
───────────────────── ─────────────────────
00 内化蓝图(本篇) ←→ README + 里程碑
00 读码地基(数据结构/约定) ←→ data_classes.m + glvs.m
P1 轨迹生成 ←→ trjsegment/trjsimu(M2)
P2 纯惯导 ←→ trans/earth/insupdate(M1)
P3 航位推算 ←→ drinit/drupdate(M3)
P4 SINS+DR 组合 ←→ kf*(M4)
附录(绘图/MATLAB 惯用法) ←→ plot_cmp.m + 代码注释约定
一句话:拆解和内化不是两件事,是一件事的两面——每一篇拆解对应库里的一个模块 + 一段自写实现 + 一组对拍。
七、如何开始(给读者的指引)¶
- 想快速上手写代码:直接看库
assets/miniins/core/q2cnb.m+assets/miniins/core/insupdate.m(M1 交付,已逐行注释); - 想理解全局:先读 00 读码地基(数据结构与约定);
- 想验证自己懂了:跑
verify/verify_ins.m,把结果和 P2 的对拍表对比。