Ubuntu20.04安装ROS Melodic:Docker容器方案与依赖避坑指南

发布时间:2026/10/15 21:43:40
Ubuntu20.04安装ROS Melodic:Docker容器方案与依赖避坑指南 最近后台一直有人问我能不能在Ubuntu20.04上装ros-Melodic怎么我照着网上的教程搞了一晚上最后还是包找不到我把话放前面ROS Melodic官方对应的系统是Ubuntu18.04Bionic不是20.04。你在一台20.04的机器上硬装等待你的大概率是一堆依赖地狱。这篇文章记录的是我个人的完整安装过程——注意不是“20.04直接apt装”那种骗自己操作而是怎么在20.04上合法、稳定、可复现地把Melodic跑起来。如果你现在正卡在“安装ros-melodic-desktop-full失败”这一步或者还在纠结“为什么加了ROS源还是找不到包”那这篇文章就是给你写的。我会把版本对应关系、失败根因、Docker曲线救国方案、源码硬核方案、后续环境配置踩坑一次讲透全程是真实操作记录不是复制官方文档。1. ROS版本与Ubuntu版本强绑定为什么20.04上直接装Melodic必炸1.1 一张表看清ROS发行版和Ubuntu的对应关系先看这张表这是ROS入门第一课也是大部分人装失败的第一原因ROS发行版对应Ubuntu版本官方支持状态ROS Melodic MoreniaUbuntu 18.04Bionic已停止维护ROS Noetic NinjemysUbuntu 20.04Focal已停止维护ROS Humble HawksbillUbuntu 22.04Jammy维护中ROS Iron IrwiniUbuntu 22.04维护中Melodic发布那一年官方直接声明“Targeted at Ubuntu 18.04”。这不是随口说说ROS的二进制包在构建时就是链接了Ubuntu18.04的Python版本、Boost库、OpenCV版本和一堆系统C库。你把18.04的包扔进20.04系统会告诉你The following packages have unmet dependencies: ros-melodic-desktop-full : Depends: libpython3.6 but it is not installable20.04默认自带的是Python3.8。libpython3.6在标准源里根本没有除非你手动添加旧的源但那样又会把系统的Python依赖搞得乱七八糟。1.2 我亲自踩过的“直接安装”失败现场我最早也头铁想着“都是Ubuntu版本差一点点装个低版本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在20.04上返回的是focalROS官方软件源里根本没有focal对应的Melodic仓库所以apt update之后就出现了经典的E: Unable to locate package ros-melodic-desktop-full我又自作聪明把源列表里的focal改成bionic强行去拉18.04的包。这次包是找到了结果一眼望不到头的依赖冲突python3.6缺失、libboost1.65没有、libyaml-cpp0.6版本不符甚至还有libopencv3.2这种根本不可能装上的东西。折腾到凌晨两点最后把系统搞坏了只能重装。所以结论很简单官方二进制源这条路在Ubuntu20.04上走不通。想要用上Melodic要么把系统降级成18.04要么用容器虚拟出18.04环境要么从源码搞一套Melodic自己编译。降系统不现实源码编译坑又多个人最推荐容器方案。2. 最终落地Docker容器内跑Ubuntu18.04 ROS Melodic2.1 为什么我最终选择Docker而不是虚拟机有一说一虚拟机也能装Melodic但启动慢、占用大、跟宿主机共享摄像头/串口还要配一堆USB透传参数。Docker的优势在于它本质上不是一个完整系统只是一个隔离的Linux环境启动只要几秒占用磁盘几百MB关键是可以直接挂载宿主机的设备、网络、图形界面。我用的是nvidia-docker的替代思路不需要GPU的话普通Docker就够了。如果你只是做ROS学习、跑算法验证、调试节点通信Docker完全够用。而且它不会把你20.04的系统弄脏删掉容器一条命令就干净了。唯一要提前说的是Docker容器里跑图形界面比如rqt、rviz需要配置X11转发后面我会详细写。2.2 宿主机安装Docker的完整流程这里分成两步先装Docker引擎再配用户权限。sudo apt update sudo apt install docker.io安装完验证docker --version然后把自己加入docker用户组这样不用每次sudosudo usermod -aG docker $USER newgrp docker注意执行完usermod之后最好注销重新登录一次否则newgrp只在当前终端生效新开终端还是会提示权限不足。2.3 创建Ubuntu18.04容器并安装ROS Melodic拉取镜像docker pull ubuntu:18.04启动并进入容器docker run -it --name ros_melodic \ --networkhost \ -e DISPLAY$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ ubuntu:18.04 \ /bin/bash参数解释--name ros_melodic给容器起名后续好管理。--networkhost直接用宿主机网络ROS的master节点通信就不用额外做端口映射了。-e DISPLAY$DISPLAY把宿主机的显示环境变量传进去。-v /tmp/.X11-unix:/tmp/.X11-unix挂载X11的socket这是GUI界面能弹出的关键。进入容器之后第一件事换源。18.04自带的archive.ubuntu.com在国内经常龟速我用的是清华源sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list apt update然后安装基础的依赖和工具apt install -y lsb-release gnupg curl注意18.04的源现在还有但已是EOL状态部分包可能迁移到old-releases。如果后面遇到404 Not Found把sources.list里archive.ubuntu.com替换成old-releases.ubuntu.com再把security.ubuntu.com也换掉。接着添加ROS官方源并安装Melodicsh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | apt-key add - apt update如果apt-key add提示key过期用新版方式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 bionic main | tee /etc/apt/sources.list.d/ros-latest.list这里字源地址直接写bionic比$(lsb_release -sc)保险因为容器里的lsb_release -sc会返回bionic其实一样。然后正式安装apt update apt install -y ros-melodic-desktop-fulldesktop-full包含ROS、rqt、rviz、gazebo这些常用工具大约要下2GB左右耐心等就行。装完初始化rosdepapt install -y python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential rosdep init rosdep update这里有个坑18.04默认的Python还是2.7rosdep对应的是python-rosdep这个包。如果你在容器里先装了什么奇怪的东西把Python改到3了后面会各种报错。保持容器干净最好。2.4 在容器里初始化工作空间并验证安装装完环境建一个catkin工作空间测试mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make然后source环境变量echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc验证ROS能否正常启动roscore看到started core service [/rosout]基本就成功了。再新开一个终端进同一个容器跑小乌龟测试rosrun turtlesim turtlesim_node如果窗口能弹出说明GUI环境配置成功。2.5 容器日常操作与宿主机交互容器退出后再进去的命令docker start ros_melodic docker exec -it ros_melodic /bin/bash想把宿主机的摄像头或串口映射进容器在docker run时加--device/dev/video0 \ --device/dev/ttyUSB0最好在run的时候就规划好后面docker exec没法动态加设备除非用docker commit重新生成镜像。这部分我后面还会细说。3. 不装Docker的硬核路线在Ubuntu20.04上源码编译安装Melodic3.1 源码编译到底比二进制安装难在哪如果因为公司要求、离线环境或其他原因必须直接在宿主机20.04上“原生”跑Melodic也不是完全没戏但你要做好打持久战的准备。Melodic的源码可以在GitHub上找到核心问题在于它当年是按Ubuntu18.04的依赖版本写的你现在用20.04的工具链编译会出现大量的API或ABI不兼容。最典型的有这么几个OpenCV20.04默认OpenCV 4.2Melodic源码很多模块依赖OpenCV 3.x的接口。Boost20.04是1.71Melodic有些包在1.65上测过新版也能过但个别旧接口被移除了。Python20.04默认Python3.8Melodic的rospy等模块对Python3.6有隐式依赖。log4cxx这个在20.04上经常编译失败因为新版gcc对旧代码的检查更严。所以源码编译不是一个“照着catkin_make”就能跑通的流程更像是在做移植。3.2 源码安装的整体流程与关键步骤我可以说一下大致的流程但请不要指望像Docker那样一条命令走下去。不同版本、不同时间点拉到的代码可能都不一样遇到具体错误还得现场修。第一步安装基础系统依赖sudo apt update sudo apt install -y python3-rosdep python3-rosinstall-generator python3-wstool build-essential cmake python3-catkin-pkg-modules python3-vcstool第二步拉取Melodic的元包源码。用vcstool按rosdistro里的配置拉全量代码mkdir ~/ros_melodic_src cd ~/ros_melodic_src vcs import src ~/melodic.rosinstall这个melodic.rosinstall文件需要先从rosdistro仓库获取。拉完之后src下面可能是几十个核心包不是全部全部几千个包没必要编译你只需要ros_comm、roscpp、rospy、std_msgs这些核心。第三步设置ROS_DISTROmelodic运行rosdep安装依赖export ROS_DISTROmelodic rosdep install --from-paths src --ignore-src -r -yrosdep会去读取每个包的package.xml给出当前系统下缺失的依赖。这一步通常能装掉80%的系统包剩下的就是编译坑。第四步编译核心包。建议只编ros_comm这一组先不要碰desktop-fullcatkin config --install catkin build我第一次编译挂在roscpp上报错是一堆log4cxx头文件找不到。后来手动装了liblog4cxx-dev又出现fmt版本冲突。最后是把系统自带fmt降到5.x才继续走。第五步编译过程中可能还需要手动打补丁。比如python3.8兼容性Melodic的rospy源码里有几处用了imp模块而Python3.8移除了imp需要改成importlib。这种patch通常要自己去ROS社区翻issue。我只能说如果排错经验不够这条路很容易走了一半就放弃。3.3 为什么我最终没有在宿主机上原生编译Melodic写这段不是劝你放弃源码编译而是给你算一笔时间账。我自己在20.04上编译Melodic核心包不算拉代码和装依赖光编译roscpp、rospy、rosconsole这几个基础包就花了大概5个小时。期间改了4个文件的源码手动降级了fmt库最后虽然跑起来了但一跑rosrun turtlesim turtlesim_node链接的是系统OpenCV 4.2和Melodic里某个旧库冲突直接段错误退出。后来我把容器方案跑通前后也就20分钟。你说哪个划算如果你不是做ROS源码级二次开发只是正常写节点、跑仿真、做算法验证Docker容器比源码编译香太多了。如果未来有硬性需求必须在宿主机上原生跑Melodic那建议直接重装成18.04系统也别编译了省心。4. 安装完成后必踩的坑环境变量、GUI显示、设备映射与通信配置4.1 环境变量source顺序的坑很多人装完ROS一打开新终端就提示command not found: rosrun原因就是.bashrc里的source没有生效。在Docker容器里如果用的是docker run直接执行/bin/bash那~/.bashrc默认不会自动加载因为是非交互式shell。我习惯在docker run时直接加-it并且进入后手动source或者干脆在容器里执行echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc如果用了zsh记得把~/.bashrc改成~/.zshrc。另外注意如果之前装过Anacondaconda的环境变量可能会把Python路径指向conda的base环境导致rospy依赖的Python库版本错乱。这个特别隐蔽症状是roscore能起但一import rospy就报一堆缺模块。解决办法是在source ROS之前先conda deactivate或者修改PATH顺序。4.2 GUI程序显示不出来的排查链路容器里跑rosrun rviz rviz窗口弹不出来的情况非常常见。我遇到过一次排查完发现是DISPLAY变量没传进去。在宿主机上先确认echo $DISPLAY正常输出是:0或:1。然后进容器里echo $DISPLAY如果为空说明docker run时-e DISPLAY$DISPLAY没生效。还有刚才挂载/tmp/.X11-unix也要检查ls -la /tmp/.X11-unix/宿主机上这个目录下应该有个X0文件容器里也要能看到同样的文件。如果用的是xhost授权需要先在宿主机执行xhost local:这样容器内的X11客户端才能连上宿主机的X server。跑GUI前先看一下xeyes这类简单程序能不能显示能显示就说明X转发OK再跑rviz就顺理成章了。4.3 宿主机设备映射摄像头、串口、激光雷达做机器人开发容器里跑ROS node上个摄像头和雷达基本是刚需。这里有一个容易忽略的点docker run时就要把设备映射进去因为docker exec不能动态添加设备。摄像头docker run -it --name ros_melodic \ --networkhost \ -e DISPLAY$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --device/dev/video0:/dev/video0 \ ubuntu:18.04 \ /bin/bash串口设备比如USB转串口、下位机--device/dev/ttyUSB0:/dev/ttyUSB0有时候设备名不固定插拔后从video0变成video1建议在宿主机里用udev规则固定设备符号链接。比如新建/etc/udev/rules.d/99-usb-cam.rules内容是按厂商ID和产品ID映射到/dev/my_camera。这样容器里映射--device/dev/my_camera就稳了。设备权限也是个坑即使映射进去容器里如果对/dev/ttyUSB0没有权限还是打不开。在容器里执行sudo chmod 666 /dev/ttyUSB0或者给dialout用户组加权限。4.4 ROS Master和节点通信的hostname问题容器用了--networkhostROS节点通信一般没问题。但如果你为了让容器和宿主机同时跑不同ROS版本比如宿主机Noetic容器Melodic这时候ROS_MASTER_URI要指向同一个master。简单做法全部在容器里跑。但如果要跨容器和宿主机通信必须保证ROS_MASTER_URI两边一致比如都指向http://localhost:11311。ROS_HOSTNAME和ROS_IP设置正确千万别留空或设置成容器的内部IP。不然会出现[ERROR] [wall time]: ROS_HOSTNAME is not set! ROS_IP is not set!其实很多“节点找不到master”的报错不是ROS没装好是网络变量没配对。我个人建议不是特别需要就别跨容器通信直接在容器里把master和所有节点都跑起来干净利落。5. 个人体会与后续扩展这套流程真正用顺之后对我来说收益最大的是“环境隔离”这件事。以前要跑一个旧项目往往是装一堆旧库、改一堆系统配置把新项目也带崩了。现在我把Melodic关在容器里宿主机的20.04该干嘛干嘛Noetic也可以同时装着两个版本互不干扰。偶尔需要给某个传感器写驱动容器里直接apt install测试不行就删容器重建完全不敢动宿主机一针一线。最后分享一个小技巧容器里的环境配置好之后不要在docker run进去手动装一堆东西而是把刚才所有的步骤写成一个Dockerfile比如在Dockerfile里先拉ubuntu:18.04然后一键执行换源、装ROS、初始化rosdep。这样以后换电脑、换服务器只要build一次镜像5分钟就复现一套一模一样的Melodic环境。我就因为这个习惯帮一个同事省下了大半天时间。如果你现在还纠结“Ubuntu20.04能不能装ros-melodic”我的答案可以总结成三句话二进制直接装不行源码编译能装但性价比太低Docker容器是目前最稳定、最可控、最适合个人开发者的方案。按本文的方法走下来你手上会有一套可以随时删除重建的Melodic环境还能保留一个干净的20.04桌面系统。祝你好运有问题评论区聊。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询