公司动态
Ubuntu 20.04安装ROS2 Humble完整指南:从系统准备到环境验证
1. 项目概述最近在折腾机器人项目发现ROS2的生态越来越成熟很多新的开源包和商业方案都开始优先支持ROS2了。我手头正好有一台装着Ubuntu 20.04 LTS的开发机就想着把ROS2环境给搭起来。虽然官方文档很全但实际操作下来还是有不少细节需要注意尤其是网络环境、依赖冲突和版本选择这几个地方稍不留神就会卡住半天。这篇文章就是把我从零开始在Ubuntu 20.04上安装ROS2 Humble Hawksbill的完整过程、踩过的坑以及一些优化配置记录下来希望能帮你省点时间一次搞定。ROS2和ROS1在架构上差别不小它采用了基于DDS的通信中间件解决了ROS1中存在的单点故障、实时性差等问题更适合用于对可靠性和性能要求更高的生产环境。Ubuntu 20.04作为一个长期支持版本稳定性好社区支持广泛是很多机器人开发者的首选系统。这次我们选择安装的是ROS2 Humble Hawksbill它是针对Ubuntu 22.04Jammy设计的LTS版本但经过验证在Ubuntu 20.04Focal上也能稳定运行这为我们提供了一个在较老系统上使用较新、功能更全的ROS2版本的机会。这个教程适合谁呢如果你是刚接触ROS2的机器人爱好者、学生或者是从ROS1迁移过来的开发者想在Ubuntu 20.04上搭建一个可用的ROS2开发环境那么跟着步骤走就行。我会尽量把每一步的原理和可能遇到的问题说清楚让你不仅能把环境装好还能明白为什么要这么操作。2. 安装前的系统准备与规划在动手安装ROS2之前我们必须先把系统的基础环境打理好。这就像盖房子前要打好地基地基不稳后面装什么高级框架都可能出问题。对于Ubuntu 20.04来说有几点是必须提前确认和处理的。2.1 系统版本与内核确认首先打开终端输入以下命令查看你的系统信息lsb_release -a你应该能看到类似Ubuntu 20.04.6 LTS这样的输出代号是focal。确保你的系统是20.04版本因为后续的软件源配置和ROS2版本选择都基于此。接着查看一下内核版本uname -r我当前的内核是5.15.0-91-generic。这里有一个很多人关心的问题Ubuntu 20.04能适配6.8内核吗理论上通过手动编译或使用主线内核PPA你可以将内核升级到6.8。但是强烈不建议在安装ROS2之前或之后这样做。原因有三点第一非官方支持的内核可能与系统内置的驱动尤其是显卡驱动、Wi-Fi驱动产生兼容性问题导致系统不稳定甚至无法启动。第二ROS2的核心通信库如Fast DDS以及一些底层驱动如librealsense对内核版本有特定依赖在新内核上可能需要重新编译过程复杂。第三我们追求的是稳定的开发环境而不是最新的内核。因此请保持系统默认的或由ubuntu-hwe系列提供的LTS内核如5.15这是最稳妥的选择。2.2 网络与软件源配置安装ROS2需要从ROS官方服务器下载大量的软件包一个稳定、快速的网络连接至关重要。如果你身处网络环境特殊的地区可能会遇到连接超时或速度极慢的问题。请务必确保你的系统能正常访问外网且速度尚可。你可以通过ping www.google.com如果可达或curl -I https://raw.githubusercontent.com来测试网络连通性。接下来是配置软件源。Ubuntu默认的软件源可能不是最快的我们可以换成国内的镜像源以加速下载。这里以阿里云镜像为例备份原来的源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑源列表文件sudo nano /etc/apt/sources.list将文件内容替换为阿里云镜像源适用于Ubuntu 20.04 Focaldeb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse保存并退出在nano中按CtrlX然后按Y再按Enter。更新软件包列表sudo apt update注意更换软件源是常规操作但务必选择可靠、同步及时的镜像。除了阿里云清华、中科大等镜像也是不错的选择。这一步能显著提升后续所有apt install命令的速度。2.3 安装基础开发工具在安装ROS2之前我们需要一些基础工具来辅助安装和后续开发。运行以下命令一次性安装sudo apt install -y curl git wget software-properties-common build-essential cmake python3-pip python3-argcompletecurl,wget: 用于从网络下载文件安装ROS2密钥和源时会用到。git: 版本控制工具后续克隆ROS2示例代码或你自己的项目必不可少。software-properties-common: 提供了add-apt-repository命令方便我们添加PPA软件源。build-essential,cmake: C/C编译工具链和构建系统。ROS2的核心和许多功能包都是C编写的编译离不开它们。python3-pip: Python包管理工具。ROS2 Humble大量使用Python 3许多工具和依赖需要通过pip安装。python3-argcomplete: 为命令行工具提供自动补全功能能极大提升使用ROS2命令行工具如ros2时的效率。安装完这些我们的“地基”就算打好了。接下来就可以进入正式的ROS2安装环节。3. ROS2 Humble 详细安装步骤ROS2的安装主要分为几个核心步骤添加ROS2软件源、安装ROS2桌面版、配置环境变量。虽然步骤不多但每一步都有需要注意的细节。3.1 添加ROS2 GPG密钥与软件源这是确保我们下载的软件包来自官方、未被篡改的关键一步。首先添加ROS2的GPG密钥sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg这个命令从ROS的GitHub仓库下载公钥并保存到系统可信密钥环中。如果因为网络问题curl失败可以多试几次或者尝试使用wget命令。接下来将ROS2 Humble的软件源添加到系统。由于我们是在Ubuntu 20.04上安装为22.04设计的Humble需要手动指定系统代号为jammyecho deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null关键点解析arch$(dpkg --print-architecture)自动获取你系统的架构通常是amd64或arm64确保下载正确的包。signed-by...指定验证软件包签名的密钥环文件路径这是更安全的做法。http://packages.ros.org/ros2/ubuntuROS2官方的软件包仓库地址。jammy main这里指定了Ubuntu 22.04Jammy的仓库和main组件。这就是为什么我们能在20.04上安装Humble的原因我们直接使用了针对22.04的二进制包。大部分基础库是兼容的但极少数底层依赖可能需要额外处理。添加源之后更新APT软件包列表sudo apt update此时你可能会看到一些关于“jammy”源的提示被添加这是正常的。如果遇到NO_PUBKEY错误通常是GPG密钥添加失败请重新执行添加密钥的命令。3.2 安装ROS2桌面版推荐ROS2提供了多种安装变体ros-base仅核心通信和工具、desktop包含GUI工具和基础功能包、desktop-full最全的功能包集合。对于大多数开发者我推荐安装desktop版本它包含了ROS2核心、命令行工具、常用的GUI工具如RQt以及一些演示功能包足够学习和开发使用。sudo apt install -y ros-humble-desktop这个命令会安装上百个软件包包括ros-humble-ros-core: ROS2的核心通信库如rclcpp,rclpy。ros-humble-rqt-*: 一系列基于Qt的图形化工具用于话题可视化、参数调整等。ros-humble-demo-nodes-*: 一些演示用的节点方便测试。各种消息类型、工具和依赖库。安装过程视网络速度而定可能需要10-30分钟。如果中途网络中断可以重新运行该命令APT会继续未完成的安装。实操心得安装desktop版本而非desktop-full是一个平衡的选择。desktop-full包含的包太多其中一些你可能永远用不到反而可能引入不必要的依赖冲突。desktop版本已经涵盖了开发所需的大部分工具其他特定功能包可以按需单独安装例如导航用ros-humble-navigation2感知用ros-humble-perception。3.3 安装开发工具与依赖仅仅安装ROS2还不够我们还需要一些额外的工具来方便开发和构建代码。最重要的就是colcon构建工具和rosdep依赖管理工具。安装colconcolcon是ROS2推荐的构建工具它替代了ROS1中的catkin_make。sudo apt install -y python3-colcon-common-extensions安装后你就可以在终端使用colcon build等命令了。安装rosdeprosdep是一个用于安装ROS包系统依赖的工具。当你从源码编译一个ROS2功能包时它可能依赖一些系统库如OpenCV、PCLrosdep可以帮你自动安装这些依赖。sudo apt install -y python3-rosdep安装后需要初始化rosdepsudo rosdep init rosdep updaterosdep init命令会创建/etc/ros/rosdep/sources.list.d/20-default.list文件其中包含了ROS依赖规则的数据源地址。rosdep update则是从这些地址下载最新的依赖规则数据库到本地。常见问题执行sudo rosdep init时可能会遇到错误“ERROR: cannot download default sources list from...”。这几乎总是网络问题。由于rosdep默认的源地址在国外访问可能不稳定。解决方法是为rosdep设置国内镜像源。你可以编辑或创建文件/etc/ros/rosdep/sources.list.d/20-default.list将其内容替换为国内镜像地址例如使用清华源# os-specific listings first yaml https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx # generic yaml https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/base.yaml yaml https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/python.yaml yaml https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/ruby.yaml gbpdistro https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/releases/fuerte.yaml fuerte # newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead保存后再运行rosdep update速度会快很多。3.4 配置Shell环境变量安装完成后ROS2的命令如ros2并不会立即可用因为它的可执行文件和库路径还没有加入到系统的环境变量中。我们需要“source”一个设置脚本。最常用的方法是将source命令添加到你的shell配置文件中这样每次打开新的终端都会自动设置ROS2环境。根据你使用的shell通常是bash或zsh编辑对应的配置文件对于bashecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc对于zshecho source /opt/ros/humble/setup.zsh ~/.zshrc source ~/.zshrc现在在终端中输入ros2你应该能看到ROS2命令行工具的帮助信息了。为了验证核心功能是否正常我们可以运行一个经典的“小海龟”演示。打开两个终端。在第一个终端启动一个“小海龟”模拟器节点ros2 run turtlesim turtlesim_node你会看到一个带有随机小海龟的图形窗口弹出。在第二个终端启动控制节点让小海龟动起来ros2 run turtlesim turtle_teleop_key按照终端提示通常是方向键你就能控制小海龟移动了。这证明ROS2的核心通信机制节点、话题工作正常。4. 安装后的关键配置与验证环境装好了能跑demo了但这只是第一步。要让这个环境真正好用、适合长期开发还需要进行一些关键的配置和深度验证。4.1 创建工作空间与编译测试ROS2的代码通常组织在工作空间workspace中。我们来创建一个标准的工作空间并测试编译流程。mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src接下来我们从ROS2的示例仓库中克隆一些测试用的功能包git clone https://github.com/ros2/examples.git -b humble然后回到工作空间根目录使用colcon进行编译cd ~/ros2_ws colcon build --symlink-install--symlink-install这个参数非常重要。它会让安装目录中的文件以符号链接的形式指向构建目录中的源文件。这样当你修改了Python或配置文件后无需重新编译改动会立即生效极大地提升了开发效率。编译完成后你需要source这个工作空间的设置文件才能使用其中编译好的包source ~/ros2_ws/install/setup.bash同样你也可以把这行命令加到你的~/.bashrc或~/.zshrc文件中放在ROS2系统环境source命令的后面以确保工作空间中的包能覆盖系统包如果需要的话。现在测试一下我们编译的示例节点。运行一个用C写的发布-订阅示例ros2 run examples_rclcpp_minimal_publisher publisher_member_function在另一个终端运行订阅者ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function你应该能在订阅者终端看到不断打印的“Hello World”消息。这说明你的编译工具链、环境配置都是正确的。4.2 核心工具链验证与问题排查除了基础的通信我们还需要验证一些高级特性和工具是否正常。验证RQt图形化工具 RQt是ROS2中非常重要的插件式GUI框架。运行以下命令启动一个空的RQt界面rqt如果一切正常一个空的RQt窗口会打开。你可以通过菜单栏的Plugins加载各种插件例如Introspection - Node Graph可以查看节点图Topic - Message Publisher可以手动发布消息。如果rqt命令未找到请检查是否安装了ros-humble-desktop并确认环境变量已正确source。验证ROS2命令行工具完整性 ROS2的命令行工具非常强大。我们可以系统性地检查一下# 查看所有已安装的功能包 ros2 pkg list # 查看某个包的具体信息例如 turtlesim ros2 pkg prefix turtlesim # 查看系统当前所有活跃的节点 ros2 node list # 查看所有活跃的话题 ros2 topic list如果这些命令都能正常执行并返回信息说明ROS2的安装是完整且健康的。处理可能的依赖缺失 有时候安装ROS2桌面版可能漏掉一些非强依赖的Python包。一个常见的例子是ros2bag录制功能依赖的pygraphviz。如果你在使用ros2 bag record时遇到相关错误可以手动安装sudo apt install -y python3-pygraphviz # 或者通过pip安装 # pip3 install pygraphviz另一个常见的是rviz23D可视化工具的OpenGL问题。如果启动rviz2时遇到黑屏或崩溃可能是显卡驱动或OpenGL库的问题。对于NVIDIA显卡请确保安装了专有驱动可通过“软件和更新”-“附加驱动”安装。对于所有显卡可以尝试安装通用的OpenGL相关库sudo apt install -y mesa-utils libgl1-mesa-glx libgl1-mesa-dri安装后运行glxinfo | grep “OpenGL version”来检查OpenGL是否正常。4.3 环境配置优化与常用别名为了提升日常开发效率我习惯在~/.bashrc或~/.zshrc中添加一些别名和自定义函数。# 添加到 ~/.bashrc 或 ~/.zshrc 的末尾 # ROS2 环境快速source alias sros“source /opt/ros/humble/setup.bash” alias sws“source ~/ros2_ws/install/setup.bash” # 快速进入工作空间目录 alias cw“cd ~/ros2_ws” alias cs“cd ~/ros2_ws/src” # 简化colcon构建命令在工作空间目录下使用 alias cb“colcon build --symlink-install” alias cbt“colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPEDebug” alias cbr“colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDSON” # 快速清理构建文件慎用 alias clean_ws“rm -rf ~/ros2_ws/build ~/ros2_ws/install ~/ros2_ws/log” # 一个有用的函数快速source当前目录下最近的一个工作空间 function sros_local() { local ws_path$(find . -maxdepth 2 -name “setup.bash” -type f | head -1) if [[ -n “$ws_path” ]]; then source “$ws_path” echo “Sourced: $(dirname “$ws_path”)” else echo “No setup.bash found in current or subdirectories.” fi }添加后执行source ~/.bashrc使其生效。这样cw就能快速跳转到工作空间cb就能一键编译非常方便。5. 进阶从源码编译ROS2与疑难排错虽然二进制安装简单快捷但有时你可能需要从源码编译ROS2例如你想使用main分支的最新特性或者需要为特定硬件如ARM架构进行定制化编译。此外了解源码编译流程也能帮助你更好地理解ROS2的构成并在遇到棘手问题时多一种解决思路。5.1 源码编译ROS2 Humble从源码编译ROS2是一个相对耗时的过程需要稳定的网络和足够的磁盘空间约20GB。以下是精简步骤安装依赖首先安装比二进制安装更全面的依赖工具。sudo apt update sudo apt install -y \ python3-rosdep \ python3-vcstool \ build-essential \ cmake \ git \ libbullet-dev \ python3-colcon-common-extensions \ python3-flake8 \ python3-pip \ python3-pytest-cov \ python3-rosdep \ python3-setuptools \ python3-vcstool \ wget创建工作空间并获取源码mkdir -p ~/ros2_humble/src cd ~/ros2_humble wget https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos vcs import src ros2.repos这一步会使用vcs工具根据ros2.repos文件中定义的版本从各个Git仓库拉取ROS2所有核心包的源码。使用rosdep安装系统依赖sudo rosdep init rosdep update rosdep install --from-paths src --ignore-src -y --skip-keys “fastcdr rti-connext-dds-6.0.1 urdfdom_headers”--skip-keys参数跳过了几个可能需要特殊处理或商业许可的依赖包。fastcdr和rti-connext-dds-6.0.1是可选DDS实现urdfdom_headers通常可以通过其他方式安装。编译在工作空间根目录执行编译。colcon build --symlink-install这个过程会非常漫长可能需要数小时取决于你的CPU性能。你可以使用-j参数指定并行编译任务数来加速例如colcon build --symlink-install --parallel-workers 8。配置环境编译完成后source你编译出的设置文件。source ~/ros2_humble/install/setup.bash注意事项源码编译最大的挑战是网络和依赖。vcs import步骤需要从GitHub等地址拉取大量仓库务必保证网络通畅。rosdep install步骤可能会因为某些软件包版本问题而失败需要根据具体的错误信息去搜索解决方案有时需要手动安装特定版本的库。5.2 常见安装与运行问题排查实录即使按照教程一步步来也可能遇到各种问题。这里我记录了几个最常见的问题和解决方法。问题一运行ros2命令提示“命令未找到”或“No module named ‘ros2cli’”原因环境变量没有正确设置。这是最常见的问题。排查检查是否执行了source /opt/ros/humble/setup.bash。新开的终端需要重新source或者确认已将其添加到~/.bashrc。检查~/.bashrc中source命令的路径是否正确。确认ROS2是否安装在了/opt/ros/humble。如果你使用了zsh确保source的是setup.zsh并且命令添加到了~/.zshrc。解决手动source一次并检查配置文件。问题二sudo rosdep init失败提示“ERROR: cannot download default sources list”原因网络无法访问raw.githubusercontent.com。解决首选方案按照前面章节所述手动创建/etc/ros/rosdep/sources.list.d/20-default.list文件并使用国内镜像源内容。备用方案如果手动创建后rosdep update依然很慢或失败可以尝试修改rosdep源码中使用的URL。找到/usr/lib/python3/dist-packages/rosdep2/sources_list.py路径可能略有不同将其中的https://raw.githubusercontent.com/ros/rosdistro/master替换为https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master。此方法较 hack谨慎使用。问题三编译工作空间时出现“Could NOT find PythonLibs”或找不到某个Python包原因CMake找不到指定版本的Python开发库或者Python的setuptools等包缺失。解决确保安装了对应Python版本的开发包sudo apt install -y python3-dev。确保安装了python3-setuptools和python3-pip。对于通过pip安装的Python包如empy,lark如果CMake找不到可以尝试用pip3 install --user重新安装或者检查PYTHONPATH环境变量。问题四运行rviz2或gazebo等图形工具时窗口黑屏、闪退或提示GLX错误原因通常是图形驱动或OpenGL相关库的问题在虚拟机或某些显卡配置下常见。排查与解决硬件加速检查在终端运行glxinfo | grep “direct rendering”应该显示“Yes”。如果不是说明没有启用硬件加速。虚拟机如果你在使用VMware或VirtualBox请确保已安装并启用了3D加速功能在虚拟机设置中并安装了虚拟机工具如open-vm-tools-desktop。NVIDIA显卡务必使用专有驱动而非开源驱动nouveau。可以通过nvidia-smi命令验证驱动是否安装成功。通用库安装基础的OpenGL库sudo apt install -y mesa-utils libgl1-mesa-glx libgl1-mesa-dri。软件渲染作为最后的手段可以强制使用软件渲染。在启动命令前添加LIBGL_ALWAYS_SOFTWARE1例如LIBGL_ALWAYS_SOFTWARE1 rviz2。但这会非常卡顿仅用于测试。问题五ROS2节点间无法通信ros2 topic list看不到对方节点发布的话题原因ROS2默认使用DDS进行通信如果网络配置尤其是多机通信时或DDS设置不当会导致发现机制失败。排查单机首先确认所有节点都在同一个终端或source了相同环境启动实际上只要在同一台机器上且使用默认的DDS配置Fast DDS通常都能发现。检查是否有防火墙规则阻止了本地进程间通信通常不会。多机这是最常见的问题场景。需要确保所有机器时钟同步使用chrony或ntp。所有机器在同一网段并能互相ping通。设置正确的环境变量。在每台机器的~/.bashrc中除了source ROS2还需要设置export ROS_DOMAIN_ID一个相同的数字例如0 export ROS_LOCALHOST_ONLY0 # 如果想限制仅本地则设为1对于更复杂的网络可能需要配置FASTRTPS_DEFAULT_PROFILES_FILE来指定DDS的发现和传输配置。DDS实现确认通信双方使用的是同一种DDS实现默认都是Fast DDS。可以通过export RMW_IMPLEMENTATIONrmw_fastrtps_cpp来显式指定。建立一个稳定的ROS2开发环境就像是搭积木每一步都要稳。从系统准备、软件源配置到核心安装、环境设置再到最后的验证和优化环环相扣。我自己的经验是严格按照官方文档的步骤但在遇到网络或依赖问题时知道去哪里找替代方案比如国内镜像和排查方向这才是最重要的。这个环境搭好之后你就可以尽情探索ROS2的世界了无论是去跑navigation2做导航还是连接mycobot这样的机械臂或者学习cartographer建图都有了坚实的基础。如果在后续使用中遇到包依赖问题记住rosdep install --from-paths src --ignore-src -y是你的好朋友如果编译出错仔细看colcon build的输出通常错误信息会直接指向缺失的头文件或库名。