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

Ubuntu 20.04 + ROS Noetic 下,手把手解决 Cartographer 安装的‘libabsl-dev’报错

Ubuntu 20.04 + ROS Noetic 下解决 Cartographer 依赖问题的实战指南

当你在 Ubuntu 20.04 上安装 ROS Noetic 的 Cartographer 时,遇到libabsl-dev依赖错误可能是最令人沮丧的事情之一。这个错误看似简单,实则揭示了 ROS 生态系统中一个常见的版本兼容性问题。本文将带你深入理解问题根源,并提供多种解决方案,让你不仅能解决当前问题,还能掌握 ROS 依赖管理的核心技巧。

1. 理解 libabsl-dev 依赖问题的本质

Cartographer 是一个功能强大的 SLAM(同步定位与地图构建)库,它依赖于 Google 的 Abseil 库(即libabsl-dev)。在 Ubuntu 20.04 的默认仓库中,Abseil 的版本可能与 Cartographer 所需的版本不匹配,这就是问题的核心所在。

为什么会出现这个问题?

  • Ubuntu 20.04 官方仓库中的 Abseil 版本较旧
  • ROS Noetic 的 Cartographer 需要特定版本的 Abseil API
  • 包管理系统无法自动解决这种版本冲突

提示:这不是 Cartographer 特有的问题,许多现代 C++ 项目都会遇到类似的依赖冲突。

2. 解决方案一:使用 ROS 官方推荐的安装方法

最直接的方法是按照 ROS 官方文档的推荐方式安装 Cartographer。这种方法会处理大部分依赖问题:

sudo apt-get install ros-noetic-cartographer-ros

如果遇到依赖错误,可以尝试以下步骤:

  1. 更新你的包列表:

    sudo apt-get update
  2. 安装完整的 ROS Noetic 桌面版(如果尚未安装):

    sudo apt-get install ros-noetic-desktop-full
  3. 安装开发工具:

    sudo apt-get install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
  4. 初始化 rosdep:

    sudo rosdep init rosdep update
  5. 安装 Cartographer 及其 ROS 封装:

    sudo apt-get install ros-noetic-cartographer-ros

3. 解决方案二:手动编译 Abseil 库

当官方仓库的版本不满足要求时,手动编译是最可靠的解决方案。以下是详细步骤:

3.1 安装必要的编译工具

sudo apt-get install -y \ cmake \ g++ \ git \ libboost-all-dev \ libeigen3-dev \ libgflags-dev \ libgoogle-glog-dev \ libprotobuf-dev \ protobuf-compiler

3.2 下载并编译 Abseil

git clone https://github.com/abseil/abseil-cpp.git cd abseil-cpp mkdir build cd build cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. make -j$(nproc) sudo make install

3.3 安装 Cartographer

现在你可以继续安装 Cartographer:

mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/googlecartographer/cartographer_ros.git cd .. rosdep install --from-paths src --ignore-src --rosdistro=noetic -y catkin_make_isolated --install --use-ninja source install_isolated/setup.bash

4. 解决方案三:修改 package.xml 文件

如果你正在从源代码构建 Cartographer,可以尝试修改package.xml文件来适应系统已有的 Abseil 版本:

  1. 找到 Cartographer 的package.xml文件

  2. 修改 Abseil 依赖项:

    <depend>libabsl-dev</depend>

    改为:

    <depend condition="$ROS_DISTRO == 'noetic'">libabsl-dev</depend>
  3. 保存文件后重新构建:

    catkin_make

5. 不同解决方案的对比与选择

解决方案优点缺点适用场景
官方安装简单快捷可能无法解决所有依赖问题快速尝试或简单项目
手动编译完全控制版本过程复杂,耗时需要特定版本或开发环境
修改配置快速解决特定问题可能影响其他依赖了解 ROS 包管理的高级用户

6. 验证安装是否成功

安装完成后,可以通过以下命令验证 Cartographer 是否正常工作:

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

如果一切正常,你应该能看到 RViz 中显示地图构建过程。

7. 常见问题与故障排除

问题1:编译时出现 "absl/types/optional.h: No such file or directory" 错误

解决方案:

sudo apt-get install libabsl-dev

问题2:运行时出现 "undefined symbol" 错误

这通常是由于版本不匹配导致的。解决方案是确保所有组件都使用相同版本的 Abseil:

sudo apt-get remove libabsl-dev sudo rm -rf /usr/local/lib/cmake/absl

然后重新按照手动编译的步骤安装 Abseil。

问题3:Cartographer 无法启动,提示缺少 ROS 包

确保你已经安装了所有必要的 ROS 依赖:

rosdep install --from-paths src --ignore-src --rosdistro=noetic -y

8. 性能优化与进阶配置

一旦解决了基本的安装问题,你可以考虑以下优化:

  • 调整 Cartographer 参数:修改lua配置文件以适应你的硬件
  • 使用更高效的构建系统:如 Ninja
  • 启用硬件加速:确保你的系统正确配置了 GPU 支持
-- 示例:调整轨迹构建参数 TRAJECTORY_BUILDER_2D = { use_imu_data = true, min_range = 0., max_range = 30., min_z = -0.8, max_z = 2., }

在解决 Cartographer 安装问题的过程中,我发现手动编译虽然耗时,但提供了最大的灵活性和控制力。特别是在开发环境中,这种方法可以避免许多潜在的版本冲突问题。对于生产环境,建议使用经过测试的 Docker 镜像或预编译包,以确保稳定性。

http://www.gsyq.cn/news/1332594.html

相关文章:

  • 从狼群狩猎到参数调优:GWO算法在机器学习超参数搜索中的保姆级指南
  • Exception in thread “main“ java.lang.Error: Unresolved compilation problem:
  • Node.js框架深度解析:从Express到Nest.js,如何选择最适合你的Web开发框架?
  • 打卡信奥刷题(3291)用C++实现信奥题 P8971 『GROI-R1』 虹色的彼岸花
  • 技术路线深度对比:PPTAgent结构化生成与DeepPresenter环境驱动架构解析
  • 紧急更新!Perplexity v3.2作家索引逻辑变更后,3小时内必须掌握的4项适配策略
  • iOS激活锁终极绕过指南:5分钟免费解锁iPhone完整方案
  • Google I/O 2026 推出 Antigravity SDK:本地构建 AI Agent,灵活定制功能
  • 机器人自主探索:基于边界点优化与多步路径规划的SLAM实践
  • 《Keil MDK-Arm》编译报错:ARM Compiler Version 5缺失的深度排查与一站式修复指南
  • i.MX9352嵌入式开发实战:硬件调试、系统移植与驱动问题排查指南
  • 从Fmask到U-Net:遥感云检测算法怎么选?一份给地信从业者的选型指南
  • 新手建站首选!阿贝云免费云服务真实使用体验
  • 二本通信 gap 两年半,培训班学 C++/Qt,华为 OD 也没进:接下来别再乱投了
  • SL6119低压差线性稳压器设计实战:从核心原理到射频应用优化
  • 双非本西电通信工程研一无人机地面站方向,想转行 C++,哪个岗位最适合进大厂?
  • Qt UI文件编译时处理:三种模式详解与工程实践指南
  • P2PNet训练数据预处理实战:用Python脚本快速生成ShanghaiTech等数据集的train.list
  • 2026年Instagram营销指南:8大热门玩法与涨粉技巧
  • 从T-Pose到活灵活现:解决Mixamo动画导入Unity后材质丢失、骨骼错位的常见问题全攻略
  • 从氦氖到二氧化碳:聊聊那些“老当益壮”的工业气体激光器(选型避坑指南)
  • Spark:解决Minecraft服务器卡顿的终极性能诊断方案
  • OAuth 接入DeepSeek总失败?这3类JWT签名验证错误正在 silently 拒绝你的请求,速查!
  • 给电赛新手的STM32F407入门指南:用CubeMX和Keil5从点亮LED开始
  • 2026研发效能工具全景评测:Gitee Insight在DevSecOps赛道的差异化分析
  • FPGA UDP通信实战:从数据回环到网络测速,用Tri Mode Ethernet MAC玩转千兆以太网
  • 告别Blob分析:Halcon差异化模型在复杂印刷品检测中的降本增效实践
  • CTF靶场实战:手把手教你用PHP异或绕过字符限制,拿下SUCTF 2019 EasyWeb
  • Perplexity文化新闻搜索深度解析(文化语义锚点失效大起底):为什么92.6%的媒体从业者搜不到真正“在地性”报道?
  • 阶,原根