很多做机器人、自动驾驶方向的朋友刚上手时都会面对同一个坎在虚拟机上装一套能用的ROS开发环境。我自己帮人排过不少环境问题也见过太多在第一步就卡住的情况。这次把我的完整安装过程、参数选择和踩坑记录整理出来从虚拟机创建到ROS Melodic跑起来一步一步走一遍。适合刚接触Linux和ROS的初学者也适合给需要在Windows主机上快速搭建ROS测试环境的人做个参考。1. 为什么选择虚拟机方案思路与选型1.1 虚拟机和双系统怎么选接触过ROS的朋友都知道官方对Ubuntu 18.04的支持最完整的是ROS Melodic而这套组合恰好是很多教材、开源SLAM算法、路径规划项目默认的开发环境。问题在于很多人手里只有一台Windows电脑直接放弃Windows又不太现实这时候就需要决定是装双系统还是用虚拟机。我个人的建议是如果你的主要目标是学习ROS基础、跑通示例代码、体验可视化工具Rviz、Gazebo虚拟机是更划算的选择。原因有三个双系统切换麻烦重启一次才能换环境频繁切换会消磨学习耐心虚拟机可以随时拍快照把系统搞崩了恢复一下就回来了ROS生态里很多操作是有风险的虚拟机里的Ubuntu不影响宿主机日常使用文件拷贝、联网共享都方便当然虚拟机也有代价。最大的问题就是性能损耗。如果你要跑Gazebo重型仿真或者处理点云数据虚拟机里的表现明显不如物理机上装Linux。这一点我在后面会详细讲怎么优化。1.2 虚拟机和系统的版本选择依据先说虚拟机软件。我身边用的人主要分两派VMware和VirtualBox。VMware整体性能更好GPU加速和USB设备透传做得更成熟特别是3D加速和对Windows主机硬件的适配长时间运行也更稳定。VirtualBox免费开源占用资源更少但图形加速略逊一筹USB透传偶尔需要装扩展包。考虑到咱们要跑ROS的可视化界面Rviz3D渲染能力很关键我推荐VMware。如果预算有限VirtualBox也能用但最好在虚拟机设置里把显存调到128MB并开启3D加速。系统版本这块必须有明确认知ROS Melodic只官方支持Ubuntu 18.04。虽然有人在高版本Ubuntu上通过源码编译方式装Melodic但依赖问题很多初学者不建议折腾。ROS和Ubuntu是绑定关系Melodic对应18.04Neotic对应20.04后面的版本对应22.04。在这篇文章里我用的是Ubuntu 18.04.6的镜像这是18.04的最终维护版本。2. 创建虚拟机与Ubuntu 18.04安装细节2.1 关键参数配置建议创建虚拟机时参数别乱选。我先直接给一套实测稳的参数配置项推荐值说明内存4096MB以上编译ROS包时内存不够容易直接卡死处理器2核心以上编译时加快速度1核太慢硬盘50GB以上安装完ROS后剩余空间要有富余网络NAT模式简单直接宿主机有网虚拟机就能上网显存128MBRviz可视化必需调小了会花屏3D加速开启让Rviz渲染更流畅有同学问硬盘为什么给50GB看着挺大的。一个完整的desktop-full版加上编译缓存30GB左右就快满了加上后续装各种功能包预留出空间很重要。而且VMware的磁盘是动态增长的不是一下子占满宿主机空间所以给大点不心疼。2.2 Ubuntu安装过程中的关键选择镜像从官方镜像站下载文件是ubuntu-18.04.6-desktop-amd64.iso。在VMware新建虚拟机时选典型镜像选稍后安装自定义硬件配置。系统类型这块要手动选客户机操作系统选Linux版本选Ubuntu 64位不要让它自动识别。启动虚拟机进入安装界面后有几步最关键安装过程中建议选最小安装而不是完整安装省时间也更干净下载更新这个选项可以暂时不勾选系统装完再换源更新速度会快很多磁盘分区那一步直接用整块磁盘不用手动分区对新手最友好用户创建这里有个小坑用户名别用中文ROS里很多工具对中文路径支持不好。用简单的英文用户名最省心。2.3 系统装好后必须先做的三件事系统安装完成后第一件事不是急着装ROS先把基础环境理顺。安装VMware Tools或者open-vm-tools。桌面版推荐直接在命令行执行sudo apt update sudo apt install open-vm-tools-desktop装完重启这样才能获得自适应分辨率、宿主机和虚拟机之间拖拽文件、共享剪贴板这些功能。如果不装这个虚拟机窗口分辨率固定文件传输来回拷U盘很痛苦。第二件事是更换软件源。Ubuntu自带的源服务器在海外下载速度感人。换成国内源推荐清华、阿里云或中科大的镜像源。在“软件与更新”里把下载服务器换成国内源然后刷新即可。第三件事是把系统自带的所有更新都打上直到apt upgrade不再提示有可升级的包。之后再装ROS能少踩很多依赖坑。3. ROS Melodic完整安装实操3.1 准备工作源配置与公钥导入ROS官方提供了一个专门的软件源但直接使用官方源的话下载速度取决于你的网络情况。国内用户建议直接换成国内镜像源比如中科大或者清华的ROS源速度稳定很多。这里用中科大源举例。在终端执行sudo sh -c . /etc/lsb-release echo deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main /etc/apt/sources.list.d/ros-latest.list注意这里的关键是$DISTRIB_CODENAME会被自动替换成bionic也就是Ubuntu 18.04的代号。为什么必须要加这一句因为如果没有这一步apt无论如何都找不到ROS的安装包。接着导入公钥sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个公钥的作用是让系统信任这个软件源里的包。如果公钥导入时报错多试一两次或者换keyserver地址这是常见问题。导入公钥后一定不要忘记更新sudo apt update看到出现ros相关条目并且没有报错说明源配置好了。3.2 核心包安装desktop-full接下来就是安装ROS本体。这里我推荐装完整的桌面版sudo apt install ros-melodic-desktop-full这个包会装包括Rviz、Gazebo、各种传感器驱动、导航库、图像处理库在内的几乎所有核心组件不需要后续一个个找依赖。整个过程大概需要几分钟到十几分钟取决于你的网络和磁盘速度。有朋友问为什么不直接装ros-melodic-ros-base或者最小版如果你只是测试一些命令行工具和通信机制base版可能够了。但ROS生态里大量工具和仿真器都要额外装依赖尤其是Rviz作为初学者看可视化效果非常重要所以一步到位是最省心的方案。安装结束后验证一下dpkg -l | grep ros-melodic | wc -l这个命令会输出安装的包数量。正常情况下一百多个包说明安装成功。3.3 环境初始化rosdep与bash配置安装完成后需要做两件事初始化rosdep配置环境变量。rosdep是ROS用来管理包的依赖关系的工具。编译源码时它会自动找出缺少的系统依赖很重要。先初始化sudo rosdep init rosdep updaterosdep init这一步会往/etc/ros/rosdep/sources.list.d/里写入一个配置文件。如果这里报错提示损坏或无法创建可以直接用编辑器检查那个文件是否存在以及内容是否正确。而rosdep update经常卡住多半是网络连接不上rosdep服务器后面我会专门说解决办法。环境变量这一步不能省echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc这行命令的作用是每次打开终端自动加载ROS的环境变量。如果不执行你会发现打开新终端后输入roscore提示找不到命令。再验证一下roscore如果看到 started core service 的输出说明ROS已经正常安装和启动了。3.4 安装后的功能验证环境装好后跑一个小乌龟来确认系统完整可用。新开一个终端rosrun turtlesim turtlesim_node这时候应该会弹出一个窗口里面有一只小乌龟。再开一个终端rosrun turtlesim turtle_teleop_key此时可以用键盘方向键控制窗口里的乌龟移动。看到乌龟动起来说明从核心通信到可视化渲染全都正常。顺带验证一下主题通信rostopic list会看到/turtle1/cmd_vel、/turtle1/pose等话题。这里所见的就是ROS的发布/订阅机制的直观体现。键盘控制程序发布速度指令到cmd_vel话题乌龟节点订阅这个话题于是乌龟就移动了。至此在虚拟机上搭建ROS开发环境的目标已经完成。但后续做实际项目时还会遇到一些虚拟机特有的问题我在下面单独整理一下。4. 虚拟机环境下高频问题排查实录4.1 rosdep update超时的处理思路这是安装过程中最容易卡住的一步。我见过很多同学在这里反复执行失败又找不到原因。先看具体报错。如果是ERROR: error loading sources list或者ERROR: cannot download default sources list大概率是网络原因无法访问rosdep的服务器。在虚拟机环境下如果NAT模式都连不上建议先确认宿主机能正常访问外网然后尝试sudo apt install python-rosdep python-rosinstall-generator python-wstool build-essential重新安装rosdep工具本身然后重试。如果重试多次依然失败可以检查/etc/ros/rosdep/sources.list.d/20-default.list这个文件是否存在且内容正确。内容应该包含指向raw.githubusercontent.com的几个yaml地址。网络不通时可以把这些yaml文件预先下载到本地然后修改配置指向本地路径。这块操作有点绕但对网络环境受限的场景很有效。值得强调的是不用把rosdep update卡住当成天大的事。如果你的目标只是跑ROS自带的示例和已有功能包rosdep没成功初始化也能工作。它主要影响的是你后续编译那些依赖未预装的功能包。所以卡住了先尝试解决实在不行先继续往下走已经安装的ROS核心功能不受影响。4.2 Rviz或Gazebo渲染异常这是虚拟机里跑ROS最常见的体验问题表现是Rviz窗口黑屏、花屏或者界面拖拽严重卡顿Gazebo启动后地面和模型只显示一半。先说原因。虚拟机默认的显卡渲染能力和物理机差距很大Gazebo和Rviz都依赖OpenGL如果虚拟机没有开启3D加速或者显存设置太小渲染就会出问题。解决办法按顺序排查确认虚拟机设置里已勾选“加速3D图形”显存设为128MB安装open-vm-tools-desktop并重启系统尝试在启动Rviz时禁用硬件加速LIBGL_ALWAYS_SOFTWARE1 rosrun rviz rviz如果这样能正常显示说明3D加速不生效只能使用软件渲染如果软件渲染也卡把显示分辨率调低会有所改善软件渲染终究是权宜之计真要流畅跑Gazebo仿真还是建议在物理机装Ubuntu这也是很多项目从虚拟机过渡到实机的原因。4.3 共享文件夹与文件传输很多人习惯直接在Windows和虚拟机之间拖拽文件。装好open-vm-tools-desktop后拖拽传输一般是可用的但有一个隔一段时间必然会遇到的坑虚拟机里的用户对共享文件没有写权限。在虚拟机设置里添加共享文件夹后如果你在Ubuntu里看到这个目录却无法写入执行sudo adduser 你的用户名 sudo sudo adduser 你的用户名 vmware然后重新登录。这会把当前用户加入sudo组和vmware组。如果还不行检查共享目录的权限设置设为启用共享而不是只读。如果拖拽传输偶尔失灵不要来回重启虚拟机直接试试vmware-user-suid-wrapper这个服务有没有启动或者干脆用scp命令通过网络传文件反而更稳定。4.4 内存不足导致的编译卡死编译ROS功能包时gcc和g会吃掉大量内存虚拟机如果没有设置足够内存在编译过程中会出现Killed或者internal compiler error看起来像是系统卡死了。我自己的经验是4GB是最低要求8GB会舒服很多。如果在编译大型功能包时发现内存被吃满可以考虑临时增加交换空间。sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile这样相当于给系统额外加了4GB的交换空间虽然不是物理内存但能避免编译进程被直接杀掉。项目编译完如果不想要这个交换文件可以用sudo swapoff /swapfile关掉并删除文件。4.5 虚拟机时间不准导致的奇怪问题这个坑比较隐蔽。虚拟机的系统时钟有时候会和宿主机时间不一致特别是在宿主机休眠或唤醒之后。时间不对会直接影响代码编译因为很多构建工具依赖文件时间戳。如果发现catkin_make反复报出莫名其妙的错误先看看系统时间对不对比对一下date如果时间不对安装并启动时间同步服务sudo apt install ntpdate sudo ntpdate time.nist.gov然后在虚拟机设置里把时间同步打开确保VMware工具持续校准时间。这个问题不在常规教程里出现但一旦出现排查成本很高。5. 一些实测体会虚拟机下的Ubuntu 18.04加ROS Melodic适合的是学习、验证、跑通代码这条路。什么场景下适合用这个方案就是当你在Windows上办公学习、手上又没有多余物理机的时候。我按这套流程走完最深的体会是环境本身不难装真正花时间的是理解和调试网络、权限、渲染这几层问题。如果你后续要继续玩SLAM建图、跑激光雷达驱动、做move_base路径规划虚拟机方案完全可以作为起步平台。很多传感器驱动本身跑的是USB串口透传VMware对USB设备的透传支持比较成熟。但如果你开始做实时性要求高的控制算法、或者要跑Gazebo的复杂场景仿真我建议还是尽早切到物理机装Ubuntu。最后分享一个小技巧装好ROS后先拍一个快照命名为“ROS基本环境可用”。后面不管折腾坏什么恢复回来就是一套干净可用的ROS环境特别适合在实验新功能包之前保存一个原始状态。版本控制思维用在环境上能省掉很多重装的时间成本。