【免费下载链接】INSLIB
Open Source Inertial Navigation Library
INSLIB是一款开源的 C 语言惯性导航库,专门用于 IMU+GPS(GNSS)融合导航状态估计。它的核心是一个 15 状态误差状态卡尔曼滤波器(ESKF),能把加速计和陀螺仪数据与 GPS 定位融合成平滑的位置、速度、姿态输出。最让人惊喜的是:你要用到的 API 只有 3 个核心函数——初始化、更新、读取结果,零堆内存分配,可以直接移植到单片机。
下面用一篇文章带你从零跑通它 🚀
什么是 INSLIB?
INSLIB 是一个便携的 C11 库,没有外部依赖、不依赖操作系统、不申请堆内存,整个滤波器就是一个由调用者持有的结构体ins_t。典型应用场景:
- 无人机(UAV)与自动驾驶车辆
- 机器人平台
- 嵌入式系统实时航位推算
- 已录制飞行/驾驶数据的后处理分析
核心特性一览:
| 特性 | 说明 |
|---|---|
| 滤波器 | 15 状态误差状态卡尔曼滤波(ESKF),UDU/平方根形式,数值稳健 |
| 支持传感器 | IMU、GNSS/GPS、磁罗盘、气压计、双天线罗经、轮速里程计 |
| 资源占用 | 无堆、无 OS、32 位浮点即可,适配 MCU |
| 质量保障 | 行覆盖率 99.4%,含 MC/DC 测试(航空 DO-178 风格) |
| GNSS 延迟 | 内置测量延迟补偿,处理 GPS 接收机 100~200 ms 的滞后 |
更多特性与基准测试结果见 readme.md。
第 1 步:获取代码,认识目录结构
用命令克隆仓库(注意--recursive,因为核心线性代数依赖子模块 KFCore):
git clone --recursive https://gitcode.com/gh_mirrors/in/INSLIB克隆完成后,和本文相关的目录是这些:
📂 INSLIB/ ├── src/ # 核心库:ins.c(INS 滤波器)、nav_suite.c 等 │ └── ins.h # ★ API 参考手册,所有函数都在里面 ├── KFCore/ # 子模块:线性代数 + UDU 卡尔曼滤波 ├── datasets/ # 真实 + 仿真数据集,拿来就能回放 ├── tools/ # replay.py 回放工具、后处理 GUI、标定工具 └── tutorial/ # C 语言最小示例教程完整目录说明见 readme.md 的 "Directory Structure" 一节。
第 2 步:只用 3 个核心函数,看懂整个滤波器
INSLIB 的 INS 滤波器(src/ins.c)对使用者的接口非常干净。整个使用过程就是一个循环:
ins_init(&ins, &init, &opt)—— 只调用一次,设置初始位置(经纬高)和滤波参数;ins_update(&ins, &m)—— 每个 IMU 周期调用一次,把加速度计、陀螺仪、GNSS 等测量值打包喂进去;ins_get_latlonh()/ins_get_rpy()—— 随时读取位置(经纬高)和姿态(横滚/俯仰/航向),并用ins_is_ready()确认滤波器已完成热启动。
测量数据放在一个结构体ins_measurements_t里,每个子测量都有is_valid标志位——这一周期有什么传感器数据就填什么,没有的保持无效即可,滤波器只消费你标记有效的部分。官方 C 语言教程 tutorial/c_tutorial.md 中有一个完整的单文件示例,精简后的主干逻辑是:
ins_t ins = {0}; /* 1. 零初始化 */ ins_init(&ins, &init, &opt); /* 2. 设置初始位置 + auto_init 选项 */ for (int k = 1; k <= 1000; ++k) { ins_measurements_t m = {0}; m.acc.is_valid = true; /* 填加速度计数据 (FRD 轴, m/s²) */ m.gyr.is_valid = true; /* 填陀螺仪数据 (rad/s) */ if (k % 100 == 0) m.gnss_pos.is_valid = true; /* 每秒一次 GPS 定位 */ ins_update(&ins, &m); /* 3. 喂给滤波器 */ } ins_get_latlonh(&ins, llh); /* 4. 读取经纬高 */ ins_get_rpy(&ins, &roll, &pitch, &yaw);💡 两个小约定要记住:机体坐标系是FRD(x 前、y 右、z 下),导航坐标系是NED(北、东、下);时间戳是int64微秒,角度是弧度。
为什么要 15 个状态?
"误差状态"卡尔曼滤波连续估计的量包括:
| 状态 | 估计内容 |
|---|---|
| 位置误差 | 局部 NED 坐标系下的位置偏差 |
| 速度误差 | NED 速度偏差 |
| 姿态误差 | 横滚/俯仰/航向的小角度误差 |
| 加速度计偏置 | 3 轴 bias,自动在线估计 |
| 陀螺仪偏置 | 3 轴 bias,自动在线估计 |
你不需要碰这些内部细节——喂进测量值,读出发散前的位置/速度/姿态即可。
第 3 步:编译运行,第一条导航解
INSLIB 不要求任何构建系统,直接把源码文件编译进你的工程即可。按照 tutorial/c_tutorial.md 的示例:
cc -std=c11 -D_GNU_SOURCE \ -Isrc -IKFCore/c -IKFCore/c/navigation_tools \ hello_ins.c \ src/ins.c src/log.c src/geodetic_toolbox.c src/magnetic_model.c \ KFCore/c/linalg.c KFCore/c/kalman_udu.c KFCore/c/miniblas.c \ -lm -o hello_ins ./hello_ins示例输出——位置与 GPS 定位吻合,姿态水平(滤波器在热启动时由加速度计自行调平):
position : lat 49.867378 deg lon 8.638174 deg h 190.0 m attitude : roll 0.00 pitch 0.00 yaw 0.00 deg至此,IMU+GPS 融合导航就跑通了 🎉 如果你还想要纯 Python 版本,直接pip install inslib,教程在 tutorial/python_tutorial.md。
进阶一:GNSS 延迟补偿——容易忽视的关键细节
GPS 接收机由于内部滤波、UART 传输等原因,上报的位置往往滞后真实时刻 100~200 ms 以上。运动越剧烈,不补偿延迟,位置解就越"拖尾"。
INSLIB 内置了延迟估计工具:用气压计+IMU 的垂向速度与 GNSS 垂向速度做互相关,相关性出现尖锐峰值处的滞后就是真实延迟,如下图所示:
在仓库自带的真实行人数据上运行:
python3 tools/replay.py datasets/pedestrian/07_outdoor_only/ --estimate-gnss-delay测出的延迟填入config.yaml的gnss: delay_ms,滤波器会把这个历元的修正"锚定"到状态历史缓冲区里正确的时刻(历史缓冲支持最长 500 ms 延迟,见 src/ins.h)。
进阶二:用后处理 GUI 查看融合结果
写代码只是第一步,INSLIB 自带一个后处理 GUI tools/inspostgui.py:打开数据集的config.yaml,一键回放,还能做前向/后向平滑(RTS 平滑)来提升解算质量。
界面上能同时看到参考轨迹与滤波轨迹的叠加、位置/姿态的 RMS 误差、在线估计的 IMU 偏置和高度曲线。回放命令也很简单:
python3 tools/inspostgui.py datasets/fog轨迹还可以导出 KML 在地球仪上查看,融合导航轨迹直接压在卫星影像上,误差一目了然:
进阶三:IMU 标定(无需转台)
廉价 MEMS IMU 出厂就有偏置、比例因子和轴失准误差,不标定会直接污染滤波结果。INSLIB 自带离线标定工具 tools/inslib_imu_calib.py:把设备静置 20 秒,然后反复"拿起→换姿态→放平"约 20~30 次并记录 CSV,一条命令即可拟合出全部误差参数:
python3 tools/inslib_imu_calib.py --csv mysession/ -o config.yaml避坑清单 ⚠️
官方 readme.md 总结了新手最常踩的坑,重点提醒:
- 时间戳必须单调且同步:所有传感器要对齐到同一个
t_us时钟; - GNSS 延迟必须实测,不要拍脑袋填
delay_ms; - 磁罗盘不标定是航向漂移的头号原因;
- 所有传感器轴要统一到 FRD 机体坐标系,坐标系不匹配会输出"玄学"结果;
- 振动要先低通滤波:高频振动混叠进加速度计会制造"幽灵加速度";
- GNSS 与 IMU 之间的天线杆臂
gnss: leverarm_frd别忘了设置。
下一步学什么?
| 资源 | 路径 | 说明 |
|---|---|---|
| API 参考 | src/ins.h | 所有选项、测量字段、访问器函数的完整文档 |
| C 语言教程 | tutorial/c_tutorial.md | 本文示例的完整版 |
| 姿态入门(仅 IMU) | tutorial/c_attitude_tutorial.md | 最小源文件清单,只需横滚/俯仰时看这个 |
| 封装版 nav_suite | src/nav_suite.h | INS+AHRS+气压通道并行运行,GPS 丢失时优雅降级 |
| 回放数据集 | datasets/ | 无人机、隧道行车、行人等真实数据,replay.py直接跑 |
| 完整手册 | doc/INSLIB_manual.pdf | 滤波器设计与数学背景 |
从零到融合导航解,INSLIB 的核心就是ins_init→ins_update→ins_get_*这三步。剩下的,交给这个 99.4% 覆盖率的滤波器吧 🛰️
【免费下载链接】INSLIB
Open Source Inertial Navigation Library
相关推荐
openpilot传感器融合技术:GPS与IMU数据融合提升定位精度
openpilot传感器融合技术:GPS与IMU数据融合提升定位精度 在自动驾驶系统中,车辆定位精度直接影响行车安全和驾驶体验。单一传感器往往受环境限制:GPS
自动驾驶人工智能深度学习计算机视觉ChipWhisperer-Pro高级功能探索:专业级侧信道分析与故障注入技术
ChipWhisperer Pro高级功能探索:专业级侧信道分析与故障注入技术 ChipWhisperer Pro是一款专业级开源侧信道分析与故障注入工具,集成
网络安全嵌入式硬件开发应用安全BAML快速入门:5个步骤从零开始创建你的第一个AI函数
BAML快速入门:5个步骤从零开始创建你的第一个AI函数 BAML是一个用于构建强类型LLM函数的编程语言,专为AI工作流和智能体设计。它通过将提示工程转变为模
编程语言AI Agent编译器CLI人工智能
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考