
Ubuntu22.04安装ROS1这个话题最近被问爆了。官方支持ROS1 Noetic的Ubuntu版本是20.04但很多人手里已经是22.04的系统又不想重装还非得用ROS1跑老项目。我自己在这种环境下来回折腾过好几次踩了不少坑也总结出了一套相对靠谱的安装和避坑流程。这篇文章就把这些经验完整写出来给正在纠结“到底能不能装、怎么装、装完怎么配置”的朋友一个可以直接照做的参考。先说清楚一个核心事实在Ubuntu 22.04上ROS1 Noetic并不是“官方支持”的系统版本所以安装过程中会遇到Python版本、依赖库、图形界面工具等方面的兼容问题。但好消息是这些问题都有解决办法。本文会从前期准备、核心安装、工作空间创建、ROS1与ROS2共存、WSL2和虚拟机场景一直讲到卸载和排错全程按实操流程走所有命令都直接可用。1. 为什么大家都在问Ubuntu 22.04到底能不能装ROS11.1 ROS1 Noetic和Ubuntu版本的真实对应关系ROS1的最后一个长期支持版本是Noetic Ninjemys官方指定支持的操作系统是Ubuntu 20.04 Focal Fossa。Ubuntu 22.04是Jammy Jellyfish默认搭载Python 3.10而Noetic的二进制包大多是基于Python 3.8编译的。问题就出在这里系统Python版本和ROS依赖的Python版本不一致会导致不少包安装时提示“无法定位软件包”或者“依赖关系无法满足”。这不是ROS1本身不能运行而是包管理器在解析依赖时会因为Python版本不匹配而找不到对应的二进制版本。举个例子python3-catkin-pkg这类基础工具在Ubuntu 20.04源里能直接解析但到了22.04如果你把ROS的源加进去依然可以装只是某些衍生包会解析失败。所以先有个心理预期在22.04上装ROS1不是“官方开箱即用”而是“有条件的可用”。这个条件就是选择合适的安装方式并且愿意手动处理少数几个依赖问题。1.2 谁更适合直接在22.04上装ROS1如果你属于下面这几类人那直接在现有22.04上装ROS1问题不大只是需要跑一些纯ROS节点不依赖Gazebo老版本、RViz特殊插件等重量级图形工具。你是做算法验证、SLAM建图测试需要的是roscore、rostopic、rviz、catkin_make这类基础功能。你准备在WSL2里跑ROS1不涉及硬件设备直通只做仿真和数据处理。你已经有20.04虚拟机的经验但对性能有要求希望用一个系统同时解决日常办公和ROS开发。反过来如果你一定要用完整的ros-noetic-desktop-full并且需要Gazebo 9/11配合大量传感器仿真插件稳定运行那直接在22.04上安装会多一些坑。此时我更建议用Docker跑Noetic镜像或者老老实实装一个20.04虚拟机。1.3 先明确自己的安装路径目前主流的几种安装路径安装方式适用场景推荐指数apt直接安装ROS1 Noetic想留在22.04轻度使用ROS适中Docker容器运行Noetic不想污染主系统项目依赖复杂较高虚拟机安装Ubuntu 20.04需要完整仿真环境追求稳定较高双系统安装20.04需要真实硬件控制长期做机器人开发较高这篇文章主要以“apt直接安装”为主后面会补充Docker方案作为备选方便你根据实际情况切换。2. 安装前的准备工作软件源、Python版本和依赖检查2.1 先看系统版本和硬件架构在开始之前先确认你的系统和架构。lsb_release -a uname -m一般输出会是Ubuntu 22.04.3 LTS和x86_64。如果是ARM架构比如树莓派ROS1 Noetic的支持度会差一些建议直接用Ubuntu 20.04服务器版或者Docker镜像。确认完系统版本后先更新一遍软件源和现有软件包避免安装ROS时碰到旧包冲突。sudo apt update sudo apt upgrade -y这里有个小提醒升级前确认你没有在半途跑着重要的仿真任务升级完内核后建议重启一次。2.2 换软件源国内镜像源能省掉一半时间Ubuntu默认源在国外速度不稳定尤其是装ROS时依赖包数量大默认源很容易卡住。我习惯在安装大型开发环境前先换成国内镜像源。以中科大源为例sudo sed -i s//.*archive.ubuntu.com//mirrors.ustc.edu.cng /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.ustc.edu.cng /etc/apt/sources.list sudo apt update换成清华源也可以格式类似。核心目的是让后续apt install的速度和成功率都有保证。换源之后再顺手把基础依赖装上sudo apt install -y curl gnupg2 lsb-release build-essential2.3 添加ROS1官方软件源和密钥国内的ROS镜像源我用得比较多的是中科大和清华的ROS源。官方源是packages.ros.org但国内访问速度不稳定。下面以中科大ROS源为例sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list不过这里要注意lsb_release -sc在22.04上会输出jammy而ROS1官方源默认并没有为jammy发布Noetic二进制包所以直接添加后会发现找不到ros-noetic-desktop-full。解决办法是手动指定为focal。也就是说你的源列表文件里写的是deb http://packages.ros.org/ros/ubuntu focal main这样apt就能去查找Noetic的包。使用中科大源也是同理把packages.ros.org换成mirrors.ustc.edu.cn/ros/ubuntu但保留focal。密钥添加命令sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg然后配置源列表echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros/ubuntu focal main | sudo tee /etc/apt/sources.list.d/ros-noetic.list如果你用中科大镜像则把地址替换为echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.ustc.edu.cn/ros/ubuntu focal main | sudo tee /etc/apt/sources.list.d/ros-noetic.list做完之后再执行一次sudo apt update此时应该能看到ros-noetic相关包的信息。2.4 检查Python环境提前避开大坑22.04自带的Python版本是3.10。ROS1 Noetic本身的代码完全兼容Python3但不少ROS生态里的辅助工具链比如rosdep、catkin_tools可能依赖老版本特性。实际操作中最常遇到的问题有两个python3-rosdep安装后执行rosdep init报错提示找不到模块rosdep2。使用catkin_make时cmake找不到Python解释器版本。我的建议是先把python3-pip和python3-venv装上sudo apt install -y python3-pip python3-venv然后单独安装rosdep工具链sudo pip3 install -U rosdeprosdep后续在编译工作空间时会用到提前用pip安装比用apt安装更不容易受系统Python版本影响。3. 核心安装从ros-noetic-desktop-full到基本组件的取舍3.1 推荐的安装方式先装ros-noetic-ros-base这里直接给结论在Ubuntu 22.04上不要一上来就安装ros-noetic-desktop-full否则大概率会碰到依赖冲突最后被迫手动装一堆老库。我推荐的顺序是先安装ros-noetic-ros-base验证ROS核心能正常运行再按需补装可视化工具和仿真工具。sudo apt install -y ros-noetic-ros-base这个包只包含ROS核心、通信库、常用命令行工具体积小依赖问题少。装完之后roscore就能正常启动。然后需要补装常用工具sudo apt install -y ros-noetic-rviz ros-noetic-rqt ros-noetic-rqt-common-plugins如果实际项目需要Gazebo仿真我建议不要直接装ros-noetic-gazebo-ros-pkgs而是单独装自己需要的功能包。直接装全套很容易把系统里的图形库拖乱。3.2 哪些包在22.04上容易出问题我实际测试下来下面这些包在22.04上最容易报错ros-noetic-desktop-full包含大量GUI工具依赖OpenGL老版本库安装时易冲突。ros-noetic-gazebo-ros-pkgs和Ubuntu 22.04自带的Gazebo 11可能有版本冲突。ros-noetic-laser-scan-matcher等依赖老版PCL的包编译时容易找不到库。应对策略就一句话用哪个装哪个装之前先apt-cache policy看一眼依赖能不能解析别一口气装全套。3.3 手动处理依赖冲突的三板斧如果在安装时遇到Unable to locate package或unmet dependencies按下面的顺序处理。第一确认源列表里使用的是focal而不是jammy。cat /etc/apt/sources.list.d/ros-noetic.list第二尝试安装时临时忽略推荐包sudo apt install -y --no-install-recommends ros-noetic-ros-base第三如果某个库缺少二进制包可以通过源码编译安装。我这里举个常见例子python3-catkin-pkg-modules在22.04上可能装不上那就用pip装sudo pip3 install catkin_pkg然后在catkin_make前通过环境变量告诉CMake使用系统Pythonexport PYTHON/usr/bin/python3这些操作并不复杂但能绕过很多二进制包解析失败的问题。3.4 验证ROS1是否安装成功安装完核心包后先把环境变量加载进去source /opt/ros/noetic/setup.bash然后启动ROS核心roscore如果能看到类似started core service [/rosout]的输出说明ROS1核心已经能跑了。再开一个新终端验证话题通信source /opt/ros/noetic/setup.bash rostopic list看到/rosout和/rosout_agg就表示通信正常。到这里ROS1在22.04上的核心安装就算完成了。4. 环境配置与catkin工作空间创建4.1 设置环境变量从临时source到永久配置每次打开终端都要手动source /opt/ros/noetic/setup.bash太麻烦。我习惯直接写进~/.bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc但如果你同时装了ROS2不建议直接把这行写死在bashrc里后面会详细说明共存时的配置方式。设置完环境变量后可以检查一下echo $ROS_DISTRO如果输出noetic说明环境已经生效。4.2 创建一个标准catkin工作空间ROS1的代码组织方式通常是一个catkin工作空间。创建步骤非常固定直接照敲就行mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace如果提示找不到catkin_init_workspace说明catkin工具没有装全先执行sudo apt install -y ros-noetic-catkin然后回到工作空间根目录编译cd ~/catkin_ws catkin_make第一次编译会产生devel和build目录。整个过程如果没报错说明ROS的基础工具链没有问题。很多第一次接触ROS的朋友会在这一步卡住看到一堆红色警告就很慌。其实大多数情况是因为缺少系统依赖导致的。这时用rosdep来补齐sudo rosdep init rosdep update cd ~/catkin_ws rosdep install --from-paths src --ignore-src -r -y需要注意rosdep init如果之前没跑过会往/etc/ros/rosdep/sources.list.d/写入源文件22.04下偶尔会因为网络问题失败。可以把源地址切换为国内镜像参考ROS Wiki上的镜像配置。4.3 把工作空间的环境变量加进bashrc编译成功后需要把devel/setup.bash加到环境变量里echo source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc这里有个细节如果~/.bashrc里之前已经source /opt/ros/noetic/setup.bash了再把工作空间的setup追加在后面是没问题的因为后source的文件会覆盖前一个文件里定义的同名环境变量最终ROS_PACKAGE_PATH会指向你的工作空间。验证方式echo $ROS_PACKAGE_PATH正常情况下输出里应该同时包含/opt/ros/noetic/share和~/catkin_ws/src。4.4 创建一个最简单的ROS功能包跑通全流程为了验证整个工作空间能正常运行我建议创建一个测试功能包cd ~/catkin_ws/src catkin_create_pkg test_pkg roscpp rospy std_msgs cd ~/catkin_ws catkin_make然后把devel/setup.bash再source一次source devel/setup.bash rospack find test_pkg如果能看到功能包路径说明工作空间、编译、环境配置全部OK。5. 和ROS2共存、WSL2、虚拟机和卸载这些绕不开的问题5.1 ROS1和ROS2可以共存吗这个问题几乎每次讨论ROS安装都会有人问。答案是可以但需要一点配置技巧。原因是ROS1和ROS2使用不同的环境变量体系。ROS1用的是/opt/ros/noetic/setup.bashROS2用的是/opt/ros/humble/setup.bash。如果同时把两套环境变量写进~/.bashrc后加载的会覆盖先加载的最终导致命令行工具指向错误版本。我推荐的方案是不要在bashrc里同时永久加载两套环境而是写两个shell函数按需切换。在~/.bashrc里加这段source /opt/ros/noetic/setup.bash use_ros2() { source /opt/ros/humble/setup.bash echo ROS2 Humble environment loaded } use_ros1() { source /opt/ros/noetic/setup.bash echo ROS1 Noetic environment loaded }这样默认终端进ROS1需要ROS2时手动执行use_ros2切换。注意切换后命令行工具会变成ROS2的但已经启动的roscore节点不会受到切换影响。如果你想在一个项目里同时跑ROS1和ROS2节点那就必须用到ros1_bridge功能包。这个包的原理是在两台“ROS网络”之间做消息桥接将ROS1话题转发到ROS2反之亦然。编译ros1_bridge需要同时加载ROS1和ROS2环境并且在同一工作空间里编译过程相对复杂后面可以单独写一篇这里先不做展开。5.2 WSL2安装Ubuntu 22.04并配置ROS1在Windows下使用WSL2装Ubuntu 22.04再跑ROS1是很多开发者的轻量选择。WSL2的安装流程我这里简单带过在Windows PowerShell中执行wsl --install -d Ubuntu-22.04装完进入Ubuntu子系统之后按本文前面的步骤换源、添加ROS源、安装ros-noetic-ros-base。WSL2的特殊之处在于它没有完整的systemd而ROS本身不依赖systemd所以roscore可以正常运行。但如果你需要用到systemctl管理服务那要额外配置WSL2支持systemd在/etc/wsl.conf里加[boot] systemdtrue另外WSL2下的GUI支持需要安装Windows侧的WSLg。Ubuntu 22.04默认的WSL版本已经支持GUI所以rviz可以直接弹窗显示不需要额外配置X Server。这一点比旧版WSL强了很多。如果你要用USB摄像头、雷达等硬件设备WSL2对USB设备的直通支持很弱这种情况还是建议使用原生Ubuntu或者虚拟机。5.3 虚拟机Ubuntu 22.04安装ROS1的补充说明虚拟机场景下最需要注意的是VMware Tools或VirtualBox增强功能的安装。因为ROS1的RViz、Gazebo都需要OpenGL硬件加速如果虚拟机没有安装增强工具图形界面会非常卡顿。VMware Workstation装Ubuntu 22.04时推荐虚拟显卡选择“加速3D图形”。装完系统后用sudo apt install -y open-vm-tools-desktopUbuntu 22.04对VMware的支持还算不错安装了增强工具后RViz和Gazebo都能勉强跑起来但别指望流畅度能跟实体机一样。VirtualBox用户则要安装sudo apt install -y virtualbox-guest-utils virtualbox-guest-dkms另外虚拟机里用ROS做SLAM实测CPU性能损耗比较大。如果只是学语法、跑小规模仿真问题不大真要做点重负载的事情还是建议双系统或独立机器。5.4 卸载ROS1的正确姿势很多人安装失败后想卸载直接sudo apt remove ros-*这样操作是可以的但会残留一些配置文件。我建议按顺序执行sudo apt remove ros-noetic-* sudo apt autoremove -y sudo rm -rf /etc/ros/rosdep sudo rm -f /etc/apt/sources.list.d/ros-noetic.list sudo rm -f /usr/share/keyrings/ros-archive-keyring.gpg然后检查~/.bashrc把里面source ROS相关环境的行注释掉。最后source ~/.bashrc环境就干净了。如果之后要装ROS2建议先执行上面的清理避免ROS1和ROS2的apt包管理记录产生冲突。6. 我实际踩过的坑和给你的避坑建议6.1 最容易被忽略的Python路径问题我最初在22.04上安装ROS1roscore没问题但catkin_make编译自己的功能包时频繁报错提示找不到PythonInterp。原因是CMake默认找到的Python版本是3.10而ROS Noetic的很多CMake模块是按3.8编译的二进制路径写入的。解决办法是在编译前显式指定Pythoncd ~/catkin_ws rm -rf build devel catkin_make -DPYTHON_EXECUTABLE/usr/bin/python3这个方法实测有效能解决大多数编译报错。如果你用的是catkin_tools对应命令是catkin config -DPYTHON_EXECUTABLE/usr/bin/python3 catkin build6.2 别让输入法和显卡驱动影响ROS环境热词里有很多关于Ubuntu 22.04五笔输入法、英伟达显卡驱动的搜索这些看起来跟ROS无关但实际会影响开发体验。例如Ubuntu 22.04默认的GNOME桌面和NVIDIA驱动如果没配对好打开RViz会直接窗口崩溃。我的建议是如果你的笔记本是NVIDIA显卡在安装ROS前先装好驱动并且确认nvidia-smi能正常输出。ubuntu-drivers devices sudo ubuntu-drivers autoinstall sudo reboot装完驱动后再安装ROS。顺序不要反了否则RViz首次启动时可能因为OpenGL上下文问题直接闪退。输入法这块ibus在22.04上对中文输入支持还算稳定但部分ROS工具比如rqt在输入中文时会有焦点丢失的问题。这个属于ROS工具链本身的问题暂时没有完美解决方案我一般会选择在代码文件和注释里使用英文避免不必要的麻烦。6.3 一个更稳的替代思路用Docker跑Noetic如果说上面所有步骤都让你觉得太折腾那就用Docker吧。在22.04上装好Docker后直接拉取ROS Noetic镜像docker pull ros:noetic-ros-base-focal运行容器docker run -it --name ros1_noetic ros:noetic-ros-base-focal bash进入容器后就是纯净的Ubuntu 20.04 ROS1 Noetic环境。你可以把宿主机的代码目录挂载进去docker run -it --rm -v ~/catkin_ws:/catkin_ws ros:noetic-ros-base-focal bash这样既不影响宿主机的22.04环境又能获得完整兼容的ROS1环境。如果要用RViz需要配置容器的图形转发稍微复杂一些但算法验证和命令行工具完全没问题。Docker方案对于“只需要跑通ROS1程序、不折腾GUI”的场景来说比在22.04上强行安装要省心得多。6.4 最后分享一个我自己的使用习惯现在我自己新电脑上已经不会把ROS1直接装进22.04主系统里折腾了。我的做法是主系统负责日常办公和ROS2开发需要用ROS1时直接在Docker里起一个Noetic容器或者用虚拟机里的20.04跑完整仿真。但如果你就是想在一个系统里解决问题那么这篇文章从第2节到第4节的步骤已经能帮你把ROS1 Noetic跑起来。后面遇到具体问题比如某个功能包装不上、某个依赖库冲突按“用哪个装哪个、报错先看依赖、Python版本要盯紧”这三条原则去排查基本能解决90%的坑。记住ROS1在22.04上不是官方支持的组合所以别指望所有包都能顺滑安装。最稳妥的方式还是给ROS1准备一个20.04的环境不管是Docker还是虚拟机都比在22.04上硬碰硬省时间。这几年我见过太多朋友在“是否要在22.04上装ROS1”这个问题上反复纠结最后花了一整天处理依赖冲突。所以我的建议是先想清楚你的最终需求是什么再决定安装路径。如果只是跑算法、验证代码Docker是性价比最高的选择如果实在需要完整图形界面和硬件控制那就安静地装个20.04虚拟机或双系统。无论如何希望这篇文章能帮你少走点弯路。