当前位置: 首页 > news >正文

Ubuntu 20.04 下 LVI-SAM 复现全记录:从 gtsam 版本踩坑到 OpenCV 头文件修改

Ubuntu 20.04 下 LVI-SAM 复现实战:从 gtsam 版本适配到 OpenCV 接口升级全解析

在机器人感知与定位领域,LVI-SAM 作为融合激光雷达与视觉信息的 SLAM 系统,因其优异的实时性和鲁棒性备受关注。然而其复杂的依赖环境配置常常让开发者陷入"依赖地狱"。本文将分享我在 Ubuntu 20.04 系统上从零开始复现 LVI-SAM 的完整历程,重点解决 gtsam 版本兼容性和 OpenCV 接口升级两大核心痛点。

1. 环境准备与基础依赖安装

1.1 系统环境确认

首先确保系统环境符合以下要求:

  • Ubuntu 20.04.6 LTS(推荐使用官方镜像)
  • ROS Noetic 完整版
  • NVIDIA 显卡驱动 ≥ 510(如需 GPU 加速)
  • CUDA 11.4(可选,视硬件配置)

提示:建议使用全新的 Ubuntu 系统进行操作,避免已有环境变量或旧版库造成冲突

1.2 基础工具链配置

安装必要的编译工具和依赖库:

sudo apt update && sudo apt install -y \ build-essential cmake git wget \ libeigen3-dev libboost-all-dev \ libopencv-dev python3-catkin-tools

验证 Eigen3 版本(需 ≥ 3.3.7):

pkg-config --modversion eigen3

2. 关键依赖库的精确版本控制

2.1 Ceres Solver 1.4.0 编译指南

虽然 Ubuntu 20.04 软件源提供 Ceres,但建议手动编译确保版本匹配:

git clone --branch 1.14.0 https://ceres-solver.googlesource.com/ceres-solver cd ceres-solver && mkdir build && cd build cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF make -j$(nproc) sudo make install

关键参数说明:

  • -DBUILD_TESTING=OFF:跳过测试节省编译时间
  • -DBUILD_EXAMPLES=OFF:禁用示例程序构建
  • -j$(nproc):使用全部 CPU 核心加速编译

2.2 gtsam 4.0.3 的黄金组合

经过多次验证,gtsam 4.0.3 是与 LVI-SAM 兼容的最佳版本:

git clone --branch 4.0.3 https://github.com/borglab/gtsam.git cd gtsam && mkdir build && cd build cmake .. -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF make -j$(nproc) sudo make install

常见问题排查:

  • 若遇到undefined reference to boost错误,需确认已安装libboost-all-dev
  • 编译时内存不足可尝试减少并行任务数(如make -j2

3. LVI-SAM 源码深度适配

3.1 项目克隆与基础修改

获取适配性更好的社区维护版本:

git clone https://github.com/YJZLuckyBoy/lviorf.git cd lviorf && mkdir build && cd build

必须进行的 CMake 修改:

  1. 修改CMakeLists.txt第 8 行:
set(CMAKE_CXX_FLAGS "-std=c++14") # 原为 c++11
  1. 在第 37 行后添加:
find_package(Boost REQUIRED COMPONENTS timer thread serialization chrono)

3.2 OpenCV 接口现代化改造

由于 OpenCV 4.x 的 API 变更,需要修改以下文件:

原接口新接口文件位置
CV_RGB2GRAYcv::COLOR_RGB2GRAYBRIEF.cpp
CV_FONT_HERSHEY_SIMPLEXcv::FONT_HERSHEY_SIMPLEXkeyframe.cpp
<opencv/cv.h><opencv2/opencv.hpp>utility.h

具体修改示例:

// 修改前 #include <opencv/cv.h> cv::cvtColor(image, gray, CV_RGB2GRAY); // 修改后 #include <opencv2/imgproc.hpp> cv::cvtColor(image, gray, cv::COLOR_RGB2GRAY);

4. 编译排错与性能优化

4.1 常见编译错误解决方案

  1. Eigen 冲突错误
sudo rm -f /usr/include/eigen3/Eigen/src/Core/util/Memory.h
  1. Boost 链接错误: 在CMakeLists.txt中添加:
link_directories(/usr/lib/x86_64-linux-gnu)
  1. C++14 特性未启用: 确保所有依赖库都用相同标准重新编译:
export CXXFLAGS="-std=c++14"

4.2 运行时性能调优

  1. 启用 AVX2 指令集(需 CPU 支持):
cmake .. -DCMAKE_CXX_FLAGS="-march=native"
  1. 内存管理优化: 在launch/run.launch中添加:
<param name="num_threads" value="4" />
  1. 可视化优化: 修改config/params.yaml
visualization: point_size: 2 frame_rate: 15

5. 传感器适配与实战测试

5.1 多品牌雷达配置指南

LVI-SAM 默认支持 Velodyne,如需适配其他品牌需修改:

  1. 修改src/lidar_odometry/utility.h中的点云类型定义
  2. 更新config/params.yaml中的雷达参数:
lidar: topic: "/livox/lidar" # Livox 雷达话题 time_offset: 0.0 num_lines: 64

5.2 相机-雷达标定技巧

使用lidar_camera_calibration工具时注意:

  1. 标定板尺寸需与配置文件一致
  2. 建议采集至少 20 组不同位姿数据
  3. 标定结果验证命令:
rosrun camera_calibration_parsers convert result.yaml output.ini

6. 进阶调试与可视化技巧

6.1 RViz 高级配置

创建自定义 RViz 配置保存以下内容为lvi_sam.rviz

Visualization Manager: Class: rviz::VisualizationManager Displays: - Class: rviz::PointCloud2 Name: "Lidar Points" Topic: "/laser_cloud_surround"

6.2 关键帧调试方法

src/visual_odometry/visual_loop/loop_detection.cpp中添加调试输出:

std::cout << "Loop detected between frame " << current_frame_id << " and " << matched_frame_id << std::endl;

7. 系统集成与部署建议

对于实际机器人部署,建议进行以下优化:

  1. 降低 CPU 占用的编译选项:
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_MARCH_NATIVE=OFF
  1. 内存管理优化配置:
system: max_queue_size: 100 memory_pool_size: 1024
  1. 实时性保障措施:
sudo nice -n -20 roslaunch lvi_sam run.launch

经过三天的反复调试和验证,这套配置在 Intel i7-11800H + NVIDIA RTX 3060 的移动平台上实现了稳定的 15Hz 实时建图性能。最关键的发现是 gtsam 4.0.3 与 OpenCV 4.2.0 的组合最为稳定,而盲目使用最新版本反而会导致难以排查的运行时错误。

http://www.jsqmd.com/news/575751/

相关文章:

  • 新手友好:通过快马平台和openclaw 101轻松入门机器人抓取
  • FaceFusion商业应用案例:电商模特图快速换脸实战解析
  • 013、部署篇:从本地开发到云原生(Docker/K8s)服务化部署
  • AudioSeal实际作品分享:5类AI生成音频(TTS/配音/合成)水印实测
  • Unity HUB国际版模块管理指南:彻底删除与重装Android SDK
  • export MPLBACKEND=Agg命令使用
  • 网盘文件直链解析工具实用指南
  • 别再死记硬背了!用‘海绵宝宝和派大星’帮你秒懂无线信道里的时延与带宽
  • 从ChatGLM到语音识别:实战Xinference多模态模型部署,让你的AI应用不再单一
  • Qwen3-ASR-1.7B镜像免配置:insbase-cuda124-pt250-dual-v7一键启动
  • 新手必看,用快马AI生成带详解的链表Python实现代码,轻松入门数据结构
  • 如何利用YimMenu彻底改变你的GTA5游戏体验:终极GTA5增强工具完全指南
  • Qwen3.5-9B企业级运维:supervisor异常自动恢复+磁盘日志轮转配置
  • AutoGLM-Phone-9B商业应用:快速搭建移动端多模态内容创作工具
  • 自建轻量级视频中心:H-Player V2从部署到精通
  • 攻克国标监控系统痛点:WVP-GB28181-Pro零代码构建企业级视频平台
  • IPATool:跨平台iOS应用资源获取的终极解决方案
  • SDXL-Turbo企业级部署:基于SpringBoot的微服务架构设计
  • Incapsula Reese84 JSVMP逆向避坑指南:从‘通杀’到‘精准适配’的思维转变
  • Meshroom终极指南:零基础学会开源3D重建,从照片到模型的完整方案
  • 实战应用案例:通过快马平台开发静电地板施工全流程现场管理助手
  • OpenClaw进阶实战(二):本地模型量化与加速——GGUF、vLLM、OpenVINO实战
  • 后端实战实战案例
  • 2025届毕业生推荐的十大降重复率方案推荐榜单
  • 实战导向:在快马平台用ai生成文件加密工具c语言代码实战
  • Nunchaku FLUX.1-dev部署案例:Kubernetes集群中模型服务化部署
  • SuperMap示例程序闪退问题排查指南:从权限到SDK版本的全面解析
  • 014、硬件加速篇:利用GPU、NPU及专用芯片优化RAG推理与检索
  • 【声呐图像处理】告别“满屏雪花”:二维前视声呐极坐标域散斑去噪的通俗精讲(原理+公式)
  • 告别build.cmd报错:AirSim在Windows上编译失败的几个高频问题及一键解决脚本