行业资讯
📅 2026/8/3 18:07:44
ROS2 Humble安装与配置:从零搭建机器人开发环境
1. 从零到一为什么ROS2 Humble是当下机器人开发者的首选如果你刚接触机器人操作系统或者从ROS1迁移过来面对ROS2的众多发行版可能会有点懵。Humble Hawksbill作为ROS2的长期支持版本之一特别是与Ubuntu 22.04 LTS的深度绑定让它成为了目前最稳定、生态最成熟、新手最友好的选择。我经历过从ROS1 Kinetic到ROS2 Foxy再到Humble的完整迁移可以很负责任地说对于绝大多数新项目Humble是当前最稳妥的起点。为什么是Humble而不是更新的Jazzy或更老的Foxy这背后有几个很实际的考量。首先长期支持是关键。Humble的支持周期到2027年5月这意味着在这期间你都能获得官方的安全更新和关键修复这对于需要长期维护的机器人项目至关重要。其次生态成熟度。经过几年的发展Humble的包数量、社区教程、第三方工具支持如MoveIt 2, Nav2都达到了一个非常可用的状态很多在Foxy上还处于实验阶段的功能在Humble上已经稳定。最后开发环境友好。它原生支持Ubuntu 22.04 Jammy Jellyfish这是一个同样拥有长期支持的Linux发行版两者结合为你提供了一个至少五年内都无需担心基础平台过时的开发环境。很多新手会纠结于安装方式看到“一键安装脚本”就心动。但我必须提醒你对于ROS2这样复杂的系统理解安装过程比完成安装更重要。那些封装好的脚本虽然快但一旦遇到环境冲突、依赖缺失或者需要定制化配置时你会束手无策。今天我就带你走一遍最经典、也最可靠的APT源安装方式。这个过程就像搭积木每一步你都知道放了哪一块出了问题你也知道该检查哪里。这不仅是一次安装更是一次对ROS2软件源、包管理和系统依赖的入门学习。2. 安装前的精密准备避开99%的常见坑位安装ROS2不像安装一个普通软件它是一整个工具链和中间件框架。仓促开始大概率会卡在奇怪的依赖错误上。花十分钟做好准备工作能为你节省数小时的排错时间。2.1 系统环境确认不仅仅是Ubuntu版本首先确认你的系统是Ubuntu 22.04.4 LTS或更高版本。在终端输入lsb_release -a查看。Humble官方明确支持的是22.04在其他版本上即使能装上也会遇到各种难以预料的库冲突。注意如果你使用的是WSL2Windows Subsystem for Linux请确保是WSL2而非WSL1并且安装的是Ubuntu 22.04的发行版镜像。虚拟机如VMware、VirtualBox安装则无此限制但建议分配至少4GB内存和20GB磁盘空间编译时非常消耗资源。接下来至关重要的一步是更新现有软件包列表。这能确保你从仓库获取的是最新的安装源信息。sudo apt update sudo apt upgrade -y这个命令先刷新软件源索引update然后升级所有可升级的已安装包upgrade。-y参数是为了自动确认避免中途需要手动输入。升级后建议重启一次系统以确保所有更新尤其是内核更新完全生效。2.2 区域设置与字符编码被忽略的“小问题”这是一个极易被忽略但会导致后续rosdep初始化失败的坑。ROS2的构建工具对区域设置Locale有要求必须支持UTF-8字符编码。检查你的设置locale查看输出中LANG、LC_ALL等变量是否包含UTF-8。通常如果显示的是POSIX或C就需要设置。我们可以通过以下命令生成并设置sudo apt install locales -y sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8前两行安装区域设置工具并生成en_US.UTF-8的locale数据。第三行将其设为系统默认需要重启或重新登录生效。第四行是临时为当前终端会话设置。为了永久生效最好将export LANGen_US.UTF-8这行添加到你的~/.bashrc文件末尾。2.3 软件源配置引入ROS2的“软件仓库”Ubuntu系统本身不知道ROS2的软件包在哪里。我们需要将ROS2的官方软件仓库地址添加到系统的源列表中。这里我们使用Ubuntu的apt工具并选择从ROS官方服务器下载。首先确保已安装curl和software-properties-common工具sudo apt install curl software-properties-common -y然后通过curl获取并安装ROS2的GPG密钥。这个密钥用于验证从ROS仓库下载的软件包的完整性防止被篡改。sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg接着将ROS2 Humble的仓库源添加到系统。这里我们采用更现代的deb [signed-by...]格式将源信息写入/etc/apt/sources.list.d/目录下的一个独立文件这样管理起来更清晰。echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null这个命令看起来复杂拆解一下arch$(dpkg --print-architecture)自动获取你系统的架构如amd64, arm64。signed-by...指定我们刚才导入的GPG密钥路径。http://packages.ros.org/ros2/ubuntuROS2官方软件仓库地址。$(source /etc/os-release echo $UBUNTU_CODENAME)自动获取你系统的Ubuntu代号对于22.04就是jammy。tee /etc/apt/sources.list.d/ros2.list将生成的源字符串写入指定文件。完成这步后再次更新软件包列表让系统识别这个新加的源sudo apt update如果这一步没有报错并且apt update的最后能看到Hit:... http://packages.ros.org/ros2/ubuntu jammy/main ...这样的信息说明软件源配置成功。3. 核心安装与基础环境配置准备工作就绪现在可以开始安装ROS2的核心组件了。ROS2提供了多种“风味”的安装包对应不同的预装工具集。3.1 选择与安装ROS2“风味”对于绝大多数开发者我推荐安装ros-humble-desktop这个元数据包。它包含了ROS2的核心通信中间件RCLCPP, RCLPY、基础工具CLI工具、RViz2、RQt以及一系列常用的功能包和教程。这为你提供了一个立即可用的、功能完整的开发桌面环境。sudo apt install ros-humble-desktop -y这个安装过程会持续一段时间取决于你的网速和机器性能它会自动解决并安装数百个依赖包。期间你可能会看到大量的包名滚动这是正常的。如果你是在无图形界面的服务器或Docker容器中运行不需要GUI工具如RViz那么可以安装更精简的ros-humble-ros-base。sudo apt install ros-humble-ros-base -y3.2 安装开发工具构建与依赖管理的基石仅仅安装ROS2还不够我们还需要配套的编译和依赖管理工具。最重要的两个是colcon和rosdep。Colcon是ROS2推荐的构建工具你可以把它理解为ROS2世界的catkin_make或catkin build的进化版。它更模块化支持并行编译输出信息也更友好。sudo apt install python3-colcon-common-extensions -y安装后你可以在任何ROS2工作空间的根目录下使用colcon build命令来编译你的代码。Rosdep是一个用于安装系统依赖的神器。当你从GitHub克隆了一个ROS2功能包它的package.xml文件中会声明需要哪些系统库如OpenCV、PCL等。rosdep可以自动读取这些声明并帮你安装所有缺失的依赖。sudo apt install python3-rosdep -y安装完成后需要初始化rosdep。这个命令会从ROS的官方索引中下载最新的依赖规则数据库。sudo rosdep init rosdep updatesudo rosdep init只需要在每台电脑上执行一次。rosdep update则是更新本地规则缓存建议在安装新包前或定期执行。3.3 配置Shell环境让系统找到ROS2安装好的ROS2命令和库需要被你的终端Shell通常是Bash知道在哪里。我们需要将ROS2的“环境设置脚本”加入到Shell的启动配置中。ROS2的核心环境变量是通过一个脚本文件setup.bash来设置的。每次打开新的终端如果你想使用ROS2都需要“激活”这个环境。为了方便我们将其添加到~/.bashrc文件中这样每次启动终端都会自动设置好。echo source /opt/ros/humble/setup.bash ~/.bashrc这行命令的作用是将source /opt/ros/humble/setup.bash这行文本追加到你的家目录下的.bashrc文件末尾。source命令会立即执行该脚本设置当前环境。为了让这个更改在当前已打开的终端中立即生效而不需要关闭再打开一个新的终端你可以运行source ~/.bashrc或者更简单点. ~/.bashrc现在验证ROS2环境是否配置成功。打开一个新的终端或者执行了上面的source命令后尝试运行printenv | grep ROS你应该能看到类似ROS_VERSION2和ROS_DISTROhumble的环境变量。再试试ROS2的核心命令行工具ros2 --help如果能看到一长串命令列表如run,topic,node等那么恭喜你ROS2 Humble的核心框架已经成功安装并配置好了。4. 验证安装与运行第一个ROS2程序安装完成只是第一步确保它能正常工作才是关键。ROS2自带了一些很好的演示包可以用来进行端到端的验证。4.1 基础通信测试话题与节点让我们启动一个经典的“说话者-监听者”Demo。这个Demo包含两个节点一个节点定期发布消息到某个话题另一个节点订阅该话题并打印收到的消息。首先在一个终端中运行说话者节点ros2 run demo_nodes_cpp talker你会看到这个节点开始周期性地输出[INFO] [1700000000.000000000] [talker]: Publishing: Hello World: X其中X是一个递增的数字。然后打开第二个终端。由于我们已经将环境配置写入了.bashrc新终端会自动拥有ROS2环境。在这个新终端中运行监听者节点ros2 run demo_nodes_py listener如果一切正常监听者终端会开始打印[INFO] [1700000000.000000000] [listener]: I heard: [Hello World: X]内容与说话者发布的消息同步。这个简单的测试验证了ROS2核心RCLCPP和RCLPY安装正确。节点可以正常启动和运行。DDS中间件默认的Cyclone DDS工作正常实现了进程间通信。我们的环境配置是正确的。你可以使用CtrlC来终止每个节点的运行。4.2 使用ROS2命令行工具探索系统ROS2提供了一套强大的命令行工具用于内省和调试正在运行的系统。让我们用刚才的Demo来体验一下。在说话者和监听者都运行的情况下打开第三个终端。查看活动节点ros2 node list你会看到/talker和/listener两个节点。查看活跃的话题ros2 topic list你会看到/chatter这个话题这就是说话者发布、监听者订阅的通道。实时查看话题上的消息ros2 topic echo /chatter这个命令会像监听者节点一样开始实时打印/chatter话题上流动的每一条消息。这是调试时查看数据流最直接的方式。查看话题详情ros2 topic info /chatter --verbose这个命令会显示话题的类型这里是std_msgs/msg/String以及发布者和订阅者的详细信息。通过这些工具你可以像“外科手术”一样观察ROS2系统的内部状态这对于开发复杂应用和调试问题至关重要。4.3 图形化界面工具初探RViz2如果你安装的是desktop版本那么还可以体验ROS2的可视化工具——RViz2。它是ROS1中RViz的继承者用于可视化机器人模型、传感器数据、坐标变换等。在一个新终端中直接启动RViz2rviz2一个空白的RViz2窗口会弹出。虽然现在没有数据可显示但它的成功启动意味着GUI相关的依赖如Qt都已正确安装。你可以通过点击菜单栏的Panels-Add New Panel来添加各种显示插件例如Grid网格来确认基础功能正常。5. 创建你的第一个ROS2工作空间学会了使用现有的包下一步就是创建自己的代码和包。在ROS2中所有你自己的代码都应该放在一个或多个“工作空间”中。工作空间是一个目录里面包含你开发的源代码src以及编译后生成的可执行文件和库install,build,log。5.1 工作空间结构与初始化让我们创建一个名为dev_ws的开发工作空间。mkdir -p ~/dev_ws/src cd ~/dev_ws-p参数确保如果父目录不存在则一并创建。标准的ROS2工作空间根目录下有一个src文件夹用于存放所有功能包的源代码。即使src目录是空的我们也可以初始化工作空间。在工作空间根目录~/dev_ws下运行colcon build因为src里没东西所以编译过程会很快完成输出“Summary: 0 packages finished”。这个操作的主要目的是让colcon创建好必要的目录结构build,install,log并生成工作空间级别的环境设置文件。5.2 创建功能包与编写简单节点现在我们在src下创建一个Python功能包。ROS2中一个功能包是最小的可编译、可分发的单元。cd ~/dev_ws/src ros2 pkg create my_first_pkg --build-type ament_python --dependencies rclpyros2 pkg create是创建包的命令。my_first_pkg是你自定义的包名。--build-type ament_python指定这是一个Python包使用ament构建系统。--dependencies rclpy声明这个包依赖rclpyROS2的Python客户端库。命令执行后会在src下生成一个my_first_pkg的目录里面包含了一个标准Python包的基本结构特别是my_first_pkg/my_first_pkg这个子目录这里才是放Python模块代码的地方。让我们创建一个简单的发布者节点。在~/dev_ws/src/my_first_pkg/my_first_pkg目录下新建一个Python文件minimal_publisher.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String import time class MinimalPublisher(Node): def __init__(self): super().__init__(minimal_publisher) self.publisher_ self.create_publisher(String, my_topic, 10) timer_period 1.0 # seconds self.timer self.create_timer(timer_period, self.timer_callback) self.i 0 def timer_callback(self): msg String() msg.data Hello ROS2 from my package: %d % self.i self.publisher_.publish(msg) self.get_logger().info(Publishing: %s % msg.data) self.i 1 def main(argsNone): rclpy.init(argsargs) minimal_publisher MinimalPublisher() rclpy.spin(minimal_publisher) minimal_publisher.destroy_node() rclpy.shutdown() if __name__ __main__: main()这个节点创建了一个名为minimal_publisher的节点每秒向my_topic话题发布一条字符串消息。接下来需要让系统知道这个Python脚本是一个可执行节点。编辑~/dev_ws/src/my_first_pkg/setup.py文件找到entry_points部分修改为entry_points{ console_scripts: [ my_publisher my_first_pkg.minimal_publisher:main, ], },这行配置告诉构建系统在安装包时创建一个名为my_publisher的终端命令这个命令会执行my_first_pkg.minimal_publisher模块里的main函数。5.3 编译与运行自定义包现在回到工作空间根目录进行编译cd ~/dev_ws colcon build --packages-select my_first_pkg--packages-select参数指定只编译my_first_pkg这个包可以节省时间。编译成功后你会在输出信息的最后看到“Summary: 1 package finished”。编译完成后需要“激活”当前工作空间的环境这样才能找到我们刚刚编译好的包。在工作空间根目录下source install/setup.bash提示和系统级的/opt/ros/humble/setup.bash类似每个工作空间的install目录下也有一个setup.bash。工作空间的setup.bash会覆盖或扩展系统的环境。为了永久生效你也可以将source ~/dev_ws/install/setup.bash添加到你的~/.bashrc中但要放在系统ROS2源的那行之后。现在运行我们自己的节点ros2 run my_first_pkg my_publisher你应该能看到节点启动并开始每秒打印一次发布消息的日志。打开另一个终端运行ros2 topic echo /my_topic也能看到消息内容。至此你完成了从安装、验证到创建自己第一个ROS2功能包的完整闭环。6. 进阶配置与开发环境搭建基础环境搭好之后为了更高效地开发我们还需要配置一些外围工具和环境。6.1 安装与配置Visual Studio Code虽然你可以用任何文本编辑器但一个集成度高的IDE能极大提升效率。VSCode对ROS2和Python的支持非常好。首先安装VSCode然后安装以下几个关键扩展Python(由Microsoft发布)提供Python语言支持、调试、智能感知等。ROS(由Microsoft发布)这是最重要的扩展。它提供了ROS2工作空间检测、launch文件支持、节点管理、话题可视化等一站式功能。C/C(由Microsoft发布)如果你也进行C开发。YAML用于编辑launch.yaml和params.yaml文件。安装好ROS扩展后用VSCode打开你的工作空间目录~/dev_ws。扩展会自动检测到这是一个ROS2工作空间并在底部状态栏显示当前的ROS发行版如ROS: humble和选中的工作空间。你可以通过扩展提供的命令面板CtrlShiftP输入ROS来运行节点、查看话题、服务等非常方便。6.2 配置ROS_DOMAIN_ID多机/多环境通信隔离这是一个非常实用的高级特性。ROS_DOMAIN_ID是一个环境变量用于隔离不同的ROS2网络。默认情况下所有ROS2节点都在域ID 0上通信。如果你在同一个物理网络中有多组独立的机器人或者你在同一台机器上运行多个不想相互干扰的ROS2系统比如一个在测试新算法一个在运行稳定代码就可以通过设置不同的ROS_DOMAIN_ID将它们隔离开。例如在终端A中export ROS_DOMAIN_ID10 ros2 run demo_nodes_cpp talker在终端B中export ROS_DOMAIN_ID20 ros2 run demo_nodes_py listener此时终端B的监听者将收不到终端A说话者的消息因为它们处于不同的通信域10和20。只有域ID相同的节点才能相互发现和通信。这个功能在实验室多人开发或复杂部署场景下非常有用。6.3 安装常用工具与库根据你的开发方向可能还需要安装一些额外的工具和库Gazebo Fortress/Ignition机器人仿真环境。ROS2 Humble官方推荐与Ignition Edifice或Fortress配合但安装稍复杂通常有独立的安装脚本。Nav2, MoveIt 2导航和机械臂运动规划框架。它们通常作为独立的ROS2包提供可以通过apt安装如ros-humble-navigation2,ros-humble-moveit但更常见的是从源码编译以获得最新特性。Cartographer, SLAM ToolboxSLAM算法包。OpenCV, PCL, Eigen3常用的视觉和数学库。虽然它们不是ROS2包但很多ROS2包依赖它们。可以通过apt安装sudo apt install libopencv-dev libpcl-dev libeigen3-dev。安装这些大型功能包时强烈建议先创建一个干净的工作空间然后按照其官方GitHub仓库的README指导使用vcs工具进行多仓库源码克隆和编译而不是直接apt install以便于版本管理和自定义修改。7. 故障排除与常见问题指南即使按照步骤操作你也可能遇到问题。这里汇总了一些最常见的坑及其解决方案。7.1 软件源更新失败或GPG密钥错误症状执行sudo apt update时出现GPG error,NO_PUBKEY或Failed to fetch错误。原因网络问题导致无法连接ROS仓库或者GPG密钥过期/未正确安装。解决检查网络连接尝试ping packages.ros.org。重新导入GPG密钥sudo rm /usr/share/keyrings/ros-archive-keyring.gpg sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg检查源文件格式确认/etc/apt/sources.list.d/ros2.list文件内容正确特别是Ubuntu代号是否为jammy。尝试备用镜像源如果你在国内官方源可能较慢。可以尝试替换为国内镜像源如清华源、中科大源。这需要修改/etc/apt/sources.list.d/ros2.list文件中的URL。7.2rosdep init或rosdep update失败症状执行命令时卡住或报错连接超时、SSL错误等。原因rosdep需要从raw.githubusercontent.com下载规则文件这个域名在某些网络环境下访问不稳定。解决使用代理或更换网络环境这是最直接的方法。手动初始化如果sudo rosdep init失败可以手动创建文件。sudo mkdir -p /etc/ros/rosdep/sources.list.d/ echo yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml | sudo tee /etc/ros/rosdep/sources.list.d/20-default.list # 注意上述是osx的示例ubuntu的源不同。最稳妥是找到init失败时它试图下载的URL手动创建文件并写入内容。更常见的是rosdep update失败可以尝试修改rosdep的源为国内镜像。编辑/etc/ros/rosdep/sources.list.d/20-default.list将里面的https://raw.githubusercontent.com/ros/rosdistro/master替换为https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master使用GitHub代理。跳过rosdep对于新手如果不马上从源码编译复杂的第三方包可以暂时不处理此问题不影响核心功能使用。7.3 编译工作空间时出现“Package not found”或“Import Error”症状在colcon build时报错找不到某个ROS2包或Python模块。原因没有source正确的环境。编译前需要source /opt/ros/humble/setup.bash。在嵌套的工作空间中没有source上层工作空间的setup.bash。包的依赖没有安装。package.xml中声明了依赖但未通过rosdep或apt安装。解决确保在编译前终端中已经执行了source /opt/ros/humble/setup.bash。如果你有多个工作空间需要按照依赖顺序source它们的setup.bash。在编译前在工作空间根目录运行rosdep install --from-paths src --ignore-src -r -y。这个命令会检查src下所有包的package.xml并自动安装缺失的系统依赖。对于Python包的Import Error检查你是否在正确的Python虚拟环境中或者是否通过pip安装了所需的Python包如numpy,opencv-python。ROS2的apt包只提供系统级的C库和Python的rclpy等核心库其他Python第三方库需要自行pip install。7.4 运行节点时提示“无法找到可执行文件”症状ros2 run my_pkg my_node报错Package my_pkg not found或Could not find executable named my_node。原因包没有编译或者编译失败了。编译成功后没有source当前工作空间的install/setup.bash。setup.py或CMakeLists.txt中没有正确声明可执行文件。解决确认编译成功且无错误。查看colcon build的输出。在运行节点的终端中确保已经执行了source ~/dev_ws/install/setup.bash请替换为你的实际路径。一个简单的检查方法是echo $ROS_PACKAGE_PATH看是否包含你的工作空间的install目录。对于Python节点检查setup.py中entry_points的配置是否正确格式为node_name package_name.module_name:main_function。对于C节点检查CMakeLists.txt中的ament_add_executable和install(TARGETS ...)指令是否正确。安装ROS2是一个系统工程遇到问题很正常。关键是要学会看错误信息理解每一步操作的目的并善用搜索引擎和ROS社区如ROS Answers, GitHub Issues。把这次安装过程当成一次学习之旅理解背后的机制以后无论遇到什么问题你都能从容应对。