【4】lightning_lm项目-LIO 前端 - 深入学习 ESKF 滤波器
文章目录阶段二LIO 前端 - 深入学习 ESKF 滤波器一、ESKF 整体结构二、核心函数 1Predict() - IMU 预测三、核心函数 2Update() - 激光观测更新四、ESKF 的几个关键技巧总结五、ESKF 与普通卡尔曼滤波的区别重点总结下一步阶段二LIO 前端 - 深入学习 ESKF 滤波器深入学习 ESKF误差状态卡尔曼滤波器的具体实现。这是整个 LIO 系统的核心算法一、ESKF 整体结构看 eskf.hpp先看类的成员变量NavState x_;// 状态量名义状态CovType P_CovType::Identity();// 协方差矩阵CustomObsFunction lidar_obs_func_;// 激光观测函数booluse_aa_false;// 是否用 Anderson 加速关键点 x_ 是名义状态nominal state估计的是「误差状态」然后加到名义状态上这种方法叫做「误差状态卡尔曼滤波」Error-State Kalman Filter二、核心函数 1Predict() - IMU 预测看 eskf.ccvoidESKF::Predict(constdoubledt,constProcessNoiseTypeQ,constVec3dgyro,constVec3dacce);这一步做什么 用 IMU 数据预测下一时刻的状态和协方差。步骤详解计算运动方程Eigen::Matrixdouble,NavState::full_dim,1f_x_.get_f(gyro,acce);Eigen::Matrixdouble,NavState::full_dim,state_dim_f_x_x_.df_dx(acce);Eigen::Matrixdouble,NavState::full_dim,process_noise_dim_f_w_x_.df_dw();get_f() 运动方程的导数df_dx() 运动方程对状态的雅可比df_dw() 运动方程对噪声的雅可比名义状态更新NavState x_beforex_;x_.oplus(f_,dt);// 用中值积分更新名义状态计算状态转移矩阵这里代码有点复杂因为要处理 SO(3) 旋转的特殊情况协方差预测P_(F_x1_)*P_*(F_x1_).transpose()(dt*f_w_final)*Q*(dt*f_w_final).transpose();P_*options_.predict_cov_inflation_;// 稍微膨胀一下协方差更鲁棒SymmetrizeAndFloorCovariance(P_,options_.min_cov_diag_);// 保持对称并防止协方差太小三、核心函数 2Update() - 激光观测更新看 eskf.cc这是最复杂、最关键的函数这是一个 迭代优化 的过程注意 循环从 i -1 开始为什么第 -1 次迭代计算初始残差不更新状态后面迭代真正更新状态迭代优化步骤计算观测模型if(obsObsType::LIDAR){lidar_obs_func_(x_,custom_obs_model_);// 调用 ObsModel()}这里会调用之前看到的 LaserMapping::ObsModel() 函数检查收敛if(use_aa_i-1...residual变大了){x_last_x;// 如果残差变大回退到上一步break;}计算误差状态StateVecType dxx_.boxminus(start_x);// 当前状态与起始状态的差处理 SO(3) 的误差因为旋转是在流形上需要特殊处理for(autoit:x_.SO3_states_){intidxit.idx_;Vec3d seg_SO3dx.block3,1(idx,0);Mat3d res_temp_SO3math::A_matrix(seg_SO3).transpose();dx_current.block3,1(idx,0)res_temp_SO3*dx.block3,1(idx,0);// 同样更新 P 矩阵...}处理退化情况这是一个非常高级的技巧Eigen::SelfAdjointEigenSolverMat6deigen_solver(HTH_sym);constVec6d eigen_valueseigen_solver.eigenvalues();constdoublemax_eigen_valuestd::max(1e-12,eigen_values.maxCoeff());constdoubledegeneracy_thresholdmax_eigen_value*options_.degeneracy_threshold_ratio_;// 找出可观测的方向Vec6d observable_maskVec6d::Zero();for(intk0;kobservable_mask.size();k){if(eigen_values(k)degeneracy_threshold){observable_mask(k)1.0;}}// 只在可观测的方向上更新constMat6d observable_projectoreigen_vectors*observable_mask.asDiagonal()*eigen_vectors.transpose();constMat6d HTH_effobservable_projector*HTH_sym*observable_projector;constVec6d HTr_effobservable_projector*HTr;为什么要这样 有时候某些方向上观测很差退化如果强行更新会把状态改坏所以只在观测好的方向上更新计算卡尔曼增益并更新CovType P_temp(P_/R).inverse();P_temp.blockpose_obs_dim_,pose_obs_dim_(0,0)HTH_eff;CovType Q_invP_temp.inverse();// 计算增益K_rQ_inv.templateblockstate_dim_,pose_obs_dim_(0,0)*HTr_eff;K_H.setZero();K_H.templateblockstate_dim_,pose_obs_dim_(0,0)Q_inv.templateblockstate_dim_,pose_obs_dim_(0,0)*HTH_eff;// 更新状态dx_currentK_r(K_H-Eigen::Matrixdouble,state_dim_,state_dim_::Identity())*dx_current;限制更新步长constdoubledx_translationdx_current.head3().norm();constdoubledx_rotation_degdx_current.segment3(3).norm()*180.0/M_PI;if(dx_translationoptions_.max_update_translation_step_||dx_rotation_degoptions_.max_update_rotation_step_deg_){x_start_x;// 如果步长太大拒绝更新return;}这很重要 防止一次更新把状态改飞了Anderson 加速if(!use_aa_){x_x_.boxplus(dx_current);// 普通更新}else{x_x_.boxplus(dx_current);if(i-1){aa_.init(dx_current);}else{autodx_allx_.boxminus(start_x);autonew_dx_allaa_.compute(dx_all);// Anderson 加速x_start_x.boxplus(new_dx_all);}}Anderson Acceleration 是什么 一种数值加速方法让迭代更快收敛利用过去几次的迭代结果预测一个更好的更新方向通常能让迭代次数减少一半检查收敛custom_obs_model_.converge_true;for(intj0;jstate_dim_;j){if(std::fabs(dx_current[j])limit_[j]){custom_obs_model_.converge_false;break;}}更新协方差L_P_;// ... 处理 SO(3) ...P_L_-K_H.blockstate_dim_,pose_obs_dim_(0,0)*P_.templateblockpose_obs_dim_,state_dim_(0,0);四、ESKF 的几个关键技巧总结五、ESKF 与普通卡尔曼滤波的区别重点总结Predict 过程 IMU 积分预测状态和协方差Update 过程 迭代优化用激光观测修正状态关键技巧 误差状态表示退化处理更新步长限制Anderson 加速协方差处理 对称化、限幅、退化时膨胀下一步下次可以学习IMU 处理模块 imu_processing.hpp 点云预处理模块 pointcloud_preprocess.h/cc IVox 局部地图 ivox3d.h

相关新闻

模板驱动型文档自动化:结构化内容+智能逻辑+动态交付

模板驱动型文档自动化:结构化内容+智能逻辑+动态交付

1. 项目概述:当文档生产变成“填空游戏”,我们到底省下了什么?你有没有经历过这种场景:每周一早上,市场部同事准时把一份PDF格式的《行业周报模板》甩进群,附言“请按格式更新数据,周三前交”。…

2026/7/13 23:51:09 阅读更多 →
PyAutoGUI 0.9.54 自动化实战:5步构建跨平台GUI测试脚本(附防误触策略)

PyAutoGUI 0.9.54 自动化实战:5步构建跨平台GUI测试脚本(附防误触策略)

PyAutoGUI 0.9.54 自动化实战:5步构建跨平台GUI测试脚本(附防误触策略)在软件开发的生命周期中,GUI测试往往是最耗时且容易出错的环节之一。想象一下,当你需要反复验证一个包含数十个表单页面的应用程序时,…

2026/7/13 23:51:09 阅读更多 →
使用MT管理器脱壳360加固App:内存DUMP与Dex修复实战

使用MT管理器脱壳360加固App:内存DUMP与Dex修复实战

1. 项目概述与核心思路最近在逆向分析圈子里,360加固的App一直是个绕不开的话题。很多开发者为了保护自己的应用,会选择使用360加固这类商业方案,它就像给App穿上了一套“盔甲”,把核心的Java代码(Dex文件)…

2026/7/13 23:49:08 阅读更多 →

最新新闻

【STM32HAL开发】学习笔记(3)——串口

【STM32HAL开发】学习笔记(3)——串口

1.串口的含义串口是一种设备通信的接口,包含发送与接收功能。串口通信以数据帧的形式进行,每一帧数据包含1位起始位、8/9位数据位以及0.5/1/1.5/2位停止位,加粗是常用形式。串口处于空闲状态(高电平),起始位…

2026/7/14 6:29:30 阅读更多 →
【2013-12-17】设计模式学习笔记:组合模式

【2013-12-17】设计模式学习笔记:组合模式

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2013-12-17 | 标题:设计模式学习笔记:组合模式 | 分类: 编程 / 设计模式 / java &…

2026/7/14 6:29:30 阅读更多 →
C++ CAD数据交换:libdxfrw库读写DXF/DWG文件实战指南

C++ CAD数据交换:libdxfrw库读写DXF/DWG文件实战指南

1. 项目概述:为什么你需要关注 libdxfrw?如果你正在用 C 开发与 CAD 数据打交道的应用,无论是做机械设计软件、建筑信息模型(BIM)工具、数控(CNC)加工路径生成,还是游戏引擎的地图编…

2026/7/14 6:27:29 阅读更多 →
stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时

stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时

1. 项目概述:为什么我们需要一个纯C/C的Stable Diffusion推理库?如果你玩过AI绘画,大概率用过Stable Diffusion WebUI或者ComfyUI。它们功能强大,但背后依赖的是Python、PyTorch这一整套庞大的生态。启动慢、内存占用高、环境配置…

2026/7/14 6:25:29 阅读更多 →
可白嫖源码---课程设计--毕业设计--21926品牌车衣供应商直播带货及线下店管理系统(案例分析)-附源码

可白嫖源码---课程设计--毕业设计--21926品牌车衣供应商直播带货及线下店管理系统(案例分析)-附源码

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 目录 摘 …

2026/7/14 6:23:29 阅读更多 →
多维聚合与滚动计算:银行级数据聚合的工程实践

多维聚合与滚动计算:银行级数据聚合的工程实践

1. 项目概述:为什么多维聚合不是“加个groupby”就能搞定的事我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到后来带团队搭实时风险计算引擎,踩过的坑比写的代码还多。今天聊的这个主题——“多维聚合中的…

2026/7/14 6:21:28 阅读更多 →

日新闻

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:01:13 阅读更多 →
Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

更多请点击: https://codechina.net 第一章:Perplexity 怎么用 Perplexity 是衡量语言模型预测能力的核心指标,数值越低表示模型对文本序列的不确定性越小、预测越精准。它本质上是交叉熵损失的指数形式,计算公式为:…

2026/7/14 0:01:13 阅读更多 →
全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

五一视界发布公告,近日,公司与环天智慧科技股份有限公司(“环天智慧”)正式达成空天领域战略合作。环天智慧是国内领先、聚焦天基对地观测遥感卫星总体研制与在轨运营的商业航天企业,同时也是西南地区规模最大、具备全自主可控遥感卫星星座建…

2026/7/14 0:03:13 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻