
做导航、做底盘、做感知的同学第一步几乎都逃不过同一件事在一台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 LTSFocal 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-toolsUbuntu源里自带安装方式为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_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_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-rosdepcolcon是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开发中拉错分支、装错依赖是常有的事有了快照相当于给整个系统上了一道保险。我自己在折腾过程中依赖过很多次快照每次都庆幸当初拍了这一下。