跳转至

PSINS 逐行注释 Wiki(初学者版)

本系列在 wiki 里的位置与用法

  • 定位:这是「04_拆解PSINS篇」下的函数级逐行拆解子系列(显微镜视角),与同篇的 P1–P4(按测试脚本拆的 demo 级「望远镜」视角)互补。先看 P 系列了解整条 pipeline,再读本系列抠 PSINS 源码细节。
    • 前置数学:读本文档前建议先过一遍 00_前置数学基础(坐标变换、矢量叉乘、概率/协方差)。
    • 关于文中 [xxx.m] 链接:已指向本仓库随附的 PSINS 源码副本(psins260314),点击即可对照阅读。行号锚点(如 #L37)在静态文件下不跳转,请按函数名在文件中检索。

目标: 配合严恭敏老师的 PSINS 工具箱(站内副本见 psins260314),为其中 11 个最核心 .m 函数提供逐行中文注释 + 数学公式 + 断点调试建议 + 坑点 + 验证练习题。

📌 PSINS 版本说明:本 Wiki 基于随附的 PSINS 源码副本 psins260314(版权日期 2024-04-25,psins.m L13)。如果你使用的是 psins260705 等更新版本,核心函数(insupdate/cnscl/earth 等)的算法逻辑一致,个别行号可能因新增代码而偏移,请对照源码调整。insupdate.m 的关键修订标注在代码注释中(如 L28 和 L38 的 2014-11-30),这些修订自 2014 年起已稳定。


🚦 学习路线图(严格按这个顺序读!)

阶段 文件编号 文件名 对应源码 一句话定位
L0 · 基础 (1天) 00a INS 基础概念入门 新手扫盲篇:圆锥/划桨/舒勒/陀螺加计指标全谱,必须在 00 之前读
L0 · 基础 00b 坐标变换与旋转矩阵 第一步坑:东北天手性/主动vs被动/\((\phi-\theta)\)推导/被动=主动转置/三步法写旋转矩阵,读完不再怕 \(-\sin\theta\) 符号
L0 · 基础 00 glvf 逐行注释 glvf.m 所有全局常量和单位换算,全局地基!
L0 · 基础 01 earth 逐行注释 earth.m 地球曲率/地转角速度/重力/重力异常 全部入口
L0.5 · 航姿 AHRS (3天) 11 Mahony 互补滤波 MahonyUpdate.m 做航姿板必看! PI 互补滤波,简单易懂,先上这个验证硬件
L0.5 · 航姿 AHRS 12 QEKF 四元数 EKF QEAHRSUpdate.m Mahony 升级版:7 状态 EKF,精度更高,显式估零偏
L1 · 纯惯导 SINS (1个周) 02 cnscl 逐行注释 cnscl.m 圆锥+划桨+旋转补偿,IMU数据进入SINS的第一扇门
L1 · 纯惯导 SINS 03 insupdate 逐行注释⭐⭐⭐ insupdate.m 最核心! 姿态-速度-位置三连更新全部实现,48行=SINS全部算法
L1 · 纯惯导 SINS 04 insinit 逐行注释 insinit.m ins结构体初始化/字段全览/默认参数
L1 · 纯惯导 SINS 05 inspure 逐行注释 inspure.m 纯惯导主循环封装,如何批量跑n次insupdate
L2 · 航位推算 DR (3天) 06 drupdate 逐行注释 drupdate.m 陀螺方位+里程计→位置,无舒勒线性发散
L3 · 组合导航 KF (2个周) 07 kfinit(153) 逐行注释 kfinit.m 15状态P0/Q0/R0初始化,SINS/GPS松组合
L3 · 组合导航 KF 08 kffk 逐行注释⭐⭐ kffk.m 连续误差方程F阵离散化,时间更新核心1
L3 · 组合导航 KF 09 kfupdate 逐行注释⭐⭐⭐ kfupdate.m KF五公式全部实现,卡尔曼滤波的全部内容就在这103行
L3 · 组合导航 KF 10 kffeedback 逐行注释⭐⭐ kffeedback.m ESKF灵魂:把误差状态反馈回主状态+清零

📦 文件列表(绝对路径)

  • ./00a_INSBasics.md新手扫盲前置阅读:圆锥/划桨补偿推导 + 舒勒振荡物理直觉 + 陀螺加计指标全谱(ARW/VRW/零偏/SF)+ Allan方差 + 指标→位置误差换算例题
  • ./00b_CoordRot.md坐标变换第一步:东北天/北东地手性验证 + 主动vs被动变换 + \((\phi-\theta)\)投影推导 + 被动=主动转置证明 + 三步法写旋转矩阵 + 配套双滑块交互可视化
  • ./00_glvf.md — WGS84参数、单位换算、圆锥系数表、默认初始位置
  • ./01_earth.md — wnie/wnen/wnin/wnien/gcc 地球参数 36行一行不漏
  • ./02_cnscl.md — 圆锥/划桨/旋转 不可交换性补偿 87行
  • ./03_insupdate.mdPSINS皇冠之珠,姿态/速度/位置三连更新48行
  • ./04_insinit.md — SINS结构体ins字段全览+初始化
  • ./05_inspure.md — 纯惯导主循环,子步解算+avp打包存储
  • ./06_drupdate.md — 航位推算DR,用于SINS/DR松组合/OD辅助
  • ./07_kfinit_153.md — 15状态ESKF初始化P0/Q0/R0/Hk
  • ./08_kffk.md — F阵→Φ离散化,expm与一阶近似的取舍
  • ./09_kfupdate.md卡尔曼滤波完整实现,时间/量测/自适应/对称化/P约束
  • ./10_kffeedback.mdESKF和EKF的本质区别,反馈清零机制
  • ./11_Mahony.mdMahony 互补滤波 AHRS:PI 控制器推导 + 传递函数 + 叉积误差推导 + 自适应详解
  • ./12_QEAHRS.mdQEKF 四元数 EKF AHRS:7 状态 EKF + \(\Phi\)/\(H\)/\(R\) 矩阵完整推导 + 自适应 R

🎯 使用方法(严格三步走)

Step1 先读 Wiki 数学原理:每个 wiki 的"📐 数学原理"先读一遍,公式对照符号表看明白。不要一上来就跑代码,数学关系没搞清楚,断点看数值也不知道对不对。

Step2 设断点跑 demo:打开 test_SINS.m / test_SINS_GPS_153.m,按 Wiki 里的"🔍 断点调试建议"在指定行设断点,F10 步进,观察变量的实际数值和 wiki 说的数量级是否一致。

Step3 做配套练习:每个 wiki 最后"🎯 配套练习"必须亲手敲一遍跑通,这是最有效的巩固方式,不做题=没学会。

配套的 demo(PSINS 自带)路径: - 航姿 AHRS(做航姿板从这里开始): test_AHRS_Mahony.m(互补滤波,简单易懂)→ test_AHRS_QEKF.m(四元数EKF,精度更高) - 核心函数: MahonyInit.m / MahonyUpdate.m / QEAHRSInit.m / QEAHRSUpdate.m - 纯惯导入门: test_SINS_trj.mtest_SINS.m - DR 基础: test_DR.m / test_SINS_DR.m - 组合导航入门: test_SINS_GPS_153.m


🧪 配套 civil_wiki 学习资料交叉验证

本 Wiki 与 GitHub 仓库 wild-civil/civil_wiki/惯导 assets 完美互补,建议两组代码用同一组数据跑一遍做交叉验证,保证两边理解一致:

本 Wiki 文件 civil_wiki 对应代码 交叉验证方式
03_insupdate.md pure_ins_demo.c 同一组 wm/vm(比如 100Hz 直线 10s 零偏),两边各跑一遍,qnb/vn/pos 逐位对照误差 <2%
02_cnscl.md attitude_update_demo.c 5°锥角双子样,rv2q(qerr_phi) 误差分别 <1e-6 rad
07 + 08 + 09 + 10 四件套 KF gen_ekf_vs_eskf_py.py 4状态小车模型(位置/速度/加速度零偏 2 组),MATLAB 跑 kfinit + kffk + kfupdate + kffeedback vs Python 独立实现,两边 xk 最终 RMSE <1e-9

🧭 统一术语表(贯穿所有 Wiki)

符号 中文名 单位(PSINS内部约定) 常见下标/后缀
qnb / Cnb / att b系到n系的四元数/方向余弦阵/欧拉角(roll,pitch,yaw) — / — / rad q⁻先验 / q⁺后验
vn n系速度 [vn;ve;vd](北东地) m/s δvn = vn_nom − vn_true
pos 位置 [L;λ;h](纬/经/高) rad / rad / m δL, δλ = rad;δh = m
φ 平台失准角 [φx;φy;φz] rad 小误差量,ESKF前3态
eb (εb) 陀螺三轴零偏 rad/s 第10~12态
db (∇b) 加计三轴零偏 m/s² 第13~15态
xk ESKF误差状态向量(先验/后验均值) 按分量 反馈后对应部分=0
Pxk ESKF误差状态协方差阵 分量单位² 不清零
Φk (Phikk_1) 状态转移矩阵 Φk = e^{F·nts} kffk.m 输出
Hk 量测矩阵 kfhk.m 输出,153 时 Hk=[0 0 I_{3×3}]
Kk 卡尔曼增益 K = P⁻Hᵀ(HP⁻Hᵀ+R)⁻¹
fbstr 反馈字符 字符 a/v/p/e/d/A/V/P/E/D/L/T/G/C/h/H
T_fb 反馈间隔 s 默认1秒;=0 开环不反馈
coef_fb 比例反馈系数 (0,1] AR(1)渐进:T_fb/xtau 或 1
avp att + vn + pos 打包 混合 [att(3); vn(3); pos(3)] = 9×1

重要符号约定提醒:PSINS ESKF 中 δx = x_nominal − x_true,所以反馈公式是 x_corrected = x_nominal − δx_hat;不要和某些教材 δx = x_true − x_nominal 混用,差一个符号。kffeedback.m 里速度/位置用减号,零偏/杆臂用加号,务必严格对应 wiki 里的表格,不要凭直觉改号。