# FAST-LIO2多次运行结果不一致，ikd-Tree双线程重建导致非确定性

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-07-01-fast-lio-427
> 频道：pitfalls | 更新日期：2026-07-01 | 标签：auto, github-issue, fast_lio
> 核心摘要：FAST-LIO2同参数运行里程计漂移不定，系ikd-Tree后台重建线程竞态所致，关闭双线程重建可获确定性结果但耗时增加。

# FAST-LIO2多次运行结果不一致，ikd-Tree双线程重建导致非确定性

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Same parameters Different result](https://github.com/hku-mars/FAST_LIO/issues/427)（GitHub hku-mars/FAST_LIO #427）

**状态**：有绕过办法

## 问题

在PC与Jetson Orin NX平台上使用Livox Avia运行FAST-LIO2时，相同参数与数据集下多次运行结果存在显著非确定性，长航时任务尤为明显。用户修复preprocess.cpp中disB未初始化bug并禁用OpenMP后问题依旧。维护者确认根源为ikd-Tree内部rebuild_thread异步修改树结构引发的竞态条件，唯一确定性解法是关闭双线程重建，但这会导致大尺度k-d tree重构极慢。

## 环境

传感器：Livox Avia；算法：FAST-LIO2；平台：x86 PC、NVIDIA Jetson Orin NX (ARM)；关键组件：ikd-Tree、preprocess.cpp、CMakeLists.txt

## 解决办法

1. 确认问题根因为 `ikd-Tree` 内部 `rebuild_thread` 后台线程与主映射循环的异步竞态，而非 OpenMP 或预处理代码错误
2. 关闭 `ikd-Tree` 的双线程重建功能以强制单线程执行，消除非确定性行为
3. 接受关闭双线程重建后大尺度 k-d tree 重构速度显著下降的性能代价
4. 注意仅修复 `preprocess.cpp` 中 `disB` 赋值错误或移除 CMakeLists.txt 中的 `-DMP_EN` 无法解决此特定非确定性问题

讨论原作者：@celikemir 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub hku-mars/FAST_LIO #427：Same parameters Different result](https://github.com/hku-mars/FAST_LIO/issues/427)