type
Post
status
Published
date
Apr 21, 2026
slug
summary
fastlio重定位的代码修改与调试
tags
具身智能
ROS
SLAM
category
项目开发
icon
password

一、心酸的修改经历


notion image
这是我保留的唯一修改,因为原来的代码我自己跑显示没有odometry_loc很奇怪。
 
1.rviz显示问题:原来的点云地图没有在rviz里面加载
notion image
左边是我建图,只有在运行前启动rviz才会显示出来,如果我没有启动rviz,它就会打开fastlio自带的rviz,如下图所示,看不出有没有重定位成功。
notion image
这个问题在我做了2中的修改之后居然解决了。
 
2.代码报错
见上图爆红和爆黄,我做了以下两处修改
notion image
notion image
rviz显示如下,起码能够看出有定位了。(左边是一直开着的,右边是跟代码一起开的fastlio的)
notion image
但是一直报下面的问题,我不太能确定重定位是否真的生效还是单纯的fastlio的里程计在作用
notion image
然后我更换了初始点,发现左侧没有反应,说明重定位应该没有生效。(右侧是fastlio的mapping的rviz,是实时的)
notion image
最后我把fastlio的rviz给禁用了,但是最后是程序不启动rviz。
 
经邮件询问原项目作者实测没有问题,并且现在还再用,因此我认为核心问题已经不在代码,而在于配置。但是我不能准确定位到具体是哪个位置导致这一系列的问题出现,感觉目前我一直在解决表象的报错而已。
 

二、成功案例的学习


非常感谢小怀同学的帮助,这个代码已经彻底跑通了。下面我们来分析一下这个代码是如何修改的。
 
1.防止空数据导致的程序崩溃
  • 之前的痛点:因为初始坐标偏差,60米的裁剪刀(Crop)一旦切到空气,得出 0 个点,送进匹配算法就会瞬间 core dumped。
  • 朋友的解法:他保留了原作者的 Crop 和 60米裁剪框(这能保证后续极快的运算速度),但在切完之后,立刻加了一把“安全锁”
  • 如果目标点云过大,随机下采样到指定数量,保持分布一致性。
  • 学到了什么:不要试图去消除“切到空气”这种物理现象(因为操作员肯定会有瞎点的时候),而是拥抱异常并优雅处理它。遇到空数据,直接报个警然后 continue 等下一帧,绝不崩溃。
 
2.统一法向量并保证统一基准方向
  • 之前的痛点:即使我们加上了 EstimateNormals 算出法向量,有时候匹配还是会飞掉或者崩溃。
  • 朋友的解法:他在计算法向量的代码后面,加上了一句极其核心的函数。
  • 如果目标点云没有法线,估计法线并统一朝向。
  • 学到了什么:普通的 EstimateNormals 算出来的面朝向是随机的(有的朝里,有的朝外)。而在“点到面(Point-to-Plane)”ICP 算法的底层数学公式中,如果两面墙的法向量刚好反了,算法会算出排斥力,导致点云被推得远远的。OrientNormalsToAlignWithDirection() 强行把所有法向量梳理成朝向同一个基准方向,这是高级点云匹配中必不可少的一步
 
3.底层的除零防御(NaN 陷阱拦截)
  • 之前的痛点:卡尔曼滤波(Kalman Filter)在某些极端情况下(比如机器人原地长期静止,或者协方差突然急剧变小),可能会出现分母为 0,导致算出 NaN(Not a Number),进而让整个坐标系炸毁。
  • 朋友的解法:在自定义的 KalmanFilter 类中,他修改了 inputLatestNoisyMeasurement 函数。
  • 学到了什么:在 C++ 中写数学和矩阵推导时,永远不要相信除法!加上 1e-10 的微小阈值判断,是防止机器人系统因为数学异常而“脑死亡”的经典工程经验。
 
“在实现基于 Open3D 的全局重定位系统时,我解决了原始开源算法在实车部署中的三大鲁棒性挑战:
  1. 数据异常崩溃问题:针对因初始位姿偏差导致点云裁剪为空引发的 Core Dumped 问题,我在核心配准循环中引入了基于 IsEmpty() 的生命周期守护机制,将致命错误降级为警告,保障了系统的持续运行。
  1. 点到面匹配特征缺失问题:FAST-LIO 默认不输出法向特征,导致高阶 ICP 求解失败。我在算法中加入了动态特征估计,并重点利用 OrientNormalsToAlignWithDirection() 对法向量进行了方向归一化,消除了配准时的梯度发散问题。
  1. 底层数学极点崩溃问题:在 Odom 到 Map 坐标系转换的卡尔曼滤波融合中,增加了针对协方差分母的 < 1e-10 的奇异值拦截,彻底杜绝了 NaN 坐标毒化整个 TF 树的隐患。
  1. 静态 TF 发布器:“针对 SLAM 算法输出坐标系(camera_init)与 ROS 导航标准坐标系(odom)不统一的问题,在 Launch 启动项中部署了静态坐标变换节点,实现了坐标链的无损闭环,确保了重定位结果能正确补偿到全局导航堆栈中。”
 
💡
有关问题,欢迎您在底部评论区留言,一起交流~
Loading...
Koreyoshi
Koreyoshi
一个普通的干饭人🍚
Announcement
🎉写给自己的2026心愿🎉
学一门乐器
拍摄人生照片
义工旅游一个月
在北京交很多新朋友
学习胡闹厨房建模和贴图
----- 2026 ------
👏希望我们一起变好👏