避坑指南:在Ubuntu 20.04上安装Cartographer ROS时,如何手动搞定那个恼人的.rosinstall文件?
2026/5/28 5:54:08 网站建设 项目流程

避坑指南:Ubuntu 20.04下Cartographer ROS安装中.rosinstall文件的优雅解决方案

当你在Ubuntu 20.04上安装Cartographer ROS时,可能会遇到一个令人头疼的问题:wstool merge命令因网络问题而失败。这种情况在依赖国外资源的开发环境中并不罕见,但幸运的是,我们有一个优雅的"Plan B"——手动创建和修改.rosinstall文件。本文将带你深入了解这一过程的每一步,解释其背后的原理,并对比自动与手动方式的优劣,帮助你绕过这个常见的网络依赖陷阱。

1. 理解.rosinstall文件的作用

在ROS生态系统中,.rosinstall文件扮演着至关重要的角色。它是一个YAML格式的清单文件,用于指定工作空间中需要包含的软件包及其来源。当使用wstool工具管理ROS工作空间时,这个文件就是所有依赖关系的"地图"。

关键组成部分

  • local-name: 本地存储库的名称
  • uri: 源代码仓库的URL
  • version: 要检出的分支或标签

对于Cartographer ROS安装,标准的.rosinstall文件通常包含以下三个核心组件:

  1. Cartographer核心库
  2. Cartographer ROS接口
  3. Ceres Solver优化库

提示:即使网络连接正常,了解如何手动创建.rosinstall文件也是一项有价值的技能,它能在自动化工具失效时为你提供备选方案。

2. 手动创建.rosinstall文件的详细步骤

wstool merge命令因网络问题失败时,我们可以完全手动完成这一过程。以下是具体操作步骤:

2.1 准备工作空间结构

首先,确保你的工作空间结构正确:

mkdir -p ~/cartographer_ws/src cd ~/cartographer_ws

2.2 创建并编辑.rosinstall文件

src目录下创建.rosinstall文件(注意这是一个隐藏文件):

nano ~/cartographer_ws/src/.rosinstall

将以下内容粘贴到文件中:

- git: local-name: cartographer uri: 'https://github.com/cartographer-project/cartographer.git' version: 'master' - git: local-name: cartographer_ros uri: 'https://github.com/cartographer-project/cartographer_ros.git' version: 'master' - git: local-name: ceres-solver uri: 'https://github.com/ceres-solver/ceres-solver.git' version: 'master'

关键点验证

  • 确保YAML格式正确(缩进和连字符)
  • 确认URI地址没有拼写错误
  • 检查版本标签是否符合你的需求

2.3 执行wstool update

完成文件编辑后,运行以下命令同步代码:

wstool update -t src

这个命令会根据.rosinstall文件中的配置,从各个仓库拉取源代码到本地工作空间。

3. 自动与手动方法的深度对比

了解两种方法的优缺点能帮助你在不同场景下做出最佳选择:

特性自动方法 (wstool merge)手动方法
执行速度中等(需要手动编辑文件)
网络依赖高(需要访问原始URL)低(只需最终下载代码)
灵活性低(使用预设配置)高(可自定义每个仓库配置)
错误排查困难(黑盒操作)容易(完全透明)
适用场景网络通畅的首次安装网络受限或需要定制配置的情况

选择建议

  • 对于标准安装且网络条件良好时,优先使用自动方法
  • 当遇到网络问题或需要特定版本/分支时,采用手动方法
  • 在自动化流程(如CI/CD)中,考虑将手动创建的.rosinstall文件纳入版本控制

4. 常见问题与高级技巧

即使成功创建了.rosinstall文件,在后续步骤中仍可能遇到各种问题。以下是几个典型场景及其解决方案:

4.1 依赖项缺失问题

在运行rosdep install时,你可能会遇到关于libabsl-dev的错误。这是因为:

  1. 该依赖项是后期添加到Cartographer中的
  2. Ubuntu 20.04的官方仓库中没有对应的包

解决方案

编辑cartographer/package.xml文件,删除或注释掉以下行:

<depend>libabsl-dev</depend>

然后重新运行依赖安装命令:

rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

4.2 Abseil库冲突处理

Cartographer需要特定版本的Abseil库,可能与系统已安装版本冲突。解决方法:

# 尝试移除可能存在的ROS Abseil包 sudo apt-get remove ros-${ROS_DISTRO}-abseil-cpp || true # 安装Cartographer所需的Abseil版本 src/cartographer/scripts/install_abseil.sh

注意:如果系统提示找不到ROS的Abseil包,说明没有冲突,可以直接进行下一步。

4.3 编译优化技巧

为了加快编译过程,可以使用以下命令:

catkin_make_isolated --install --use-ninja -j$(nproc)

其中:

  • -j$(nproc):使用所有可用的CPU核心并行编译
  • --use-ninja:使用更高效的Ninja构建系统
  • --install:将结果安装到install_isolated目录

5. 验证安装与测试

完成安装后,建议进行基本功能测试以确保一切正常:

  1. 下载测试数据集
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
  1. 运行2D建图演示
source ~/cartographer_ws/install_isolated/setup.bash roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

预期结果

  • RViz应该启动并显示激光雷达数据
  • 地图应该随着机器人移动而逐渐构建
  • 没有明显的错误或警告信息

6. 进阶:自定义.rosinstall文件的更多可能

掌握了手动创建.rosinstall文件的基本方法后,你可以进一步利用这一技能实现更高级的配置:

版本锁定:将version字段从'master'改为特定标签(如'1.0.0')以锁定版本,确保构建可重复性。

混合源:组合使用不同来源的仓库,例如同时使用GitHub和本地修改过的仓库。

多仓库管理:添加额外的依赖项到文件中,扩展工作空间的功能。

私有仓库集成:将公司内部的私有仓库URI添加到文件中,与开源组件一起管理。

# 示例:自定义版本的.rosinstall文件 - git: local-name: cartographer uri: 'https://github.com/cartographer-project/cartographer.git' version: '2.0.1' # 特定版本而非master - git: local-name: my_custom_planner uri: 'git@internal.company.com:robotics/custom_planner.git' version: 'dev-feature'

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询