ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Ubuntu 22.04安装ROS1 Noetic全攻略:依赖冲突与rosdep避坑指南

2026/10/3 6:00:22 拓冰建站 浏览量
Ubuntu 22.04安装ROS1 Noetic全攻略:依赖冲突与rosdep避坑指南 1. 项目概述为什么Ubuntu 22.04装ROS1要先调整预期先说结论ROS1 Noetic官方只支持Ubuntu 20.04Focal官方并没有为22.04Jammy准备Noetic的apt安装包。很多朋友新买电脑预装22.04或者从20.04升级到22.04之后才发现大学课程、开源代码、仿真环境全都还是基于ROS1写的这时候只能想办法把Noetic往新系统上“硬移植”。这篇文章就是记录我前后折腾了三次、把系统搞崩过一次之后总结出的可行方案和避坑经验。很多人第一个反应是去搜“Ubuntu22.04安装ROS1教程”结果搜出来的文章要么是让你装ROS2要么是教你用Docker。ROS2当然可以但如果你是要跑现有的ROS1功能包、复现课程实验ROS2并不能直接兼容这时候你只能选择在22.04上把ROS1 Noetic跑起来。本文适合下面这几类人新电脑预装22.04但课程要求用ROS1、手头项目代码基于Noetic且暂时没法迁移到ROS2、或者就是想搞清楚Noetic在22.04上到底能不能装、极限在哪里。我会把能走通的路径、容易翻车的地方、以及哪些功能包大概率跑不了全部讲清楚。整体安装策略是继续使用官方ROS源中面向Focal的Noetic二进制包让apt在Jammy系统上解析依赖对rosdep、Python版本等部分做手工适配。这条路不是官方方案确实需要一些“人肉补丁”但只要按顺序来多数机器都能成功跑起来。2. 环境准备先把软件源和基础依赖搭好2.1 更新系统并安装必要工具不管在物理机还是虚拟机上第一步都是把系统升级到最新再开始折腾。装ROS1的过程中会编译一些从源码拉下来的功能包系统版本太老会导致编译器、cmake版本对不上白白浪费时间。sudo apt update sudo apt upgrade sudo apt install curl gnupg lsb-release vim git sudo apt install software-properties-common sudo add-apt-repository universeadd-apt-repository universe这步容易被跳过但它很关键。ROS不少依赖包放在universe仓库里不开启的话后面apt install ros-noetic-desktop-full可能会突然报出“软件包无法定位”的错误。lsb-release则是为了让部分ROS脚本能正确识别系统版本。注意如果你是在虚拟机上装建议给虚拟机分配至少4G内存、2个CPU核心、30G以上磁盘空间。Noetic的desktop-full装完大概要占6~8G加上编译缓存20G磁盘其实很紧张。2.2 添加ROS1 Noetic软件源选Focal还是Jammy这是第一个大坑。网上很多教程会写sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list这条命令在20.04上没问题因为$(lsb_release -sc)会输出focal。但在22.04上它会输出jammy而ROS官方源根本没有jammy目录下的Noetic包。执行sudo apt update时会直接报“Release file not found”或者直接找不到ros-noetic-*系列软件包。正确的做法是手动把发行版代号指定为focalsudo sh -c echo deb [trustedyes] http://packages.ros.org/ros/ubuntu focal main /etc/apt/sources.list.d/ros1.list这里有个细节[trustedyes]意思是信任该源不校验GPG签名。严格来说这不是最好的做法但对于添加ROS源这个场景官方key服务器经常连接不稳定用trustedyes能少踩一个坑。如果你不放心也可以用官方推荐的sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654导入key然后再去掉[trustedyes]。接下来更新源sudo apt update注意把focal仓库添加到jammy系统会让apt看到大量来自focal的软件包这些包和jammy原生包的版本存在冲突。后面安装ROS包时如果出现依赖问题不要慌这是预期内的情况我会在下一节专门说怎么处理。2.3 安装常用工具包安装ROS前先装好tar、python3等基础包sudo apt install python3 python3-dev python3-pip sudo apt install build-essential cmake pkg-config另外推荐提前安装aptitude后面解决依赖冲突会用到sudo apt install aptitudeaptitude是一个比apt更强大的包管理器它的依赖解析器支持多种降级方案在focaljammy混装的场景下经常能给出apt给不出来的解决方案。2.4 ROS源与国内镜像的建议如果你在20.04上装过ROS肯定熟悉packages.ros.org。这个源国内直连速度一般但胜在稳定。如果你apt update速度实在太慢可以把源换成国内镜像比如清华源sudo sh -c echo deb [trustedyes] https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main /etc/apt/sources.list.d/ros1.list但有一点要注意这里清华镜像目录名是ubuntu而不是ros/ubuntu。用哪家镜像都可以关键是路径一定要写对。我自己的习惯是先直接连官方源试一次如果apt update十来分钟都没跑完再切镜像。实际上在22.04这种非官方版本上镜像源和官方源的包内容是一样的不会额外增加风险。3. 核心实操安装ROS1 Noetic全流程记录3.1 安装ros-noetic-desktop-full省心还是省事第一次尝试时我直接跑了sudo apt install ros-noetic-desktop-full结果让人喜忧参半。喜的是在大部分依赖项都能正常解析忧的是中间有几个包报出了依赖冲突冲突集中在libboost、libpython3.8和python3-catkin-pkg这几个老面孔上。如果你的apt安装过程中没有报错直接跳到3.3节做rosdep初始化就行。如果和我一样碰到报错先执行sudo aptitude install ros-noetic-desktop-fullaptitude会列出几套解决方案注意看它准备怎么解决它会尝试“降级”某些依赖包也可能建议“保持某个包不变”。这时候不要直接按默认方案要一个一个仔细看。我遇到的绝大多数情况aptitude最后给出的可行方案是“保留jammy版本的libboost不安装ROS里对应的focal版本库”。这个方案通常可以让Noetic的核心功能先跑起来但某些依赖boost特殊版本的ROS包后面可能会出问题这个风险要提前有心理准备。如果你连aptitude都不好使那可以退而求其次只装核心组件sudo apt install ros-noetic-ros-baseros-base包含roscpp、rospy、std_msgs这些最核心的包体积小、依赖也少跑节点完全够用。后面缺哪个包再单独sudo apt install ros-noetic-包名缺少的依赖用aptitude补。3.2 处理好第三方依赖冲突别把系统搞崩这是整个过程中最容易让系统变砖的一步。很多教程会告诉你“强制安装focal版本的libboost”但这种做法会把系统里的libboost1.74降级到1.71导致其他软件崩溃。我第一次搞崩系统就是因为强行降级了libboost-thread-dev最后连桌面都进不去了。我的经验是能避免降级就避免降级。Noetic本体编译时虽然对boost版本有要求但运行时对boost的依赖其实没有想象中那么严格。很多情况下jammy自带的boost1.74完全可以满足Noetic的二进制需求只是apt的依赖解析器“太死板”而已。具体操作建议先用aptitude尝试安装不要选“降级系统大量软件包”的方案。如果aptitude提示需要降级boost我可以选择保持boost版本不变用apt -f install强行修复sudo apt -f install有时候安装中段的冲突只是某个软件包索引不一致用-f修完就能继续。实在装不上desktop-full时转装ros-base再加自己实际需要的功能包。我后来在22.04上跑定位导航仿真就是装的ros-noetic-ros-baseros-noetic-navigationros-noetic-gazebo-ros本质上和desktop-full差不多够用了。3.3 初始化rosdep手动方案保平安安装完ROS包之后rosdep必须初始化否则后面创建功能包、编译依赖时都会出问题。按官方文档执行sudo rosdep init rosdep update在22.04上sudo rosdep init大概率会卡住或者报错因为它需要从GitHub拉取rosdistro的数据。如果这一步失败了不要反复重试直接手动创建rosdep源文件sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.listcurl仍然失败的话可以从一台已经装好ROS的机器上拷贝这个20-default.list文件或者手动创建一个文本文件内容指向rosdistro的raw地址。关键是让rosdep在有数据源的情况下跑update。接下来更新rosdep数据rosdep update如果update也因为网络原因失败可以在网络条件较好的环境中先把rosdistro整个仓库clone到本地然后修改20-default.list中的URL为file:///home/用户名/rosdistro/rosdep/base.yaml这样的本地路径。这样rosdep就能在完全离线的情况下完成数据源更新。这部分完全是因为GitHub访问不稳定导致的各种奇怪问题如果网络没问题直接用官方命令就好不用折腾手动方案。3.4 配置环境变量并验证安装环境变量是新手最容易漏的一步。我们需要把ROS的环境变量写入~/.bashrc这样每次开终端都会自动加载echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc注意如果系统里同时装了ROS2这一步会互相冲突。ROS2用的环境变量是source /opt/ros/humble/setup.bash两个环境的setup.bash最好不要同时source否则后面的shell命令可能因为环境变量覆盖而出现问题。我自己的做法是只把ROS1的source写进bashrcROS2用的时候手动执行source。然后验证安装结果roscore如果看到“started core service [/rosout]”字样说明ROS主节点已经能正常启动。另外再开一个终端验证rosnode list应该能看到/rosout节点说明安装基本成功。4. Python版本适配与catkin工作空间创建4.1 Python 3.8和3.10的兼容性分析ROS1 Noetic是ROS1最后一个版本也是第一个完全抛弃Python2、全面使用Python3的版本。它开发时针对的是Ubuntu 20.04自带的Python 3.8。而Ubuntu 22.04默认是Python 3.10两个版本的C扩展模块二进制格式不兼容这是Noetic在22.04上最大的“暗伤”。不过好消息是ROS1的很多核心Python代码用的是纯Python比如rospy、roslaunch、rosparam这些它们在Python 3.10下通常也能正常运行。真正会出问题的是经过了C/C编译的Python扩展模块比如cv_bridge、image_geometry以及依赖这些扩展的视觉相关功能包。这些功能包要么自己重新编译要么就得忍受导入时报“undefined symbol”之类的错误。我第二次尝试失败就是因为强行把系统的python3指向了python3.8导致系统自带的很多Python项目全都乱套了。所以我的最终建议是千万别改系统级的Python默认版本维护好一条“应用层兼容”的路就行了。4.2 安装catkin工具链创建catkin工作空间之前先确认catkin相关的Python包已经装好sudo apt install python3-rospkg python3-catkin-pkg python3-empy sudo apt install python3-catkin-toolspython3-catkin-tools在jammy仓库中可以直接安装这很关键。如果你用默认的catkin_make在Python 3.10环境下偶尔会遇到奇怪的模板语法问题而catkin_tools即catkin build命令对Python 3.10的兼容性要好得多。所以下面的工作空间创建我直接用catkin build。这里顺带解释一下为什么Noetic本身对catkin有版本要求catkin是ROS的构建系统它负责解析package.xml、CMakeLists.txt并生成对应的CMake工程。如果catkin_pkg版本太老可能不识别新版package.xml格式就会出现“package at ... does not exist”之类的诡异报错。21.10之后的新版catkin_pkg在Python 3.10下表现更稳定。4.3 创建并编译第一个catkin工作空间工作空间是ROS项目的基本组织形式。创建过程很固定mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin init catkin buildcatkin init会在~/catkin_ws下生成.catkin_tools配置文件同时检查src目录是否存在。第一次catkin build会在src下生成CMakeLists.txt软链接这是ROS内部机制不用管。编译完成后源码里才会出现devel目录需要source一下source ~/catkin_ws/devel/setup.bash为了让以后每个终端都能自动加载这个工作空间可以把它写进bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc注意这行必须加在source /opt/ros/noetic/setup.bash之后因为工作空间的setup会覆盖一些环境变量比如ROS_PACKAGE_PATH。如果顺序倒了可能出现“功能包找不到”的奇怪问题。4.4 写一个最简单的Python节点跑起来创建功能包用catkin_create_pkg语法和20.04上完全一样cd ~/catkin_ws/src catkin_create_pkg test_node roscpp rospy std_msgs然后去test_node/src目录下写一个最简单的话题发布节点。Python节点通常放在scripts目录或者直接在src下只要能通过rosrun找到就行。我习惯放在scripts目录mkdir -p ~/catkin_ws/src/test_node/scripts cd ~/catkin_ws/src/test_node/scripts touch talker.py chmod x talker.py内容很简单#!/usr/bin/env python3 import rospy from std_msgs.msg import String rospy.init_node(talker) pub rospy.Publisher(chatter, String, queue_size10) rate rospy.Rate(1) while not rospy.is_shutdown(): pub.publish(hello from ubuntu 22.04) rate.sleep()运行前确保环境已经source过了cd ~/catkin_ws catkin build source ~/catkin_ws/devel/setup.bash roscore rosrun test_node talker.py如果在Python 3.10下运行报错最常见的错误是ModuleNotFoundError: No module named rospkg。这是因为系统里可能同时存在多个python3路径rosrun调用的python3和rospkg安装的python3不是同一个。解决方式就是用apt安装rospkg让系统python3共享sudo apt install python3-rospkg python3-catkin-pkg这一个命令能解决绝大部分“模块找不到”问题。5. 常见问题与排查技巧实录5.1 常见问题速查表问题现象根本原因解决方式apt install ros-noetic-desktop-full找不到软件包软件源用了jammy而不是focal检查/etc/apt/sources.list.d/ros1.list确认是focal mainsudo rosdep init卡住或超时需要从GitHub拉取rosdistro数据网络不稳定手动curl下载20-default.list或从其他机器复制rosdep数据rosdep update反复失败rosdistro数据文件无法访问本地clone rosdistro把URL改为file:///本地路径catkin build报“No module named catkin_pkg”Python环境变量混淆安装python3-catkin-pkg后重试运行Python节点报“No module named rospkg”系统python3找不到rospkgsudo apt install python3-rospkg编译cv_bridge等视觉包时报错Python 3.8和3.10的C扩展ABI不兼容建议改用Docker容器运行视觉相关功能包启动好几个launch文件时Qt窗口崩溃22.04默认Wayland与部分Qt插件冲突设置环境变量export QT_XCB_FORCE_SOFTWARE_OPENGL1roscore正常启动但rostopic list没输出ROS_MASTER_URI配置错误或多版本环境变量冲突检查echo $ROS_MASTER_URI确认与roscore输出一致5.2 核心警告不要轻易降级系统自带动态库我在前面说了第一次安装失败是因为强行把boost降到focal版本结果系统里一堆软件全崩了。这里再强调一次ROS1 Noetic安装过程中apt会提示“需要降级libboost-thread-dev”之类的问题。除非你很清楚自己在做什么否则不要接受整个系统级降级方案。一个相对安全的折中思路是用dpkg -l | grep ros-noetic查看所有已经装的ROS包如果哪个包因为boost版本报错就只卸载那一个包而不是跟着aptitude的建议把系统库整体降级。Noetic的核心roscpp、rospy对boost版本其实很宽容真正要求的通常是某个特定小功能包放弃它比冒系统崩溃的风险划算得多。5.3 “无法定位软件包ros-noetic-*”的排查路径如果你执行sudo apt install ros-noetic-ros-base时报“E: 无法定位软件包”先不要怀疑软件源按顺序排查检查/etc/apt/sources.list.d/ros1.list内容确认最后两个词是focal main。重新执行sudo apt update看更新过程有没有报错。执行apt-cache search ros-noetic | head看本地包索引里有没有Noetic。如果包索引里确实没有Noetic说明源配置有问题或者镜像源同步不全。换回官方源重新update就行。如果包索引有Noetic但安装还是报“无法定位”那基本是依赖关系问题而不是包本身不存在这时候用aptitude。5.4 rosdep update失败的最终兜底方案rosdep update需要下载一堆yaml文件在22.04上由于数据源访问不稳定失败概率很高。我最终使用的兜底方案是这样的在一台网络正常的机器上把rosdistro仓库clone下来git clone https://github.com/ros/rosdistro.git将整个rosdistro目录拷贝到22.04机器上比如放在~/rosdistro。修改/etc/ros/rosdep/sources.list.d/20-default.list把里面的https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/...替换为file:///home/用户名/rosdistro/rosdep/...。执行rosdep update这时它会从本地文件读取数据不再依赖网络。这个方法干净利落也不会引入任何不安全的内容。整个过程不需要特殊网络工具只需要一台能正常访问GitHub的电脑比如你手上的Windows笔记本拷贝文件到Ubuntu机器即可。5.5 物理机与虚拟机的安装差异提示物理机和虚拟机装的流程完全一样但在性能表现上差异很大。虚拟机里跑roscore、rviz、gazebo三件套内存低于6G会很卡。如果你用VMware或VirtualBox建议给3D加速开启否则rviz的地图显示和gazebo的模型渲染会非常缓慢。尤其注意bionic和focal时代的老功能包在22.04上编译时如果报“undefined reference to boost::...”这类链接错误通常是因为编译器版本太新导致的老代码兼容问题。这类问题没有统一解药只能尽量升级功能包源码或者锁定使用预编译二进制版本。还有一点如果你装了NVIDIA显卡驱动不要为了ROS把驱动降级。ROS本身不依赖显卡驱动但rviz、gazebo是依赖OpenGL的驱动版本太旧反而会导致3D渲染崩溃。22.04上推荐使用显卡驱动最新稳定版配合export LIBGL_ALWAYS_SOFTWARE1这种方式做软渲染兜底也比降级驱动来得好。写在最后这套方案值得折腾吗我在实际折腾这几轮的过程中最大的感受是ROS1 Noetic在22.04上能装但“能装”和“能舒服地开发”是两码事。如果你只是跑一下课程作业、仿真一下turtlebot导航那用我上面这套流程大概率够用如果你想做深度相机、激光雷达驱动的开发建议还是老老实实回20.04或者用Docker容器隔离环境。官方不支持的组合能用多久完全取决于遇到的依赖包运气。另外再分享一个小技巧每次改完/etc/apt/sources.list.d/ros1.list或者手动安装过单独的deb包之后记得把当前的系统包状态做个快照。sudo dpkg --get-selections ~/package-selections.txt万一后面把系统搞坏了可以用这个文件恢复包列表。这个习惯在非官方组合的系统上尤其重要。最后再强调一次如果只是临时用ROS跑个演示Docker镜像五秒钟就能拉起来只有当你需要在22.04上长期开发或者必须与系统里的现有库深度绑定时才值得按我这条路走。但这套兼容经验本身对理解ROS1的依赖结构还是很有价值的。