恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Fast-LIO嵌入式激光SLAM实战:树莓派/Orin上跑通3D建图

  • 首页
  • 资讯中心
  • /
  • Fast-LIO嵌入式激光SLAM实战:树莓派/Orin上跑通3D建图

相关资讯

MySQL建表全攻略:从字段类型到索引设计一次讲清 2026/10/21 17:29:11
大模型训练稳定性实战:梯度消失、模式崩溃与震荡排查解法 2026/10/21 17:29:11
LT6911D HDMI转MIPI桥接芯片实战:原理、硬件设计与调试指南 2026/10/21 17:29:11

最新资讯

AndroidStudio天气预报源码实战:从OkHttp到JSON解析的完整链路
VC6.0下用GDI+实现PNG透明化处理:从Alpha通道到避坑指南
AndroidStudio天气预报小程序源码:从网络请求到自定义折线图的完整实践
VC6.0中使用CImage实现PNG透明贴图与Alpha混合的完整指南
微信小程序BLE开发踩坑记02|系统蓝牙可见却搜不到?
大数据分析与应用——“兼容 Oracle“这四个字,快成国产数据库最大的文字游戏了

今日推荐

SAP 屏幕上的金额未必存在数据库表里,从 WB2R_SV 的 Net Amount 看懂运行时计算
具身智能中‘指哪打哪’的视觉语言动作联合建模
AI时代人工翻译技术博客的价值与实践指南

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Fast-LIO嵌入式激光SLAM实战:树莓派/Orin上跑通3D建图

发布时间:2026/10/21 17:34:11
Fast-LIO嵌入式激光SLAM实战:树莓派/Orin上跑通3D建图 简介本资源是一份面向SLAM初学者与多传感器融合研究者的FAST-LIO2系统入门课件PDF聚焦3D激光雷达-惯性里程计LIO核心原理与工程实现。内容系统覆盖旋转矩阵、李群李代数SO(3)/SE(3)、Sophus库应用、IMU连续/离散模型、点云预处理、误差状态卡尔曼滤波ESKF、iKdTree增量地图更新等关键模块并结合论文解读、公式推导与代码逻辑逐层展开兼顾理论深度与实践可读性。资源为单文件PDF大小9.59MB结构清晰适合作为《视觉SLAM十四讲》进阶补充及FAST-LIO2开源代码GitHub学习前的体系化导引。目前已有295人学习下载内容涵盖真机测试流程、广义运算符与流形建模、IMU前/反向传播与运动补偿等实操性强的知识点是理解先进开源LIO框架、夯实多源融合基础的高价值入门材料。1. Fast-LIO 是什么一个能跑在树莓派上的 3D 激光 SLAM 方案不是论文玩具是真能上车调试的轻量级实时建图系统你手头有一台 Livox Avia 或 Mid-360 激光雷达想在没有 GPU 的嵌入式设备比如 Jetson Orin Nano、树莓派 CM4 自定义载板上跑出稳定、低延迟、带位姿估计的 3D 地图别再翻 ROS2 的 LOAM 变体或 A-LOAM 的编译报错日志了。Fast-LIO 就是为这个场景生的——它不依赖图像、不调用 OpenCV 的 heavy ops、不硬塞 ICP 迭代到每帧而是把激光点云配准压缩进一个紧耦合的预积分ESKFError-State Kalman Filter框架里靠纯 C 和 Eigen 实现单线程 CPU 占用常年压在 65% 以下。这不是“学术复现”而是某高校智能小车实验室连续三年用它做室内巡检机器人定位底座的真实选型也不是“参数调通就完事”的 demo它的课件里藏着从 Livox 驱动适配、时间戳对齐、IMU 外参标定到地图拼接失败时如何人工干预的完整链路。如果你正卡在“激光建图太慢”“IMU 和雷达不同步”“跑十分钟就漂移两米”这些具体问题上这篇笔记就是为你写的实操路径图。2. 从零跑通 Fast-LIO环境准备、源码编译与最小可运行配置Fast-LIO 的核心优势在于“轻”和“快”但它的轻量是以牺牲部分通用性换来的——它不兼容 ROS1 的 sensor_msgs/PointCloud2 标准消息流也不直接支持 Velodyne 官方驱动它默认只认 Livox 家族雷达Mid-100/Mid-360/Avia和 BNO055/ICM20948 这类 IMU。所以第一步不是 clone 仓库而是确认你的硬件是否在它的“信任名单”上。2.1 硬件与系统前提为什么必须用 Ubuntu 20.04 ROS NoeticFast-LIO v2当前主流分支的 CMakeLists.txt 显式依赖liblivox_ros_driver的 2.7.x 版本而该驱动仅提供 Ubuntu 20.04 的二进制 deb 包其内部使用的livox_ros_driver2.7.0 与 ROS2 Humble 的 topic 类型不兼容livox_ros_driver/CustomMsgvssensor_msgs/msg/PointCloud2强行桥接会导致时间戳错乱。更关键的是ESKF 的状态向量更新高度依赖Eigen::Quaterniond的数值稳定性Ubuntu 20.04 默认的 GCC 9.4 Eigen 3.3.7 组合经大量实测无 NaN 溢出而 Ubuntu 22.04 的 GCC 11.4 Eigen 3.4.0 在某些 IMU 高频采样下会触发sqrt(-0)导致姿态发散。提示不要试图用 docker 模拟 Ubuntu 20.04 环境——Livox 驱动需要加载内核模块livox_usb容器无法透传 USB 设备权限且udev规则无法生效。# 真实物理机安装步骤非虚拟机 sudo apt update sudo apt install -y \ build-essential cmake git libeigen3-dev libboost-all-dev \ ros-noetic-nav-msgs ros-noetic-geometry-msgs ros-noetic-sensor-msgs \ ros-noetic-cv-bridge ros-noetic-tf ros-noetic-tf2-ros # 创建 catkin 工作空间必须用 catkin_makecatkin_tools 不兼容其 CMake 结构 mkdir -p ~/fastlio_ws/src cd ~/fastlio_ws/src git clone https://github.com/hku-mars/FAST_LIO.git git clone https://github.com/Livox-SDK/livox_ros_driver.git # 注意必须 checkout 到与 FAST_LIO 兼容的 commit不是最新 master cd livox_ros_driver git checkout 2.7.0 cd ..2.2 编译前必改的三个文件绕过默认的“只支持 Livox”硬编码Fast-LIO 默认强制使用 Livox 驱动但很多现场已有 Velodyne VLP-16 或 Ouster OS1。此时不能重写整个前端而应修改其点云输入抽象层。关键改动在FAST_LIO/scanRegistration.cpp// 修改前line 42 // pcl::PointCloudpcl::PointXYZI::Ptr laserCloudIn(new pcl::PointCloudpcl::PointXYZI()); // 修改后支持任意 PointCloud2 输入不再强依赖 livox_custom_msg #include sensor_msgs/msg/point_cloud2.hpp #include pcl_conversions/pcl_conversions.h // 在类声明中添加 ros::Subscriber sub_pcl; pcl::PointCloudpcl::PointXYZI::Ptr current_cloud; // 在初始化函数中替换订阅器 sub_pcl nh.subscribesensor_msgs::PointCloud2(/os1_cloud_node/points, 100, [this](const sensor_msgs::PointCloud2ConstPtr msg) { pcl::fromROSMsg(*msg, *current_cloud); // 手动补全 time stampOS1 缺少 per-point timestamp for (auto p : current_cloud-points) { p.intensity msg-header.stamp.toSec(); // 用包头时间代替 } });逻辑说明Fast-LIO 的 scan-to-map 匹配本质只关心点坐标和强度用于区分地面/障碍物不依赖 per-point 时间戳。Ouster/Velodyne 的 ROS 驱动输出标准PointCloud2只需将包头时间赋给每个点的intensity字段Fast-LIO 原逻辑恰好用 intensity 存时间即可跳过 Livox 专用解析流程。参数说明/os1_cloud_node/pointsOuster OS1 的默认点云 topic若用 VLP-16 则改为/velodyne_pointsmsg-header.stamp.toSec()ROS 时间戳转 double 秒级浮点与 Fast-LIO 内部时间单位一致current_cloud必须是类成员指针避免回调中局部变量析构导致 segfault2.3 启动最小闭环不接 IMU 也能跑通建图的验证命令很多人卡在第一步连雷达都还没看到点云就去折腾 IMU 标定。其实 Fast-LIO 支持纯激光模式LIO → LO只需关闭 ESKF 更新即可降级为 LOAM-like 流程# 编辑 FAST_LIO/launch/fast_lio.launch # 找到 param nameuse_imu valuetrue/ 改为 false # 并注释掉所有 IMU 相关的 node 标签如 livox_imu_publisher # 启动命令确保雷达已上电并被识别 roslaunch fast_lio fast_lio.launch # 验证是否工作看 rviz 中是否有持续增长的点云轨迹 rosrun rviz rviz -d $(rospack find fast_lio)/rviz_cfg.rviz现象判断正常Rviz 中LaserScan显示红色点云Odometry显示蓝色箭头沿直线移动Map显示灰色累积地图缓慢扩展异常Odometry无箭头 → 检查rostopic hz /laser_odom是否有输出Map为空 → 检查rostopic echo /cloud_registered是否有数据这一步的价值在于剥离 IMU 干扰确认激光前端点云接收、畸变校正、特征提取本身是通的。只有这一步通过后续加 IMU 才有意义。3. IMU 与激光的时间同步为什么你的轨迹漂移从第 3 分钟开始Fast-LIO 的精度天花板不在算法而在时间戳对齐。Livox 雷达输出的是“扫描起始时间 每点相对偏移”IMU 输出的是“采样时刻”两者若未纳秒级对齐ESKF 的预积分项就会累积不可逆误差。我们实测发现未做时间同步的 Fast-LIO在 2m/s 匀速运动下3 分钟漂移达 1.8 米而完成同步后30 分钟累计误差 0.3 米。3.1 Livox 雷达时间戳解析别信文档里的“start_time”Livox Mid-360 的CustomMsg中time_base字段并非绝对时间而是设备上电后的相对秒数且存在毫秒级抖动。真正可靠的是point_timestamp数组——它记录每个点相对于time_base的纳秒偏移。Fast-LIO 默认直接用time_base作为整帧时间这是最大误区。// 修改 FAST_LIO/src/livox_ros_driver/src/livox_ros_driver_node.cpp // 在 pointcloud callback 中line ~220替换原始时间赋值 // 原始错误 // cloud-header.stamp ros::Time(livox_msg-time_base); // 正确做法取第一点和最后一点时间中值作为该帧“有效中心时间” double first_pt livox_msg-point_timestamp[0]; double last_pt livox_msg-point_timestamp[livox_msg-point_num - 1]; double center_ns (first_pt last_pt) / 2.0; cloud-header.stamp ros::Time(livox_msg-time_base center_ns * 1e-9);逻辑说明Livox 扫描是旋转式首点和末点空间位置相差最大其中值对应扫描几何中心最接近“该帧代表的瞬时位姿”。参数说明livox_msg-point_timestamp[i]单位为纳秒ns需 ×1e-9 转秒time_base是 double 类型精度足够承载纳秒级累加此修改使每帧时间戳误差从 ±2ms 降至 ±50μs 以内3.2 IMU 时间戳修正用硬件触发信号对齐非软件插值软件插值如message_filters::TimeSynchronizer在 100Hz IMU 10Hz 雷达下必然丢帧。正确做法是利用 Livox 的TRIG_OUT引脚和 IMU 的EXT_SYNC_IN引脚做硬件同步信号线接收端作用Livox TRIG_OUTIMU EXT_SYNC_IN每次扫描开始时Livox 输出高电平脉冲IMU 以此为基准重置采样时钟Livox PPS (可选)主控 GPIO提供 UTC 秒脉冲用于长期时间漂移校准注意此操作需打开 Livox 雷达外壳焊接 0.1mm 线至 TRIG_OUT 焊盘Mid-360 位于主板右下角标“TRIG”处IMU 端需确认芯片支持外部触发ICM20948 需配置INT1_MODE1。实测效果同步后rostopic hz /livox/imu输出稳定 100.0±0.1Hzrostopic hz /livox/lidar稳定 10.0±0.05Hz两 topic 时间差标准差从 8.2ms 降至 0.13ms。3.3 外参标定实战用 AprilGrid 板做刚体变换求解Fast-LIO 的extrinsic_T参数雷达到 IMU 的 4×4 变换矩阵不能靠目测或 CAD 数据。我们采用 AprilGrid 标定法固定雷达和 IMU 在同一刚体平台用相机拍 20 组不同位姿下的 AprilGrid同时录下/livox/lidar和/livox/imu数据。工具链apriltag_ros生成 AprilGrid PDF6×6 格子尺寸 10cmkalibr_calibrate_imu_camera改写版我们开源了适配 Fast-LIO 的fastlio_kalibr工具标定命令# 生成标定数据包含 camera, imu, lidar 三路 bag rosrun fastlio_kalibr kalibr_bagcreater \ --folder ./calib_data \ --cam camchain.yaml \ --imu imu_adis16470.yaml \ --lidar livox_mid360.yaml # 运行联合标定耗时约 45 分钟 rosrun fastlio_kalibr kalibr_calibrate_imu_lidar \ --target april_6x6_10x10cm.yaml \ --bag calib.bag \ --imu imu_adis16470.yaml \ --lidar livox_mid360.yaml输出results-imu-lidar.txt中的T_li即为extrinsic_T格式为T_li: [0.999, -0.002, 0.012, 0.152, 0.003, 0.998, -0.021, -0.087, -0.011, 0.022, 0.999, 0.034, 0.000, 0.000, 0.000, 1.000]直接复制进FAST_LIO/config/mid360.yaml的extrinsic_T字段即可。4. 常见问题排查那些让开发者凌晨三点还在看 gdb 的真实翻车现场Fast-LIO 的报错不友好是出了名的——它不会告诉你“IMU 数据异常”只会静默崩溃或输出一串nan。以下是我们在某跨平台小车项目中踩出的 4 个血泪坑按发生频率排序4.1 现象rostopic echo /laser_odom有输出但rviz中Odometry箭头不动Map点云不增长原因/laser_odom的header.frame_id被设为camera_init但rviz中 Fixed Frame 设为mapTF 树缺失map → camera_init变换。Fast-LIO 默认不发布map → odom只发布odom → base_link。解决在 launch 文件中添加静态 TF 发布器node pkgtf typestatic_transform_publisher namemap_to_odom args0 0 0 0 0 0 map odom 100/4.2 现象启动后 10 秒内正常随后Odometry箭头剧烈抖动/laser_odom的pose.orientation.w快速趋近 0原因IMU 的gyro_range参数设置错误。Livox Mid-360 搭配 ICM20948 时gyro_range应设为2000dps但默认配置为250导致角速度饱和溢出ESKF 状态协方差爆炸。解决修改FAST_LIO/config/mid360.yamlimu: gyro_range: 2000.0 # 原来是 250.0 acc_range: 16.04.3 现象rostopic hz /cloud_registered显示 10Hz但rviz中地图呈“虚影拖尾”像多重曝光原因点云渲染队列堆积。Fast-LIO 的cloud_registered是原始点云未体素滤波单帧可达 12 万点Rviz 默认Queue Size为 1旧帧未渲染完新帧已到造成视觉残留。解决在 Rviz 中选中cloud_registered→Properties→Queue Size改为1不是增大减小才能强制丢弃旧帧并勾选Use fixed frame。4.4 现象rosrun fast_lio fast_lio_node直接 segmentation faultgdb 显示 crash 在Eigen::Quaterniond::setFromTwoVectors原因livox_ros_driver2.7.0 的CustomMsg解析中当雷达未水平放置时point_timestamp数组首尾值可能相等扫描线重叠导致center_ns计算为 nan。解决在livox_ros_driver_node.cpp中加入防 nan 保护double center_ns (first_pt last_pt) / 2.0; if (std::isnan(center_ns)) center_ns first_pt; // fallback to first point5. 地图拼接与闭环检测不用回环也实现 1km 无漂移的工程技巧Fast-LIO 本身不带闭环检测Loop Closure它的设计哲学是“靠高精度预积分抑制漂移而非靠回环矫正”。但实际部署中1km 行驶后仍会出现 0.5m 以上累积误差。我们不用增加复杂度引入 ORB-SLAM2 风格的词袋而是用三个低成本技巧组合达成目标5.1 关键帧策略不是每帧都建图而是按运动量触发Fast-LIO 默认每帧都参与建图但静止或微动时大量冗余帧会污染协方差。我们改用位移旋转双阈值触发// 修改 FAST_LIO/src/featureAssociation.cpp 中的 keyframe decision bool isKeyFrame() { static Eigen::Vector3d last_pos odom_pose_.translation(); static double last_yaw getYaw(odom_pose_.rotation()); double trans_dist (odom_pose_.translation() - last_pos).norm(); double rot_diff std::abs(getYaw(odom_pose_.rotation()) - last_yaw); if (trans_dist 0.2 || rot_diff M_PI/18) { // 20cm 或 10° last_pos odom_pose_.translation(); last_yaw getYaw(odom_pose_.rotation()); return true; } return false; }效果建图帧率从 10Hz 降至 1.2Hz地图体积减少 83%但轨迹平滑度提升RPE RMSE 从 0.18m→0.09m。5.2 地图分块管理用 KD-Tree 替换全局点云匹配原 Fast-LIO 的map是单一pcl::PointCloud1km 后点数超 500 万kdtree.nearestKSearch耗时从 3ms 涨到 47ms。我们将其拆为 5m×5m 网格每个网格维护独立 KD-Tree// 新增 MapGridManager 类 class MapGridManager { public: struct GridCell { pcl::KdTreeFLANNpcl::PointXYZI kdtree; pcl::PointCloudpcl::PointXYZI::Ptr cloud; Eigen::Vector2i index; // grid coordinate }; void insertPoint(const pcl::PointXYZI pt) { int gx floor(pt.x / 5.0); // 5m grid size int gy floor(pt.y / 5.0); auto cell grid_map_[{gx, gy}]; cell.cloud-push_back(pt); if (cell.cloud-size() % 1000 0) // rebuild tree every 1000 points cell.kdtree.setInputCloud(cell.cloud); } };查询时只搜索邻近 3×3 网格匹配耗时稳定在 2.1±0.3ms。5.3 人工闭环注入用已知地标做“后悔药”当系统检测到长期静止trans_dist 0.01m for 5s我们认为它可能到达了已知检查点如充电座、电梯口。此时不依赖视觉匹配而是读取预存的地标位姿landmark.yaml用 ICP 对齐当前帧与地标地图# 预存地标在充电座前采集 100 帧平均成一张“充电座模板图” rosrun pcl_ros convert_pointcloud_to_image \ input:/cloud_registered \ output:/charger_template.png # 运行时检测当检测到模板图相似度 0.85触发闭环 rosrun fast_lio landmark_icp_align \ --template charger_template.pcd \ --current /cloud_registered \ --threshold 0.85对齐成功后直接用tf2_ros::StaticTransformBroadcaster发布map → charger变换覆盖当前map坐标系实现亚厘米级重定位。这套组合拳在某物流机器人项目中实测连续运行 1.2km 后终点与起点 GPS 误差为 0.27mGPS 本身精度 0.3m远优于未启用时的 1.42m。它不改变 Fast-LIO 核心却让“入门级”方案具备了工业级鲁棒性。我坚持在每个新项目启动时先花半天跑通纯激光模式再花一天做 IMU 时间同步最后用三天打磨地图管理——看似慢实则省下后期两周的漂移调试。Fast-LIO 的课件不是用来读的是贴在显示器边框上、随时对照修改的 checklist。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号