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

保姆级教程:在Ubuntu 20.04上从零搞定Cartographer SLAM(附李想老师注释版源码)

保姆级教程:在Ubuntu 20.04上从零搞定Cartographer SLAM(附李想老师注释版源码)

当第一次接触Cartographer时,许多开发者都会被其复杂的依赖关系和配置步骤劝退。官方文档虽然全面,但缺乏针对初学者的细节指导,导致很多人在配置过程中频频踩坑。本文将带你从零开始,一步步完成Cartographer的安装、配置和运行,确保你能顺利复现整个流程。

1. 环境准备与依赖安装

在开始之前,确保你的系统是Ubuntu 20.04,这是目前最稳定的ROS Noetic支持版本。Cartographer对系统环境有严格要求,任何版本不匹配都可能导致编译失败。

首先更新系统软件包:

sudo apt update && sudo apt upgrade -y

安装基础依赖工具链:

sudo apt install -y git cmake python3-wstool python3-rosdep ninja-build stow

ROS Noetic是Cartographer运行的基础环境,如果尚未安装,执行以下命令:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-noetic-desktop-full

初始化ROS环境:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

Cartographer需要特定版本的protobuf库(3.0.0),安装时需特别注意:

sudo apt install -y libprotobuf-dev protobuf-compiler

2. 获取李想老师注释版源码

官方Cartographer源码虽然功能完整,但缺乏详细注释,对初学者不够友好。李想老师的注释版源码对关键代码和配置做了详细解释,是学习Cartographer的绝佳资源。

创建工作空间目录:

mkdir -p ~/carto_ws/src cd ~/carto_ws/src

克隆注释版源码仓库:

git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git

这个仓库包含以下关键组件:

  • cartographer:核心SLAM算法实现
  • cartographer_ros:ROS接口封装
  • cartographer_rviz:可视化工具
  • 示例配置和启动文件

3. 编译与配置

Cartographer的编译过程较为特殊,需要使用提供的专用脚本而非标准的catkin_make。

进入工作空间目录:

cd ~/carto_ws/cartographer_detailed_comments_ws

执行编译脚本:

./catkin_make.sh

编译过程可能需要较长时间(约30-60分钟,取决于机器性能),期间会输出大量信息。如果遇到错误,通常是依赖缺失导致,可以根据提示安装相应包。

编译完成后,需要设置环境变量。编辑~/.bashrc文件:

vim ~/.bashrc

在文件末尾添加(路径根据实际安装位置调整):

source ~/carto_ws/cartographer_detailed_comments_ws/install_isolated/setup.bash

小技巧:在vim中,按G可直接跳转到文件末尾,i进入插入模式,添加内容后按ESC退出插入模式,输入:wq保存退出。

验证环境配置是否正确:

rospack profile

4. 运行2D建图

Cartographer最常用的功能是2D建图,下面介绍如何使用公开数据集进行测试。

创建数据存储目录:

mkdir -p ~/bagfiles

将下载的bag文件放入该目录。常用的测试数据集包括:

  • 2D建图b3-2016-04-05-13-54-42.bag
  • 3D建图cartographer_paper_deutsches_museum.bag

启动2D建图节点:

roslaunch cartographer_ros lx_rs16_2d_outdoor.launch

在新终端中播放bag文件:

rosbag play -r 1 ~/bagfiles/your_2d_bag.bag

建图过程中可以通过RVIZ观察实时结果。Cartographer提供两种可视化方式:

  1. Submaps:原始子图显示
  2. Map:整合后的全局地图

查看地图话题信息:

rostopic info /map

5. 地图保存与后处理

建图完成后,需要将结果保存以供后续使用。Cartographer提供多种保存方式:

方法一:使用map_server保存为PGM格式

rosrun map_server map_saver -f ~/map

方法二:使用项目提供的脚本(推荐)

./finish_slam_2d.sh

该脚本会生成.pgm(地图图像)和.yaml(地图配置)文件,默认保存在用户主目录下。如需修改保存路径,可编辑脚本文件。

6. 高级配置与调优

Cartographer的性能很大程度上取决于配置文件(.lua)的参数设置。以下是关键参数说明:

options = { map_frame = "map", -- 地图坐标系名称 tracking_frame = "imu_link", -- 传感器数据基准坐标系 published_frame = "odom", -- 发布的TF最下层坐标系 provide_odom_frame = false, -- 是否提供odom坐标系 use_odometry = false, -- 是否使用里程计数据 num_laser_scans = 0, -- 单线激光雷达数量 num_point_clouds = 1, -- 点云数据源数量 } TRAJECTORY_BUILDER_2D = { use_imu_data = true, -- 是否使用IMU数据 min_z = 0.1, -- 点云数据的最低有效高度 }

常见问题排查

  • TF树不完整:检查tracking_framepublished_frame设置
  • 点云显示异常:调整min_z值过滤无效数据
  • 建图漂移:启用use_odometry或优化IMU配置

7. 3D建图与点云处理

对于需要三维场景重建的应用,Cartographer同样提供强大的3D建图能力。

启动3D建图节点:

roslaunch cartographer_ros lx_rs16_3d.launch

播放3D数据集:

rosbag play -r 1 ~/bagfiles/your_3d_bag.bag

保存3D地图:

./finish_slam_3d.sh

生成的.pcd文件可以用PCL工具查看:

pcl_viewer your_map.pcd

操作提示

  • 4键启用高度着色模式
  • 鼠标滚轮控制缩放,左键旋转视角
  • 右键平移视图

8. 实际应用技巧

在真实项目中部署Cartographer时,以下几点经验值得注意:

  1. 传感器校准:IMU和激光雷达的精确标定对建图质量至关重要
  2. 参数调优:根据环境特点调整submap大小和扫描匹配参数
  3. 计算资源:3D建图需要较强的GPU支持
  4. 实时性优化:适当降低pose_publish_period_sec提高响应速度

对于长期运行的SLAM系统,建议:

  • 定期保存中间状态(.pbstream
  • 使用assets_writer生成轻量级地图
  • 建立完善的参数配置文件管理体系
http://www.jsqmd.com/news/724719/

相关文章:

  • 别再手动算了!用Python的Shapely库5分钟搞定不规则多边形形心(附完整代码)
  • 终极指南:如何快速访问全球11种语言的斯坦福CS229机器学习秘籍
  • WPS-Zotero终极指南:如何实现跨平台文献管理的无缝对接
  • 【节点】[OneMinus节点]原理解析与实际应用
  • 开源社交数据抓取利器SocialClaw:多平台API统一与舆情分析实战
  • 别再手动翻文献了!用Word宏一键给Zotero引用和参考文献加上超链接(保姆级教程)
  • Magenta.js核心组件深度解析:从MusicVAE到SketchRNN的完整实现
  • 思源宋体CN TTF字体:7种字重高效应用的终极解决方案
  • 别再只用鼠标点PPT了!试试用MediaPipe手势识别打造你的智能演讲助手
  • 告别数据拥堵:Egg.js+RabbitMQ打造高可用消息通信架构终极指南
  • 从L298N到DM542:我的步进电机驱动升级踩坑记(STM32C8T6实战)
  • 使用 Docker 部署 GitLab 并分配用户账号 —— 保姆级教程
  • Certified-Kubernetes-Security-Specialist供应链安全:从镜像扫描到漏洞检测
  • 2026最新数据仓库公司/厂商/服务商推荐!国内权威榜单发布,广东广州等地优质企业实力上榜 - 十大品牌榜
  • 从冷光到暖光:手把手教你用PWM调光实现精准色温控制(基于实测灯珠xyY参数)
  • Switch游戏文件管理的终极解决方案:NSC_BUILDER让您的游戏库井井有条
  • 光刻胶容器工程
  • 深入AutoSar BSW:从NVM配置案例看FEE的‘翻页’机制与数据可靠性设计
  • 别再写IF HASONEVALUE了!Power BI中SELECTEDVALUE函数的3个实战用法(含动态标题)
  • PHP 8.9 JIT性能翻倍实录:从QPS 1,200到4,850的5步精准调优法(含GC阈值+Tracing深度配置)
  • 如何用Winhance中文版一键优化你的Windows系统:新手终极指南
  • 5秒构建元宇宙基石:instant-ngp如何用GPU加速重构虚拟空间
  • 终极指南:ZincSearch磁盘存储机制如何突破数据持久化瓶颈
  • 3分钟搞定抖音批量下载:douyin-downloader高效工具全解析
  • DPDK与多核网络架构优化实践
  • 告别‘纸老虎’:手把手理解基于深度学习的SAR抗欺骗干扰与图像真伪鉴别
  • 不止于调色:深入Unity OnRenderImage与CommandBuffer,打造自定义屏幕后处理管线
  • 从‘不安全端口’黑名单说起:一份给开发者的Chrome/Firefox/Edge端口避坑指南与安全思考
  • counter_culture错误排查手册:常见问题及其解决方案的完整清单
  • 从‘status_breakpoint’错误聊起:给开发者的Chrome/Edge调试功能避坑指南