跳转至

内化蓝图: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 抠细节,读内化蓝图看全局。

一、为什么要内化(三个理由)

  1. 费曼闭环:能自己把每个模块重写出来并跑对,才算真懂。拆解是"读",内化是"写",读写结合才能把 PSINS 变成自己的东西。
  2. 工程资产(oracle):一套 PC 端参考实现,是固件(C 代码)的 golden reference——固件在真机验证前,先在 PC 上用同一套数据对拍,这就是验证策略里 MIL/SIL/PIL 流程的 Phase 1 参考实现。
  3. 算法试验台:以后想试松/紧组合、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 开头,全系列遵守):

  1. API 签名对齐 PSINS——同名同参,PSINS ⇄ Mini-INS 对照零成本,对拍脚本直接复用;
  2. 每行都是教学注释——函数头给"公式层",体内逐行标注对应公式编号;
  3. data_classes.m = 第 0 篇数据结构速查表的代码形态——wiki 写字段表,库写类定义,两处同步;
  4. 零依赖——不调用 PSINS、不依赖任何工具箱,verify/ 自证正确;
  5. 确定性——误差注入的随机游走默认关(web=wdb=0),保证双轨/对拍逐数字可复现。

四、写作规范:公式三件套(全系列统一格式)

每个公式必须配齐三件套,这是"新手可读 + 公式↔代码一一对应"的落点:

  1. 符号表:每个符号给「含义 / 单位 / 维度」——新手最大的坎是符号,先垫平;
  2. 公式块:带编号(公式 2.3),先用"直觉版"(如 ω×v 的物理含义),再给严格版;
  3. 代码锚定:逐行注释标注"这一行在算公式几的哪一项",一行对一行。

示例(四元数 → 姿态阵 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 的对拍表对比。

参考体系:PSINS(demos/ + base/)、本系列 P1P4、科普系列 01–16