news 2026/5/29 1:50:39

保姆级教程:在Ubuntu 20.04上从源码编译运行Cartographer ROS(含常见错误排查)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:在Ubuntu 20.04上从源码编译运行Cartographer ROS(含常见错误排查)

从零构建Cartographer ROS:Ubuntu 20.04实战指南与深度排错手册

当你在Ubuntu终端里第一次看到Cartographer成功生成SLAM地图时,那种成就感就像解开一道复杂的数学方程。但通往这个时刻的路上往往布满荆棘——缺失的依赖项、版本冲突的ROS包、晦涩的编译错误,每一个都可能让初学者陷入数小时的调试泥潭。本文将带你用最直接的方式跨过这些坑,不仅提供可复现的操作步骤,更会揭示每个环节背后的设计逻辑,让你在解决问题时知其然更知其所以然。

1. 环境准备:构建稳健的基础设施

在开始编译Cartographer之前,我们需要确保系统环境像瑞士钟表一样精确无误。Ubuntu 20.04虽然长期支持稳定,但默认的软件源可能缺少关键组件。

1.1 系统级依赖安装

首先更新软件源并安装基础编译工具链:

sudo apt-get update sudo apt-get install -y cmake g++ git google-mock libboost-all-dev libeigen3-dev libgflags-dev libgoogle-glog-dev liblua5.2-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build protobuf-compiler python3-sphinx ros-noetic-abseil-cpp

这些依赖项各自扮演重要角色:

  • libeigen3-dev:提供高性能线性代数运算
  • protobuf:处理Cartographer的配置文件序列化
  • abseil-cpp:Google开源的C++扩展库

注意:如果之前安装过ROS其他版本,务必先彻底卸载以避免冲突。运行sudo apt-get purge 'ros-*'可清除所有ROS相关包。

1.2 ROS Noetic的定制化安装

官方提供的ros-noetic-desktop-full安装方式会引入大量不必要的包,我们推荐最小化安装:

sudo apt-get install -y ros-noetic-catkin python3-catkin-tools ros-noetic-tf2-eigen ros-noetic-tf2-ros ros-noetic-pcl-ros ros-noetic-nav-msgs ros-noetic-sensor-msgs

验证ROS核心功能是否正常:

source /opt/ros/noetic/setup.bash roscore & # 后台启动ROS核心 rosnode list # 应显示/rosout节点

2. 源码编译:Cartographer的精细组装

Cartographer的编译过程像组装精密仪器,每个部件都需要准确定位。我们采用wstool管理依赖关系,这是ROS生态中处理复杂项目依赖的利器。

2.1 创建工作空间与依赖管理

创建隔离的工作环境避免污染系统目录:

mkdir -p ~/cartographer_ws/src cd ~/cartographer_ws/src git clone https://github.com/cartographer-project/cartographer.git git clone https://github.com/cartographer-project/cartographer_ros.git

使用rosdep自动安装缺失依赖:

sudo rosdep init rosdep update rosdep install --from-paths src --ignore-src --rosdistro=noetic -y

2.2 编译参数优化

catkin_make时添加这些参数可显著提升编译效率:

cd ~/cartographer_ws catkin_make_isolated --install --use-ninja -DCMAKE_BUILD_TYPE=Release

关键参数解析:

  • --use-ninja:比make更快的构建系统
  • -DCMAKE_BUILD_TYPE=Release:启用编译器优化
  • --install:生成可直接调用的安装文件

编译完成后配置环境变量:

source ~/cartographer_ws/install_isolated/setup.bash

3. 实战演示:让算法跑起来

Cartographer官方提供了2D和3D的演示数据集,我们将以2D为例展示完整流程。

3.1 数据准备与参数调整

下载测试数据集并解压:

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag

修改启动配置以适应硬件性能:

-- 在cartographer_ros/configuration_files/backpack_2d.lua中调整: TRAJECTORY_BUILDER_2D.submaps.num_range_data = 60 -- 降低该值可减少内存占用 POSE_GRAPH.optimize_every_n_nodes = 30 -- 增大此值可降低CPU负载

3.2 启动运行与可视化

在两个终端分别执行:

# 终端1:启动Cartographer节点 roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag # 终端2:启动RViz可视化 rosrun rviz rviz -d $(rospack find cartographer_ros)/configuration_files/demo_2d.rviz

正常运行时你应该看到:

  1. RViz中实时更新的激光雷达扫描点
  2. 逐渐成型的栅格地图
  3. 机器人轨迹(绿色线条)

4. 深度排错指南:从报错到解决方案

即使严格遵循步骤,仍可能遇到各种问题。以下是经过验证的解决方案。

4.1 编译阶段常见错误

错误1:abseil-cpp版本冲突

CMake Error at CMakeLists.txt:105 (find_package): Could not find a configuration file for package "abseil" that is compatible with requested version "20210324".

解决方案:

sudo apt-get remove ros-noetic-abseil-cpp git clone https://github.com/abseil/abseil-cpp.git cd abseil-cpp && mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. && make -j4 && sudo make install

错误2:protobuf符号冲突

[libprotobuf FATAL google/protobuf/stubs/common.cc:87] This program requires version 3.14.0 of the Protocol Buffer runtime library...

这是因为系统存在多个protobuf版本,需要强制链接正确版本:

sudo apt-get install libprotobuf-dev=3.14.0-1ubuntu2 sudo ldconfig

4.2 运行时典型问题

问题1:bag播放无输出检查话题匹配情况:

rostopic list | grep scan # 应显示/scan话题 rosbag info cartographer_paper_deutsches_museum.bag | grep -A 10 Topics

如果话题不匹配,需要重映射:

<!-- 在launch文件中添加 --> <remap from="scan" to="your_scan_topic" />

问题2:地图漂移严重调整关键参数组合:

TRAJECTORY_BUILDER_2D.use_imu_data = false -- 当IMU质量较差时禁用 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 10 -- 提高位置权重

5. 性能调优与高级技巧

当基础功能正常运行后,这些技巧能让你的Cartographer达到最佳状态。

5.1 实时性优化配置

针对不同硬件配置的推荐参数:

硬件级别CPU线程数子图大小优化频率适用场景
树莓派415060低功耗设备
i5笔记本49030移动机器人
工作站8+15010高精度建图

backpack_2d.lua中对应调整:

TRAJECTORY_BUILDER.num_accumulated_range_data = 1 -- 实时性优先 POSE_GRAPH.global_sampling_ratio = 0.003 -- 降低全局优化频率

5.2 多传感器融合配置

当有IMU和里程计数据时,修改trajectory_builder.lua

use_odometry = true, use_imu_data = true, imu_gravity_time_constant = 0.01, -- 降低此值使IMU更快适应倾斜

5.3 地图保存与重利用

保存地图为通用格式:

rosrun map_server map_saver -f my_map # 生成my_map.pgm和my_map.yaml

加载已有地图进行定位:

<launch> <node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args=" -configuration_directory $(find cartographer_ros)/configuration_files -configuration_basename localization.lua"> <remap from="scan" to="base_scan" /> </node> </launch>

在定位模式下,Cartographer会固定已知地图,仅优化机器人位姿。这种模式CPU占用可降低70%以上。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 1:50:02

保姆级教程:Ubuntu 24.04 + Xshell7/Xftp7 一键搭建 Linux 运维环境

大家好&#xff0c;我是专注分享 Linux 运维干货的阿泽&#xff01;今天给大家带来一套从 0 到 1 的 Linux 运维环境搭建教程&#xff0c;内容包含 Ubuntu 24.04 系统安装、Xshell7 远程连接配置、Xftp7 文件传输&#xff0c;以及运维必备脚本库&#xff0c;所有工具均整理好&a…

作者头像 李华
网站建设 2026/5/29 1:49:00

黑马点评-优惠券秒杀-02_voucher_table_design

黑马点评优惠券秒杀二&#xff1a;为什么有了优惠券表&#xff0c;还要再拆秒杀券表&#xff1f;本文继续整理黑马点评 Redis 实战篇第 3 章「优惠券秒杀」。 上一篇讲了全局唯一订单 ID。这一篇先不急着进入下单&#xff0c;而是把秒杀券的数据模型讲清楚。因为如果不先分清 t…

作者头像 李华