🚀 Fast-LIO 安装与运行指南
我之前已经创建并使用原有的工作空间 catkin_ws,如果没有创建一个。
使用环境 ubantu20.04 ros1 noetic版本
我作的是要在已有的 ~/catkin_ws
中编译 原版 FAST-LIO(来自 HKU-MARS 官方仓库)。
最终下载官方文档中的示例文件:建议安装前阅读一下
https://drive.google.com/drive/folders/1CGYEJ9-wWjr8INyan6q1BZz_5VtGB-fP
官方git地址:建议安装前阅读一下
https://github.com/hku-mars/FAST_LIO
下面是一份 基于你现有工作空间的完整安装步骤。
🔹 在 ~/catkin_ws
中安装 FAST-LIO(原版)
1. 进入工作空间
cd ~/catkin_ws/src
2. 克隆 FAST-LIO
git clone https://github.com/hku-mars/FAST_LIO.git
此时 ~/catkin_ws/src
下会多出 FAST_LIO
文件夹。
3. 安装依赖
如果你已经装了 ROS,一般会自带 PCL 和 Eigen,无需重复安装。只需查看具体版本等,版本之间还有适配问题,编译fastlio时候出问题建议先看后面出现过的问题。一般pcl会要求eigen是3.3.10的或以上,这里第一部安装的或者原有的多半版本较低,后面如果报错在解决也可以。
(1) Eigen
sudo apt install libeigen3-dev
(2) PCL
Ubuntu 20.04 默认 PCL=1.10.0,一般满足需求:
sudo apt install libpcl-dev
(3) Sophus(必需)
cd ~/catkin_ws/src
git clone https://github.com/strasdat/Sophus.git
cd Sophus
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
(4) Livox-SDK & Livox ROS Driver
⚠️ 如果要用 Livox 激光雷达,必须安装。
# SDK
cd ~/catkin_ws/src
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install# ROS Driver
cd ~/catkin_ws/src
git clone https://github.com/Livox-SDK/livox_ros_driver.git
cd ~/catkin_ws
catkin_make
然后写入 ~/.bashrc
,避免忘记 source:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
4. 编译 FAST-LIO
回到工作空间根目录:
cd ~/catkin_ws
catkin_make
5. 运行 FAST-LIO
(1) Source 环境变量
source ~/catkin_ws/devel/setup.bash
(2) 启动 FAST-LIO
假设你用 Livox Avia 激光雷达:
roslaunch sfast_lio mapping_avia.launch
在另一个终端播放 rosbag 数据:
rosbag play 你下载的或者自己的数据名字.bag
源码的测试数据下载地质:https://drive.google.com/drive/folders/1CGYEJ9-wWjr8INyan6q1BZz_5VtGB-fP 任意一个即可。
5. 注意事项
-
编译顺序
- 先安装 Eigen / PCL
- 再编译 Livox SDK + Livox ROS Driver
- 最后编译 FAST-LIO
-
环境变量
- 每次开新终端记得
source
,建议写到~/.bashrc
- 每次开新终端记得
-
Sophus
-
如果没有 Sophus,需要先安装:
git clone https://github.com/strasdat/Sophus.git cd Sophus mkdir build && cd build cmake .. make sudo make install
-
📌 建议你按照我整理的步骤来操作,能大概率一次跑通。
Sophus版本问题、cmake版本问题、sim3问题
**
首先千万不要升级cmake,因为后面很多包都指定他的版本,贸然升级会带来很多麻烦。
**
看到了 👍,你这里 Sophus 报错:
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):CMake 3.24 or higher is required. You are running version 3.16.3
这是因为 系统自带的 CMake (3.16.3, Ubuntu 20.04 默认版本) 太低,而 Sophus 的最新版要求 CMake ≥ 3.24。
解决方案有两个方向:
✅ 方案 1:使用老版本的 Sophus(推荐)
FAST-LIO 并不需要 Sophus 的最新版,用旧版本即可。
在 ~/catkin_ws/src
下删除原来的 Sophus,然后切换到合适的 tag:
cd ~/catkin_ws/src
rm -rf Sophus
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff # 这个版本常用于 FAST-LIO,兼容 CMake 3.16
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
✅ 方案 2:升级 CMake(不太推荐)
如果你坚持用 Sophus 最新版,需要升级 CMake。Ubuntu 20.04 默认是 3.16,可以手动升级:
sudo apt purge cmake
sudo snap install cmake --classic
cmake --version # 应该会显示 3.28+
然后重新编译 Sophus。
🚀 建议
我推荐 方案 1(换旧版 Sophus),这样不需要动 CMake,和 ROS/FAST-LIO 的兼容性最好。
要不要我帮你直接查一下 最适合 FAST-LIO 的 Sophus 版本号,然后你就按我给的版本去 git checkout
?
最后解决成功的方法是切换Sophus到旧版本,然后会报sim3的错误,不要注释和删除文件,将cmakelist中的 一行注释调。
#ADD_DEFINITIONS("-Wall -Werror -Wno-unused-variable
-Wno-unused-but-set-variable -Wno-unknown-pragmas ")
SET(PROJECT_NAME Sophus)PROJECT(${PROJECT_NAME})
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)SET (CMAKE_VERBOSE_MAKEFILE ON)IF( NOT CMAKE_BUILD_TYPE )SET( CMAKE_BUILD_TYPE Release )
ENDIF()IF (CMAKE_COMPILER_IS_GNUCXX )SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG ")#ADD_DEFINITIONS("-Wall -Werror -Wno-unused-variable# -Wno-unused-but-set-variable -Wno-unknown-pragmas ")
ENDIF()################################################################################
# Add local path for finding packages, set the local version first
set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" )
list( APPEND CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" )################################################################################
# Create variables used for exporting in SophusConfig.cmake
set( Sophus_LIBRARIES "" )
set( Sophus_INCLUDE_DIR ${PROJECT_SOURCE_DIR} )#################################################################################SET (INCLUDE_DIRS "../eigen3.1/")
find_package( Eigen3 REQUIRED )
INCLUDE_DIRECTORIES( ${EIGEN3_INCLUDE_DIR} )
SET( Sophus_INCLUDE_DIR ${Sophus_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR} )SET (SOURCE_DIR "sophus")
SET (CLASSES so2se2se3so3scso3sim3
)SET (SOURCES)FOREACH(class ${CLASSES})LIST(APPEND SOURCES ${SOURCE_DIR}/${class}.cpp ${SOURCE_DIR}/${class}.h)
ENDFOREACH(class)LINK_LIBRARIES (${PROJECT_NAME} ${LIBS})set( Sophus_LIBRARIES ${Sophus_LIBRARIES} ${LIBS} )INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
ADD_LIBRARY(${PROJECT_NAME} SHARED ${SOURCES})ADD_EXECUTABLE(test_so2 sophus/test_so2.cpp)
ADD_EXECUTABLE(test_se2 sophus/test_se2.cpp)
ADD_EXECUTABLE(test_so3 sophus/test_so3.cpp)
ADD_EXECUTABLE(test_scso3 sophus/test_scso3.cpp)
ADD_EXECUTABLE(test_se3 sophus/test_se3.cpp)
ADD_EXECUTABLE(test_sim3 sophus/test_sim3.cpp)
ENABLE_TESTING()ADD_TEST(test_so2 test_so2)
ADD_TEST(test_se2 test_se2)
ADD_TEST(test_so3 test_so3)
ADD_TEST(test_scso3 test_scso3)
ADD_TEST(test_se3 test_se3)
ADD_TEST(test_sim3 test_sim3)##############################################################################
# Get full library name
GET_TARGET_PROPERTY( FULL_LIBRARY_NAME ${PROJECT_NAME} LOCATION )
set( Sophus_LIBRARIES ${Sophus_LIBRARIES} ${FULL_LIBRARY_NAME} )
set( Sophus_LIBRARY_DIR ${PROJECT_BINARY_DIR} )################################################################################
# Create the SophusConfig.cmake file for other cmake projects.
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/SophusConfig.cmake.in${CMAKE_CURRENT_BINARY_DIR}/SophusConfig.cmake @ONLY IMMEDIATE )
export( PACKAGE Sophus )INSTALL(DIRECTORY sophus DESTINATION ${CMAKE_INSTALL_PREFIX}/include FILES_MATCHING PATTERN "*.h" )
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib )
Eigen 版本过低问题,与PCL不兼容
error: ‘Index’ is not a member of ‘Eigen’; did you mean ‘flann::Index’?
for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
从新的错误日志来看,核心问题是 Eigen 版本与 PCL 版本不兼容,导致编译器无法识别 Eigen::Index
类型。以下是具体分析和分步解决方法:
一、错误原因解析
错误日志中关键信息:
error: ‘Index’ is not a member of ‘Eigen’; did you mean ‘flann::Index’?
for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
Eigen::Index
是 Eigen 3.3.9 及以上版本 才引入的类型(用于表示矩阵/向量的索引,替代传统的int
)。- 你的环境中可能安装了 低版本 Eigen(如 3.3.7 或更早),而当前使用的 PCL 1.10 版本依赖
Eigen::Index
,导致类型未定义错误。
二、解决步骤(核心:升级 Eigen 到兼容版本)
步骤 1:检查当前 Eigen 版本
先确认系统中已安装的 Eigen 版本,执行命令:
# 查看 Eigen 版本文件
cat /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h | grep EIGEN_WORLD_VERSION -A 2
- 输出格式如下,若
EIGEN_WORLD_VERSION=3
、EIGEN_MAJOR_VERSION=3
、EIGEN_MINOR_VERSION<9
(如 7),则版本过低,需升级:#define EIGEN_WORLD_VERSION 3 #define EIGEN_MAJOR_VERSION 3 #define EIGEN_MINOR_VERSION 7 // 低于 9,需升级
步骤 2:卸载旧版本 Eigen(可选,避免冲突)
若旧版本 Eigen 安装在 /usr/local/include/eigen3
,执行以下命令删除(注意:若其他软件依赖旧版本,需谨慎,可跳过此步直接覆盖安装):
sudo rm -rf /usr/local/include/eigen3
sudo rm -rf /usr/local/lib/cmake/eigen3 # 清除 CMake 配置
步骤 3:安装 Eigen 3.3.9(兼容 PCL 1.10 的稳定版本)
-
下载 Eigen 3.3.9 源码包:
cd ~/Downloads # 进入下载目录 wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz
-
解压并编译安装:
tar -zxvf eigen-3.3.9.tar.gz # 解压 cd eigen-3.3.9 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local # 安装到系统默认路径 sudo make install # 安装(需管理员权限)
-
验证安装:
再次执行步骤 1 的版本检查命令,确认版本已更新为 3.3.9:cat /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h | grep EIGEN_WORLD_VERSION -A 2
正确输出应为:
#define EIGEN_WORLD_VERSION 3 #define EIGEN_MAJOR_VERSION 3 #define EIGEN_MINOR_VERSION 9
步骤 4:清理 fast_lio 旧编译缓存并重新编译
由于之前编译残留了旧 Eigen 版本的配置,需先清理缓存,再重新编译:
# 进入工作空间,清理 fast_lio 的编译目录
cd ~/catkin_ws
rm -rf build/fast_lio devel/.private/fast_lio # 删除旧编译文件和devel文件# 重新编译 fast_lio(或整个工作空间)
catkin build fast_lio # 仅编译 fast_lio,速度更快
# 或 catkin build # 编译整个工作空间
从执行的命令结果来看,当前系统安装的 Eigen 版本是 3.2.10(EIGEN_WORLD_VERSION=3, EIGEN_MAJOR_VERSION=2, EIGEN_MINOR_VERSION=10),这个版本远低于 PCL 1.10 所需的 Eigen 3.3.9 及以上版本,这正是导致 Eigen::Index
未定义错误的根本原因(Eigen::Index
是 Eigen 3.3 系列才引入的特性,3.2 版本完全不支持)。
需要按照以下步骤彻底替换为 Eigen 3.3.9 版本,才能解决编译错误:
一、彻底删除旧版本 Eigen 3.2.10
由于旧版本 Eigen(3.2.10)安装在系统默认路径 /usr/local/include/eigen3
,必须先完全删除,避免新版本安装后仍被优先调用:
# 1. 删除 Eigen 头文件目录(核心步骤)
sudo rm -rf /usr/local/include/eigen3# 2. 删除 Eigen 的 CMake 配置文件(避免编译时引用旧配置)
sudo rm -rf /usr/local/lib/cmake/eigen3
sudo rm -rf /usr/local/share/eigen3# 3. 检查是否有其他残留(可选,确保彻底删除)
sudo find /usr/local -name "*eigen*" | grep -E "eigen3|Eigen" # 查看残留文件
# 若输出其他与 Eigen 3.2.10 相关的路径,可手动删除(注意不要误删其他文件)
二、重新安装 Eigen 3.3.9(兼容 PCL 1.10 的稳定版本)
步骤 1:下载 Eigen 3.3.9 源码
# 进入下载目录(如 ~/Downloads,方便后续操作)
cd ~/Downloads# 下载 Eigen 3.3.9 源码包(通过官方链接,确保文件完整)
wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz
步骤 2:解压并编译安装
# 解压源码包
tar -zxvf eigen-3.3.9.tar.gz# 进入解压后的目录
cd eigen-3.3.9# 创建 build 目录并编译(Eigen 是头文件库,编译仅生成配置文件,无二进制文件)
mkdir build && cd build# 配置安装路径(默认安装到 /usr/local,与旧版本路径一致,确保后续能被找到)
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local# 执行安装(需管理员权限,将头文件和配置文件复制到系统路径)
sudo make install
三、验证 Eigen 版本是否正确更新
安装完成后,再次执行版本检查命令,确认已替换为 3.3.9:
cat /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h | grep EIGEN_WORLD_VERSION -A 2
正确输出应为(版本号需满足 3.3.9):
#define EIGEN_WORLD_VERSION 3
#define EIGEN_MAJOR_VERSION 3
#define EIGEN_MINOR_VERSION 9
若输出仍为 3.2.10,需重新检查步骤 1 是否彻底删除旧版本,或尝试重启终端后再检查(终端可能缓存了旧路径)。
四、清理 fast_lio 旧编译缓存并重新编译
由于之前的编译过程中已缓存了旧 Eigen 3.2.10 的配置,必须删除缓存后重新编译,否则仍会报错:
# 进入工作空间
cd ~/catkin_ws# 删除 fast_lio 的旧编译目录和 devel 目录(关键:清除缓存)
rm -rf build/fast_lio devel/.private/fast_lio# 重新编译 fast_lio(仅编译单个包,速度更快)
catkin build fast_lio
关键说明
Eigen 是头文件库(无 .so
等二进制文件,仅需头文件引用),因此“升级”的核心是用高版本头文件覆盖低版本。之前的错误本质是“3.2 版本头文件中没有 Eigen::Index
类型”,只要确保编译时引用的是 3.3.9 版本的头文件,Eigen::Index
相关错误就会消失。
若执行上述步骤后仍报错,可在编译时添加“查看头文件引用路径”的参数,确认是否正确引用了 3.3.9 版本:
# 编译时显示 Eigen 头文件的实际引用路径(用于排查问题)
catkin build fast_lio -DCMAKE_VERBOSE_MAKEFILE=ON | grep "Eigen/src/Core/util/Macros.h"
若输出路径包含 /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h
,且版本为 3.3.9,则配置正确。
最终下载官方文档中的示例文件:
https://drive.google.com/drive/folders/1CGYEJ9-wWjr8INyan6q1BZz_5VtGB-fP
官方git文档地址
https://github.com/hku-mars/FAST_LIO
4. Rosbag Example
4.1 Livox Avia Rosbag
Files: Can be downloaded from google drive
Run:
roslaunch fast_lio mapping_avia.launch
rosbag play YOUR_DOWNLOADED.bag
4.2 Velodyne HDL-32E Rosbag
NCLT Dataset: Original bin file can be found here.
We produce Rosbag Files and a python script to generate Rosbag files: python3 sensordata_to_rosbag_fastlio.py bin_file_dir bag_name.bag
Run:
roslaunch fast_lio mapping_velodyne.launch
rosbag play YOUR_DOWNLOADED.bag