☰
VMware虚拟机安装Ubuntu 20.04与ROS2 Foxy完整指南
2026/10/20 14:46:00 网站建设 项目流程

做导航、做底盘、做感知的同学,第一步几乎都逃不过同一件事:在一台Windows主力机上,给Ubuntu留出一块能折腾的地盘。装了双系统怕弄坏引导,买新机器性价比又太低,所以虚拟机几乎成了默认选项。这篇就是把我自己从零搭到可用的完整过程整理出来:VMware里装Ubuntu 20.04,再装上跟这个系统版本严格匹配的ROS2发行版。

目标读者是两类人:一是刚接触机器人开发、想先跑通仿真环境看看ROS到底长什么样的新手;二是已经装了系统但运行时缺库、环境变量乱、节点起不来的半路入门者。我会把每一步的配置参数、关键命令、为什么这么选都讲清楚,也尽量把我在虚拟机里踩过的坑都翻出来说一遍。

1. 搭建前先想清楚:虚拟化选型与版本搭配逻辑

1.1 为什么用虚拟机而不是双系统或容器

很多人的第一反应是:搞开发不是应该用Linux物理机吗?虚拟机跑ROS会不会卡?这个问题我当初也纠结过。实际用下来,如果你的开发重点在于ROS2的核心机制、节点通信、仿真调试,而不是实时性要求极高的底层驱动控制,虚拟机完全够用,而且收益非常明显。

双系统的痛点在于切换成本:想查个资料、回个微信、对比一下Windows下的文档,都要重启。虚拟机则可以在同一屏幕上同时开着Windows和Linux,代码在Linux里跑,浏览器和截图工具在Windows里用,这对学习阶段极其友好。另外虚拟机随时可以拍快照,改坏了系统、装挂了驱动,一个是回滚的事,这在双系统里想都不敢想。

至于容器方案,Docker里确实能跑ROS2,但容器天生不适合做GUI显示和串口透传这一套,对新手尤其不友好。Ubuntu装在虚拟机里,你可以直接看到完整的桌面环境,gedit、终端、Gazebo、rviz这些工具都用得顺手,学习曲线平缓很多。结论很直接:学习和小型项目阶段,VMware + Ubuntu是性价比最高的起点。

1.2 Ubuntu 20.04与ROS2版本的匹配关系

ROS2的每个发行版都对应一个特定的Ubuntu版本,这是最容易栽跟头的地方。很多人随手装了22.04或者18.04,然后发现ROS2官方源里根本没有对应版本,或者装上去一堆依赖报错,就是这个原因。

我这次用的组合是Ubuntu 20.04 LTS(Focal Fossa)配ROS2 Foxy Fitzroy。这个搭配是官方明确支持的标准组合之一。注意几个细节:

  • Ubuntu 20.04对应ROS2 Foxy,这个版本虽然已经过了官方维护周期,但国内大量教学资料、开源项目都是在这套组合上跑的,踩坑经验最多,最容易搜到解决方案。
  • Ubuntu 22.04对应的是ROS2 Humble,如果你想用更新版本的ROS2,那系统也得跟着换。
  • Ubuntu 18.04对应的ROS2版本(如Crystal、Dashing)已经非常老,不建议新项目再用。

一句话总结:先定Ubuntu版本,再定ROS2版本,顺序不能反。

1.3 镜像下载与校验

Ubuntu 20.04的镜像建议直接到官方镜像站下载,记得选64位桌面版,文件名类似 ubuntu-20.04.x-desktop-amd64.iso。这里有两个坑要提前提醒:

第一,不要下载最小安装版或Server版。ROS2调试需要图形界面和自带工具集,Desktop版能省掉大量手工安装GUI组件的步骤。

第二,下载完顺手校验一下SHA256校验和。镜像文件不小,传输过程中损坏的概率不是零,如果安装到一半报错,浪费的时间远比校验一次多得多。Windows下用 PowerShell 执行 Get-FileHash 命令就能算出来,跟镜像站点提供的哈希值对比一下即可。

VMware版本方面,我用的是VMware Workstation Pro 16和17都试过,都可以正常使用。版本选择上没有特殊讲究,只要是新一点的版本,都能良好支持Ubuntu 20.04的3D加速和USB透传。

2. VMware虚拟机参数配置要点

2.1 虚拟机创建流程与硬件参数

创建虚拟机的过程比较直观,但参数分配上值得认真说几句。我建议不要让VMware用默认配置,很多默认值偏保守,会导致Ubuntu用起来很卡。

我常用的创建路径是:文件 -> 新建虚拟机 -> 自定义(高级),自定义模式能让你在向导里直接看到所有参数,省得创建后再改。

关键参数建议如下:

配置项建议值说明
固件类型BIOSUEFI也可以,但BIOS兼容性更省心
CPU数量至少2核,建议4核编译ROS2功能包时多核优势非常明显
内存至少4GB,建议8GB2GB跑桌面环境都勉强,别试
硬盘至少50GB,建议100GB按照"单个文件"方式存储性能更好
网络NAT详见2.2节说明
显示器加速3D图形勾上否则Ubuntu桌面动画会非常卡

内存这一项我特别想多说两句。如果你的宿主机内存只有8GB,虚拟机分4GB已经是上限了,别贪多,否则Windows先扛不住。如果宿主机有16GB以上,给虚拟机8GB会让Gazebo和rviz同时运行从容很多。

2.2 网络模式选择:NAT还是桥接

VMware的网络模式有桥接、NAT、仅主机三种,日常开发用NAT就够了。

NAT模式的特点是虚拟机通过宿主机共享网络访问外网,对外表现为一个内网地址。优点是稳定、不需要跟物理网络绑定,宿舍、公司、家里网段随便换都不影响。ROS2的单机通信(talker、listener、turtlesim)完全在虚拟机的回环接口上跑,NAT毫无压力。

桥接模式则让虚拟机直接出现在物理局域网中,有自己的独立IP。当你要做多机器人通信、需要局域网内其他设备直接访问虚拟机时才有必要切到桥接。我遇到过一种坑:公司网络开启了设备隔离,桥接模式下虚拟机ping不通任何设备,反而NAT一切正常。所以初学阶段建议直接用NAT,少给自己找事。

2.3 VMware Tools与系统初始化

很多人装完Ubuntu就直接开干,结果发现窗口分辨率只有800x600,剪贴板不能互通,文件夹拖不进去,这才想起来缺了虚拟化增强工具。

VMware 16以上版本已经不需要单独装VMware Tools了,它对应的是open-vm-tools,Ubuntu源里自带,安装方式为:

sudo apt update && sudo apt install open-vm-tools open-vm-tools-desktop

注意装完要重启虚拟机,3D加速和自适应分辨率才会生效。我之前见过有人仍然去VMware菜单里插虚拟机光盘装老版Tools,其实没有必要,还容易跟系统自带的open-vm-tools冲突。

顺带提一句共享文件夹的事。如果你喜欢在Windows里编辑代码、在Linux里编译运行,可以给虚拟机添加共享文件夹,路径在虚拟机设置里的"选项 -> 共享文件夹"中配置。挂载点通常在 /mnt/hgfs 下,如果共享后没出现目录,手动执行一次 mount -t vmhgfs .host:/ /mnt/hgfs 大概率能解决。

3. Ubuntu 20.04系统安装与初始化配置

3.1 安装流程与分区策略

把Ubuntu ISO挂载到虚拟光驱后开机,就会进入安装引导。安装过程没什么难度,但有两个地方别选错:一是在安装类型界面选"清除整个磁盘并安装Ubuntu",这个选项只是清理虚拟硬盘,对宿主机没有任何影响,可以放心选;二是网络下载更新那个选项,首次安装建议跳过,先把系统装好再更新,速度更快也更稳。

分区策略这一块,虚拟机场景下我建议直接用默认的"安装Ubuntu"自动分区,不用手动分。原因很简单:虚拟机磁盘是在一个文件里,手动分swap、根分区、home分区对后续性能提升没有本质帮助,反而给自己增加复杂度。如果是物理机我可能建议分开挂载,虚拟机里真没必要。

设置用户名和密码时注意一点:用户名尽量用全小写的简单名字,比如dev、ros、ubuntu这样。ROS2的很多环境变量和路径会跟用户名挂钩,名字太花哨或者带大写,后面配置起来容易莫名其妙出问题。

3.2 系统更新与基础环境

系统装好后,第一件事就是更新软件源索引和升级已有包:

sudo apt update sudo apt upgrade -y

升级包数量可能比较大,耗时取决于网络情况。这里有个经验:升级过程中如果卡在某一步很久,别强行中断,多等几分钟,终端里没有任何输出并不代表卡死。

基础工具链建议一起装上。我的做法是一步到位安装常用开发组件:

sudo apt install -y build-essential cmake git vim net-tools curl wget pkg-config gnupg lsb-release

其中 build-essential 和 cmake 在之后编译ROS2功能包时是必需品,git是拉代码用的,curtextpressing. 这些包尽量一次装全,避免之后编译时缺一个装一个的循环。

3.3 语言环境与APT软件源

ROS2官方文档在安装前有一个前置条件:系统locale必须支持UTF-8。默认的英文环境一般没问题,但如果你的系统语言是中文或者其他语言,要先确认一下:

locale

我的建议是直接设置为C.UTF-8,这是ROS2官方推荐的值,可以避免很多中文环境下节点日志乱码、音频转码的诡异问题:

sudo apt install -y locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8

在执行完locale设置后,务必重新打开终端或者注销重新登录,否则环境变量不生效。

APT软件源方面,如果你是国内网络,官方源的速度可能感人。常见的做法是替换为国内高校或云厂商的镜像源,路径是 /etc/apt/sources.list。替换前先备份,然后用sed批量替换或者干脆手动把源地址换掉。这一步纯属网络加速措施,不影响系统本身。替换后务必要执行 sudo apt update 让索引生效。

4. ROS2环境准备与安装

4.1 ROS2版本选择:为什么是Foxy

前面提到过Ubuntu 20.04对应ROS2 Foxy,这里再补充一下版本选择逻辑,因为网上确实有人用Ubuntu 20.04硬装ROS2 Galactic甚至Humble,结果依赖冲突一堆。

ROS2发行版的生命周期大概是一年一个版本,LTS版会维持更久。Foxy是ROS2的第二个LTS版本,虽然是2020年发布、2023年停止维护,但它对Ubuntu 20.04的适配最完善。绝大部分教程、教材、开源仓库都基于这套组合,遇到问题一搜就有答案。对于学习和复现算法,稳定性比版本新旧重要得多。

如果硬要追新版本,正确姿势是把系统换成Ubuntu 22.04再装Humble,而不是在20.04上强装。这就是我在1.2节强调的"先定系统版本,再选ROS2版本"的含义。

4.2 添加软件源与密钥

ROS2官方通过apt源分发,首先要添加它的软件源和密钥。完整步骤如下:

sudo apt update && sudo apt install curl gnupg lsb-release sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

然后用echo命令把源地址写入sources.list.d目录:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

更新索引:

sudo apt update

这里有一个细节:如果源地址访问不畅,可以考虑把 packages.ros.org 换成国内镜像站。这一步跟系统的apt源替换是两回事,需要单独配置,但换完之后 sudo apt update 的速度会有质的提升。

4.3 桌面版安装与依赖处理

ROS2安装包有ros-foxy-desktop和ros-foxy-ros-base两个粒度。桌面版包含了可视化工具(rviz2、Gazebo)、演示程序和完整库,建议新手直接装桌面版:

sudo apt install -y ros-foxy-desktop

这个包较大,下载加安装可能要十几分钟甚至更久。期间apt会自动解决依赖,你只需要关注有没有报错。如果出现依赖冲突,绝大多数情况是因为系统里的某些第三方源跟ROS2源存在版本冲突,排查思路是逐个审视自己加过的PPA或额外源,而不是强行用apt的force选项。

装完桌面版之后,我还会顺手装两个高频包:

sudo apt install -y python3-colcon-common-extensions python3-rosdep

colcon是ROS2推荐的编译工具,rosdep用来自动解析依赖,后续自己写功能包都离不开它们。

5. 环境变量配置与核心功能验证

5.1 source机制与自动加载

ROS2安装后不会自动进入PATH,需要source它的setup脚本才能使用。每次开新终端都要手动执行:

source /opt/ros/foxy/setup.bash

手动source十个终端九次忘。推荐的做法是写进shell配置里:

echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc source ~/.bashrc

这里有个容易混淆的点:setup.bash和setup.sh的区别。bash用户用setup.bash,如果你的默认shell是zsh就source setup.zsh,别混用。另外,当你想同时使用多个ROS2版本时,多条source命令会有覆盖关系,谁最后运行谁生效,平时只装一个版本就不用担心这个。

5.2 发布订阅Demo验证

装好之后首先要跑一个官方自带的C++ talker/listener例子,这个过程能验证安装是否真正可用:

ros2 run demo_nodes_cpp talker

上述命令会在当前终端持续发布话题消息。新开一个终端,再运行:

ros2 run demo_nodes_cpp listener

如果listener窗口里持续出现 [INFO] [listener]: I heard: [Hello World: n],说明ROS2核心通信链路是通的。这里的n会一直递增,每发一条消息加一。我见过有人listener没输出就以为安装失败,其实多半是环境变量没source,或者两个终端不在同一环境里。

再用CLI工具看一眼话题结构:

ros2 topic list ros2 topic info /chatter ros2 topic echo /chatter

这些命令分别展示话题列表、话题元数据、话题内容。建议新手在这一步多花点时间,把 ros2 node list、ros2 node info、ros2 topic hz 都试一遍,对理解ROS2的基本概念帮助非常大。

5.3 小海龟仿真验证

talker/listener验证的是纯消息通信,小海龟仿真则能验证带图形界面的节点运行情况。

启动乌龟仿真器:

ros2 run turtlesim turtlesim_node

会弹出一个海蓝色窗口,中间有一只乌龟。新开终端运行键盘控制节点:

ros2 run turtlesim turtle_teleop_key

然后在键盘控制终端里按方向键,海龟会跟着移动并留下轨迹。

这套仿真虽然简单,但背后的原理很值得琢磨。turtlesim_node和teleop_key是独立的两个进程,它们之间通过 /turtle1/cmd_vel 这个话题完成通信。你在teleop终端按键,数据通过ROS2 DDS中间件发布,另一个进程接收并驱动图形中的海龟移动。ROS2无论是机器人上的摄像头节点、雷达节点还是底盘控制节点,本质上都是这样协同工作的。能在虚拟机里顺畅跑出图形界面,说明3D加速和open-vm-tools工作正常。

如果想玩得更深入一点,还可以把键盘控制换成自己写的Python发布器。用 ros2 run 运行一个脚本节点,向 /turtle1/cmd_vel 发布线速度和角速度,效果跟按键盘一样。这个实验能让新手真正理解"消息驱动"这个概念。别忘了话题消息类型是geometry_msgs/msg/Twist,发布前要保证消息字段合法。

6. 常见问题排错与性能调优

6.1 VMware相关高频问题

第一个高频问题是"虚拟机里sudo密码正确却提示认证失败"。这个多半不是密码错了,而是键盘布局问题,尤其是ISO选择英文而宿主键盘是中文输入法布局的时候。排查办法是在登录界面确认输入法状态,或者把系统键盘布局改成英语US,一劳永逸。

第二个高频问题是共享文件夹在 /mnt/hgfs 下看不到。解决顺序是这样的:先确认VMware共享文件夹设置里是否Enabled,然后在虚拟机里安装open-vm-tools,最后手动挂载测试。如果还没效果,检查是否被安全策略拦截,把挂载点换个自定义路径再试试。

第三个问题比较隐蔽:虚拟机磁盘占满。很多人创建虚拟机时给的50GB听起来很大,但ROS2装完、Gazebo模型缓存生成后,空间消耗很快。建议提前设置100GB,或者定期清理ROS2日志。ROS2的日志默认存在 ~/.ros/log 下,长期跑会产生大量归档文件。

6.2 ROS2安装与运行时常见报错

报错一:Command 'ros2' not found。这是最基础的问题,九成是环境变量没source。先执行 source /opt/ros/foxy/setup.bash 看命令是否存在,如果存在就把source语句写进~/.bashrc。

报错二:Package 'ros-foxy-desktop' has no installation candidate。这种情况通常是ROS2源没配好。依次检查 /etc/apt/sources.list.d/ros2.list 文件内容是否正确、签名密钥是否已导入、sudo apt update是否报错。密钥文件是二进制内容,别用普通编辑器改它。

报错三:node启动时报共享内存段错误。这通常出现在DDS的共享内存配置与虚拟机内存设置不匹配时。解决办法是把 /etc/sysctl.conf 里的内核参数适当调整,或者改用指定DDS实现。最常见的情形是Fast DDS在低内存虚拟机上的RWMutex问题,给虚拟机多分配1GB内存往往就能解决。

报错四:rviz2打不开或者闪退。先确认3D加速已开启、open-vm-tools-desktop已安装,再尝试在终端运行rviz2看具体报错输出。如果是缺少OpenGL版本,可以在启动前设置环境变量强制走软件渲染,虽然性能下降,但至少能打开界面排查问题。

6.3 虚拟机性能调优经验

性能调优这块,我自己总结出一套比较有效的组合拳:

内存是第一优先级的调整项。Windows宿主机自身占用较高时,虚拟机会变得严重卡顿。可以在VMware设置里把内存的"预留所有客户机内存"选项打开,相当于让虚拟内存锁定在物理内存中,能显著减少交换文件的干扰。

CPU方面,因为ROS2编译时会有大量并行任务,可以把虚拟机CPU核数调到物理机的物理核心数量。注意是物理核心,不是逻辑线程,调多了反而因为超线程竞争导致变慢。

磁盘性能方面,VMware默认的虚拟磁盘类型是动态扩展的,也就是随着使用逐渐增长。如果想追求更好的读写性能,可以改成"预先分配所有空间",第一次创建时会多花一点时间,但后续的文件读写会稳定很多。

还有一个小技巧:在虚拟机设置里关掉不需要的硬件设备。比如声卡、并口、软驱控制器,这些设备虽然不占多少CPU,但会让系统枚举硬件的耗时变长,关掉后开机速度会明显提升。

7. 写在最后的一点经验

整套环境从创建虚拟机到跑通小海龟仿真,正常情况下一两个小时就能走完。但如果你卡在某一步,最有效的排查方式是认真看终端报错,而不是直接复制错误码去搜索引擎——多数报错信息本身就写明了缺失的依赖或错误的路径。

我在帮某实验室的同学排查环境时发现一个普遍现象:很多人安装步骤完全照抄教程,但教程里用的是Ubuntu 22.04配Humble,他偏偏用了20.04,结果所有版本相关的命令都错位了。所以哪怕再急,也先花一分钟确认版本组合,这是整个搭建过程中最值得认真对待的一件事。

另外给一个小建议:虚拟机安装完成后,在环境完全跑通的那一刻,拍一个快照。后续做系统级改动之前都先回到这个快照状态。ROS2开发中拉错分支、装错依赖是常有的事,有了快照相当于给整个系统上了一道保险。我自己在折腾过程中依赖过很多次快照,每次都庆幸当初拍了这一下。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询