专业知识的应用01.为什么要写这个项目
前言
在 C++ 的招聘和实际工作中,经常能听到一种说法:为什么 C++ 程序员难招?
原因之一在于,C++ 应用的领域非常广——游戏引擎、嵌入式、自动驾驶、音视频……不同方向用到的专业知识千差万别。
会写 C++ 语法和会做某个领域内的系统,往往是两回事。
所以本章想做的,不是再讲一遍课本上的理论,而是以组合导航为例,记录自己在写一个具体项目时,真正用到了哪些专业知识,以及这些知识在工程里起什么作用。
具体来说,本章围绕一个练手项目:实现一个简单的 MEMS 惯导与 GNSS 松耦合组合导航程序。
项目目标一句话:在外部给定导航系统初始状态和滤波器初值之后,通过输入 IMU 数据和 GNSS 定位数据,离线得到位置和姿态估计;
目的是复习与巩固组合导航知识,通过实践加深理解,而不是做一个高效、解耦、稳定的产品级程序。
如果你是对「组合导航 / 卡尔曼滤波 / 惯导」有兴趣的 C++ 开发者,或者想看看「某一领域里的知识在实际代码中如何落地」,那么本章的几篇文章就是为你写的。
本章的定位
本章不写课本式的理论推导。
惯导与组合导航的教材已经很多、很全面,例如牛小骥老师的《惯性导航原理与算法设计》,从地球模型、传感器模型、坐标系、姿态表示到惯导解算与滤波,应有尽有。
我们既写不了那么详细,也没必要重复——本章的定位是:写自己在实际写代码时用到的专业知识,以及这些知识在工程里的角色。
因此,后续几篇文章会按「做这个项目时真实用到的知识」来组织,而不是按「惯导教材的目录」来写。
例如:卡尔曼滤波会单独成篇,但只讲在本项目里怎么用(误差状态、预测、更新、对应哪块代码),不推导公式;
惯导解算会写用到了哪些知识(坐标系、姿态表示、地球模型、简单积分)以及没做哪些(安装误差、高阶积分等);
再有一篇会把「名义状态 vs 误差状态」「惯导 + 滤波怎么闭环」串起来,对应到 pose_estimator、filter、ins 等模块。
整体上,练手项目的定位不变:不追求完备和产品化,只求把「实际用到的知识」说清楚。
项目边界
为了把精力集中在组合导航算法本身,这个项目在设计和写作时都遵守了一些边界,在阅读后续文章时可以带着这些前提:
离线运行,依赖外部初始状态
程序不是一个「插上传感器就能跑」的完备导航系统。
没有初始对准模块,不会在订阅到 IMU/GNSS 数据后自动给出姿态与位置;而是依赖外部注入导航系统的初始状态(位置、速度、姿态)以及滤波器的初值(如初始协方差)。
在给定这些之后,程序通过递推 IMU 并融合 GNSS,得到位置和姿态估计。
实验数据使用的是牛小骥老师他们开源的 KF-GINS 中的数据。
没有完整的定位评价与异常降级体系
没有集成一套「系统当前大致是什么水平、遇到异常如何降级」的完整评价与容错机制。
项目里有评估工具(如 eval/ 下的 INS 评估、估计器评估、姿态评估),用于离线对比结果与真值,但这不是在线运行时的健康诊断与降级逻辑。
外参与传感器精度事先配置
GNSS 天线与 IMU 之间的外参(如杆臂)、IMU 与 GNSS 的噪声参数等,都是在配置文件中事先给好的,不在状态估计里在线估计外参。
这样做的原因和实际工程中类似:外参往往事先标定好,可以降低计算量、简化模型,尤其在嵌入式设备上更常见。
建模从简
不会考虑非常多的误差因素,例如传感器的安装误差、尺度因子等;只建模最简单的零偏误差(陀螺零偏、加速度计零偏)。
状态采用经典的 15 维:位置、速度、姿态、陀螺零偏、加表零偏。
融合方式选择最简单的松耦合:只用 GNSS 位置作为观测,与 IMU 的惯导解算结果进行融合。
坐标系与公式参考牛小骥老师的《惯性导航原理与算法设计》,导航系采用北东地(NED),IMU 系采用前-右-下(FRD)。
在代码结构上,核心可以概括为三块:ins(惯导解算,如 ins/pins)、filter(误差状态卡尔曼滤波,如 filter/gi_loose_filter)、pose_estimator(把 INS 和滤波器整合起来,处理 IMU 与 GNSS 数据流);再加上状态定义(state/)、测量与 IO(measurement/、io/)、地球模型与旋转等工具(utils/)。
后续文章会围绕「实际用到了什么知识」分别展开,而不是再写一本惯导教材。
总结
- 动机:C++ 不同方向涉及的专业知识差异很大,本章以组合导航为例,记录自己在小项目里实际用到的专业知识,而不是复述课本。
- 本章定位:写实际运用、不写理论推导;是一个练手项目,用于复习与巩固,不追求完备和产品化。
- 项目边界:离线运行、依赖外部初始状态;无初始对准、无完整评价与降级;外参与传感器精度事先配置;建模从简,仅考虑零偏与松耦合;核心模块为 ins、filter、pose_estimator,对应实际写代码时用到的知识会在后续几篇中说明。

浙公网安备 33010602011771号