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

保姆级教程:在Ubuntu 18.04上为ORB-SLAM2添加彩色点云地图(含PCL库避坑指南)

在Ubuntu 18.04上实现ORB-SLAM2彩色点云地图的全流程指南

当第一次看到ORB-SLAM2生成的稀疏特征点时,我意识到视觉SLAM的潜力远不止于此。直到成功运行彩色点云建图版本,那种从二维图像到三维稠密重建的震撼感,才真正让我理解了SLAM技术的魅力所在。本文将带你完整走过从环境配置到彩色地图保存的每一步,特别针对Ubuntu 18.04和ROS Melodic环境中的典型问题提供解决方案。

1. 环境准备与源码配置

在开始编译前,确保系统环境满足以下基础要求:

  • Ubuntu 18.04.6 LTS(建议使用官方镜像)
  • ROS Melodic完整版(包含rviz、tf等组件)
  • 至少16GB空闲磁盘空间(用于存储数据集和编译中间文件)

关键依赖安装

sudo apt-get install -y libeigen3-dev libboost-all-dev libopencv-dev python-catkin-tools

对于PCL库的版本管理,Ubuntu 18.04默认仓库提供的是1.8版本,但ORB-SLAM2_with_pointcloud_map对1.7版本兼容性更好。可通过以下命令安装指定版本:

sudo apt-get install -y libpcl-dev=1.8.1+dfsg1-7ubuntu1

源码获取建议使用以下仓库:

cd ~/catkin_ws/src git clone https://github.com/gaoxiang12/ORB_SLAM2_with_pointcloud_map.git

2. 基础编译与常见错误修复

2.1 预处理步骤

进入项目主目录后,需要执行几个关键操作:

  1. 清理旧编译文件:
    rm -rf Thirdparty/DBoW2/build Thirdparty/g2o/build Examples/ROS/ORB_SLAM2/build
  2. 复制词汇表文件:
    cp -r ORB_SLAM2/Vocabulary/ ORB_SLAM2_with_pointcloud_map/

2.2 CMake配置调整

修改CMakeLists.txt中的编译器选项,删除所有-march=native标记。这个优化选项在某些CPU架构上可能导致兼容性问题。具体需要修改两处位置:

  1. 主目录下的CMakeLists.txt

    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3")
  2. Thirdparty/g2o/CMakeLists.txt

    SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")

2.3 编译执行与验证

赋予执行权限并开始编译:

chmod +x build.sh ./build.sh

常见编译错误及解决方案:

错误类型表现特征解决方法
PCL库缺失"Could not find PCL"确认libpcl-dev已安装,修改CMake为find_package(PCL REQUIRED)
Eigen3版本冲突"Eigen3 not found"手动指定路径:set(EIGEN3_INCLUDE_DIR "/usr/include/eigen3")
Boost链接错误"undefined reference to boost::system"在链接选项中添加-lboost_system

3. 彩色点云功能实现

3.1 代码修改要点

要实现彩色点云显示,需要在以下文件进行关键修改:

  1. include/Tracking.h中添加RGB图像成员:

    cv::Mat mImRGB; // 新增行 cv::Mat mImGray; cv::Mat mImDepth;
  2. src/Tracking.cc中两处修改:

    // 第一处修改 mImRGB = imRGB; // 新增行 mImGray = imRGB; // 第二处修改 mpPointCloudMapping->insertKeyFrame(pKF, this->mImRGB, this->mImDepth);

3.2 点云保存功能

src/pointcloudmapping.cc中添加保存功能:

  1. 添加头文件:

    #include <pcl/io/pcd_io.h>
  2. viewer()函数中添加保存命令:

    pcl::io::savePCDFileBinary("slam_result.pcd", *globalMap);

编译完成后,可使用以下工具验证结果:

sudo apt-get install pcl-tools pcl_viewer slam_result.pcd

4. ROS集成与实战测试

4.1 环境变量配置

~/.bashrc末尾添加:

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:$HOME/catkin_ws/src/ORB_SLAM2_with_pointcloud_map/Examples/ROS

刷新配置并验证:

source ~/.bashrc echo $ROS_PACKAGE_PATH

4.2 ROS节点编译

执行ROS部分的编译脚本:

chmod +x build_ros.sh ./build_ros.sh

典型ROS编译问题处理

  1. 路径冲突问题

    rm -rf ~/catkin_ws/src/ORB_SLAM2
  2. PCL头文件缺失

    sudo cp -r /usr/include/pcl-1.8/pcl /usr/local/include/
  3. Boost系统库链接: 在Examples/ROS/ORB_SLAM2/CMakeLists.txt中添加:

    target_link_libraries(${PROJECT_NAME} boost_system)

4.3 数据集测试

使用TUM数据集测试时,建议从官方下载fr1_desk序列。关联文件格式示例:

1305031102.175304 rgb/1305031102.175304.png 1305031102.211214 depth/1305031102.211214.png

运行命令结构:

./rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml [数据集路径] [关联文件]

5. 高级调试与性能优化

5.1 点云参数调整

pointcloudmapping.cc中可以修改以下关键参数:

参数默认值推荐范围作用
voxelSize0.010.005-0.05点云降采样体素大小
maxPointDistance4.03.0-6.0最大有效点距离
minPointDistance0.10.05-0.3最小有效点距离

5.2 实时可视化技巧

使用pcl_viewer时添加以下参数可获得更好效果:

pcl_viewer result.pcd -bc 255,255,255 -ps 2

常用快捷键

  • R:重置视角
  • J:截图保存
  • 鼠标滚轮:调整点大小

5.3 内存管理建议

长时间运行时可能出现内存不足问题,可通过以下方式缓解:

  1. 定期保存子地图:

    if(globalMap->size() > 1000000){ pcl::io::savePCDFileBinary("submap_"+std::to_string(frameCount)+".pcd", *globalMap); globalMap->clear(); }
  2. 启用内存监控:

    watch -n 1 free -m
http://www.jsqmd.com/news/676258/

相关文章:

  • 如何快速掌握Figma中文界面:3分钟完成安装的完整指南
  • N_m3u8DL-RE深度解析:现代流媒体下载器的架构设计与实战应用
  • FigmaCN插件终极指南:3分钟快速实现Figma中文界面免费汉化
  • 饲料颗粒机设计(农业机械)(含CAD零件图,装配图,说明书
  • Phi-3.5-mini-instruct实战案例:Gradio ChatInterface多模态扩展预留接口
  • 别再为灰色按钮发愁!手把手教你搞定VMware Tools安装,解决Ubuntu虚拟机复制粘贴和共享文件夹问题
  • 2024必看!AI写专著全流程,AI工具助力20万字专著轻松完成!
  • 别再手动写CRUD了!用JeecgBoot的Online表单,5分钟搞定一个带复杂控件的管理页面
  • 网盘下载速度太慢?这个开源工具能让你免费获取真实下载地址!
  • 进度管理软件选购参考:8款各有侧重的工具
  • HTTrack跨平台部署实战:从Windows配置到Linux编译的完整指南
  • Java本地数据库访问的革新:SQLite JDBC如何实现零配置跨平台开发
  • 从glibc 2.34移除csu函数谈起:ret2csu技巧的过去、现在与替代方案
  • 在Vivado/ModelSim里仿真我的多周期CPU:Verilog代码调试与波形分析全记录
  • Nintendo Switch NAND存储管理架构解析与实战指南
  • Jetson Nano内核编译避坑实录:从权限错误到LSE atomics,我在Ubuntu 20.04上踩过的那些雷
  • HarmonyOS 6.0 HDS 深度实战:悬浮页签与沉浸光感架构解析(API 23+)
  • Fish Speech 1.5语音质量:在嘈杂环境播放下的可懂度与抗干扰能力测试
  • 从点阵到像素:STM32驱动OLED/LCD显示中文的三种方案全对比(含取模软件实操)
  • 中美AI编程赛道大不同:美国创业公司有机会,中国大厂通吃
  • ESP32 RMT实战:手把手教你用ESP-IDF驱动WS2812灯带(附完整代码)
  • KDB+迭代与数据聚合:从理论到实践
  • LinkSwift网盘直链下载助手:八大网盘免费提速的终极解决方案
  • 别再让Simulink生成‘通用’代码了!手把手教你为STM32F4配置ARM Cortex-M硬件支持包(以2022b为例)
  • 我的Web3学习之旅与思考
  • imFile下载管理器:3个核心问题解决方案与5个进阶技巧
  • Audiveris完整指南:免费开源乐谱识别工具快速上手教程
  • 2026 四川家居品牌加盟与成都买家具优选:好风景家居全维度实力解析 - 深度智识库
  • 别再乱堆膨胀卷积了!用Python可视化代码带你避开Gridding Effect大坑
  • LabVIEW颜色识别实战:用IMAQ ColorMatch函数5分钟搞定产品颜色分拣