VMware预装Ubuntu机器人开发环境:ROS+Gazebo+MoveIt开箱即用
2026/9/12 12:34:58 网站建设 项目流程

搞机器人开发,尤其是刚接触ROS这一块的朋友,应该都经历过那种被环境搭建支配的恐惧。系统版本不对、依赖包冲突、编译报错、图形界面卡死,一天下来代码没写几行,净跟终端打架了。这套VMware预装Ubuntu 18.04/20.04/22.04的机器人开发环境镜像,就是把ROS1、ROS2、MoveIt、Gazebo这些整套东西提前装好、调好、验证过,你拿到手导入虚拟机,打开终端就能直接跑仿真。这篇文章我会从为什么这么设计、版本怎么配对、具体怎么导入和使用、以及我封装这套镜像时踩过的坑几个方面,完整讲一遍,希望能帮你少走几个月的弯路。

1. 机器人开发环境搭建的痛与解

1.1 新手的第一道坎:不是代码,是环境

很多朋友学ROS,最开始兴致勃勃照着教程敲roscore,结果第一步就卡住了。ROS的安装本身没多难,难的是它跟Ubuntu版本严格绑定,而且依赖关系极其敏感。Ubuntu 18.04只能跑ROS Melodic,20.04吃Noetic和Foxy,22.04上Humble最省事。一旦系统装错了版本,或者中间动了一些底层库,后面基本上就是无穷无尽地修依赖。

我自己带过几个本科生做毕设,最深的体会是:环境问题消耗掉的时间,往往比写代码还多。有人apt升级把ROS的依赖搞坏了,有人python版本被替换导致rosdep失效,有人Gazebo启动黑屏,一查是显卡驱动问题。这些问题对老手来说可能10分钟解决,但对刚入门的人,随便一个都能卡一整天。

1.2 为什么我用虚拟机而不是双系统

双系统听起来很"原生",性能也确实好,但实际用起来有几个很现实的问题。第一,来回切换要重启,折腾几次人就烦了。第二,很多学生的笔记本是Win11 + 新硬件,装完Ubuntu后WiFi网卡驱动、NVIDIA驱动各种不兼容,光是装驱动就能劝退一半人。第三,真把机器人跑起来之后,经常需要Windows那边用微信、Office、画图软件,两边来回倒腾文件非常麻烦。

WSL(Windows Subsystem for Linux)这几年确实成熟了很多,但如果你要用Gazebo做仿真、用RViz看点云、跑MoveIt做运动规划,WSL的图形性能表现还是不如完整虚拟机。而且对于一个需要长期维护、可能要发给多个同学使用的环境来说,VMware虚拟机镜像有一个独特优势:它把整个系统状态打包成一个文件,坏了可以回滚,复制一份就能分发,真正做到"开箱即用"。

1.3 这套镜像到底适合谁

基于这些痛点,我把这套镜像定位成三个场景。第一,高校机器人方向的学生,尤其是课程设计、毕业设计需要快速上手ROS和Gazebo仿真的。第二,实验室里以Windows为主力系统、但需要用Ubuntu环境做开发测试的工程师。第三,想复现某个开源机器人项目、又不想从零折腾环境的朋友。

我做的不是那种"最小可用"的裸系统,而是把ROS1、ROS2、MoveIt、Gazebo这些核心件全部预装好,同时做了换源、装常用工具链、配置交互体验这些补充工作。它不是万能的,但覆盖了大多数机器人仿真开发的基础需求。

2. 版本选型与软件栈设计思路

2.1 三个Ubuntu版本和ROS的对应关系

做镜像第一步最核心的问题,就是版本怎么配对。ROS和Ubuntu的版本对应关系几乎是强制的,装错版本就是灾难。

Ubuntu版本ROS1版本ROS2版本状态说明
18.04MelodicDashing(已EOL)ROS1为主,适合老项目
20.04NoeticFoxyROS1和ROS2都比较成熟,最推荐学习
22.04无官方二进制包Humble纯ROS2路线,新项目首选

这三个版本基本覆盖了目前主流的学习需求。18.04的镜像我主要面向那些要复现老论文、老工程的同学,里面默认装好Melodic。20.04是ROS1和ROS2之间的"过渡版本",Noetic是ROS1最后一个LTS版本,Foxy则是ROS2第一个LTS,两个都能跑,方便对比学习。22.04则直接走Humble,这也是目前ROS2社区最活跃的版本,新教程、新功能大多围绕它展开。

2.2 MoveIt与Gazebo:仿真的黄金搭档

很多刚接触机械臂方向的同学会问,为什么仿真环境里离不开MoveIt和Gazebo。简单说,Gazebo负责提供一个物理仿真世界,有重力、摩擦、传感器噪声,能模拟真实的机器人本体和环境交互。MoveIt则负责运动规划,给机械臂一条无碰撞的运动轨迹。两者通过ROS的话题和服务通信,MoveIt规划出一条路径,Gazebo里的机器人模型就去执行,RViz负责可视化显示。

在版本配对上,20.04镜像里我装的是MoveIt 1配合Noetic,22.04里装的是MoveIt 2配合Humble。Gazebo这边选择的是Gazebo Classic 11而不是新一代的Gazebo Sim(Ignition)。原因是目前绝大多数教程、开源项目、毕业论文里用的还是Classic接口,gazebo_ros_pkgs生态也最成熟。先把Classic玩熟,再去接触新仿真器会平滑很多。

2.3 除了ROS本体,我还预装了这些"省钱"工具

只装ROS基础包其实远远不够,实际开发中你还得装一堆工具链和依赖库。这套镜像在三个版本里都统一做了几件事。

系统层面预装了Terminator终端(支持分屏,写代码时非常实用)、Git、Vim、VS Code、Chrome浏览器、搜狗输入法。搜索输入法这块特别提一下,很多人在Ubuntu里装搜狗装到崩溃,主要是缺少一堆依赖,我把这些依赖提前固化了,装上直接能用。

开发库方面预装了Eigen(线性代数库,运动学计算必备)、PCL(点云库)、OpenCV(视觉处理)、robot_localizationnavigation等导航相关包,还有plotjugglerrqt全家桶做数据可视化。这些库如果你自己装,光是编译依赖可能就要折腾一两天,我在封装时全部通过apt和源码编译两种方式装好,绝大多数情况下你不需要再碰它们。

3. 从导入镜像到跑通仿真实操全流程

3.1 导入VMware镜像的第一步

拿到镜像压缩包后,先解压到磁盘空间比较充裕的分区,然后在VMware Workstation里点击"文件 -> 打开",选中解压出来的.vmx文件即可。如果你双击.vmx,VMware会自动弹出导入引导界面。

导入时VMware会问一个问题:这个虚拟机是"我已移动"还是"我已复制"。我的建议是:如果你只是在这台电脑上自己用,选"我已移动"就行,速度快。如果打算复制给别的同学或换到别的电脑上,选"我已复制",这样VMware会重新生成机器的唯一标识,避免后续网络和系统标识冲突。我第一次做镜像分发时偷懒选了移动,结果两台电脑同时开机上报同一个主机名,局域网SSH直接乱套。

导入之后建议立刻做两件事。第一,虚拟机设置里开启3D加速,图形界面和Gazebo渲染会流畅很多。第二,确认VMware Tools(确切说是open-vm-tools)已经安装。我封装时默认装了open-vm-tools-desktop,如果没有,执行sudo apt install open-vm-tools open-vm-tools-desktop装好,然后重启一次,这样宿主机和虚拟机之间的复制粘贴、文件拖拽就都能用了。

3.2 虚拟机性能参数怎么调

很多初学者默认设置就直接用,结果发现Gazebo跑起来像幻灯片。虚拟机不是给得越多越好,但几个关键参数值得认真调一下。

内存方面,如果你宿主机内存是16GB,给虚拟机分配8GB是比较舒服的组合。如果宿主机32GB,直接给16GB,Gazebo加载复杂世界模型时内存占用轻松超过4GB,给少了会卡到怀疑人生。处理器建议分配4核,对于Gazebo物理引擎和多核编译都比较友好。

磁盘在创建镜像时改成了按需增长模式,也就是实际用了多少空间才占用多少磁盘,这个不要改。虚拟机的"处理器设置"里把"虚拟化引擎"的选项都勾上,对性能和兼容性都有帮助。

还有一个很多人不知道的选项:VMware顶部菜单"虚拟机 -> 设置 -> 显示器",把3D图形加速打开,图形内存拉到最大。虽然Gazebo的渲染主要靠CPU,但3D加速对RViz和整个Unity桌面体验的提升非常明显。

3.3 打开终端,逐项验证环境

镜像导入、虚拟机配置合理之后,先别急着跑大工程,用一组简单命令验证环境状态。这一步能帮你确认ROS、Gazebo、MoveIt都正常,如果某些环节有问题,尽早发现比后面排错轻松得多。

# 查看Ubuntu版本 lsb_release -a # 查看ROS1版本(18.04/20.04镜像) rosversion -d # 查看ROS2版本(20.04/22.04镜像) printenv ROS_DISTRO # 启动ROS1主节点 roscore

每一条命令都有预期输出。rosversion -d正常会输出melodicnoeticROS_DISTRO会显示foxyhumbleroscore启动后终端会停在启动日志那里,看到started core service [/rosout]就说明ROS1正常。验证完按Ctrl+C停掉。

然后验证Gazebo和RViz能不能出来图形窗口:

gazebo rviz

两个命令都会弹出图形界面,如果都能正常显示,说明图形环境和ROS基础通信没问题。接着可以验证一下ROS和Gazebo的桥接,在命令行执行rosrun gazebo_ros gazebo,如果能在RViz里看到机器人模型并且Gazebo里能看到世界,这整套流程就算通了。

3.4 跑一个TurtleBot3小车仿真

环境验证没问题后,我建议你跑一遍TurtleBot3的Gazebo仿真,这是最经典、最能说明"开箱即用"的Demo之一,整个流程走通之后,你对这套环境的信任感会完全不一样。

TurtleBot3是ROS生态里的入门级移动机器人,模型简单但功能齐全。在20.04镜像里,打开终端执行:

# 设置模型类型 echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc source ~/.bashrc # 启动Gazebo世界 roslaunch turtlebot3_gazebo turtlebot3_world.launch

gazebo会加载出一个带有墙壁、障碍物的小房间,TurtleBot3小车出现在场景中央。然后再开一个新终端运行键盘控制:

roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

这时按键盘上的方向键就能驱动机器人前进后退转弯。Gazebo窗口里同时可以看到带物理反馈的运动过程,RViz(如果你手动启动)里能看到激光雷达的可视化点云。第一次跑通这个小车,从导入镜像到键盘控制,全程不超过十分钟,这就是"开箱即用"的实际体验。

Panda机械臂的MoveIt仿真也是一样的逻辑。20.04和22.04镜像里我放了对应的panda配置包,启动后MoveIt会在RViz里加载机械臂模型,你可以通过交互标记拖动目标点,MoveIt实时规划路径,Gazebo同步执行机械臂的运动。

3.5 和宿主机传文件的三条路子

虚拟机再好用,也躲不开和Windows宿主机传文件的场景。教程PDF在Windows里,代码写完要传回Windows跑别的工具,这些都需要靠谱的文件传输方案。

第一条路是VMware共享文件夹。虚拟机设置 -> 选项 -> 共享文件夹,添加一个Windows目录为共享目录,在Ubuntu里访问/mnt/hgfs/就能看到。这个方法最简单,但偶尔会有挂载失效的问题,重新挂载即可:sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000

第二条路是SSH。我在镜像里预装了SSH服务并设为开机自启,确保虚拟机和宿主机在同一个局域网或NAT网段下,然后Windows侧用MobaXterm或VS Code Remote-SSH连接虚拟机IP即可。这个方法适合传大量代码文件,也适合那些不喜欢用虚拟机窗口、更喜欢用Windows终端操作的人。

第三条路是直接用VMware的拖拽复制。复制Windows里的文件,粘贴到Ubuntu文件管理器;反之亦然。装上open-vm-tools-desktop之后这个功能很顺滑。我日常的姿势是:小文件直接拖,大批量用共享文件夹,远程操作走SSH,三条路互相兜底。

4. 常见问题与排查技巧实录

4.1 Gazebo卡顿、黑屏、加载半天

Gazebo启动慢、画面卡,几乎是我被问得最多的问题,没有之一。这里面的原因可以拆成两类:模型下载卡顿和图形渲染卡顿。

第一类是Gazebo启动时首次加载模型库会尝试从网上下载标准模型,如果网络不好,就一直卡在加载界面。解决办法是提前把模型库准备好。我在镜像里已经把常见的gazebo_models模型库放到了~/.gazebo/models目录下,正常情况下不需要联网下载。如果你自己重新构建环境遇到这个问题,可以从开源仓库克隆一份模型库放到这个目录。

第二类是渲染卡顿,解决办法优先检查3D加速是否开启,再降低Gazebo渲染质量。运行Gazebo前加一句:

export GAZEBO_GRAPHICS=1

这个变量控制Gazebo的图形渲染级别,调低后流畅度会明显提升。另外,我习惯把不需要的GUI面板关掉,Gazebo顶部菜单的"Window -> 关闭"里,可以只保留3D视图,省掉那些实时曲线等额外开销。

4.2 打开新终端就要重新source

这是一个很典型但也很容易解决的小问题。如果你新开一个终端,敲rosrunros2 run报"command not found",说明当前shell会话没有加载ROS环境变量。

镜像里我已经把对应的source语句写进了~/.bashrc,正常情况下开新终端会自动加载。但如果有人改动过bashrc、或者你在zsh等非bash环境里使用,就可能不会自动加载。手动临时加载的命令是:

# ROS1 source /opt/ros/noetic/setup.bash # ROS2 source /opt/ros/humble/setup.bash

如果你自己建了ROS工作空间(比如catkin_wscolcon_ws),还要额外source工作空间的setup文件。为了确认环境是否正常,你可以执行echo $ROS_DISTRO,如果显示空,说明环境确实没加载,按上面的source命令对症下药。

4.3 虚拟机里网络能用但时好时坏

虚拟机的网络模式默认是NAT,好处是宿主机能上网,虚拟机就能上网,不用额外配置。但有时会遇到apt源连不上、Gazebo模型下载卡住、rosdep update超时等问题,这时候要先确认网络通不通。

ping -c 4 baidu.com ping -c 4 github.com

baidu.com能通、github.com不通,这是很多机器人的常态。镜像里已经把apt源换成了国内常用源,rosdep的地址也做了缓存,所以大部分场景下网络影响不大。如果你要频繁访问GitHub相关资源,可以试试在浏览器里配置代理插件或者使用镜像站,而不是折腾整个系统的全局代理,这样稳定性好很多。

有一点要提醒:如果你把虚拟机网络改成桥接模式,虚拟机就相当于局域网里的一台独立设备,IP地址会由路由器分配。好处是宿主机和虚拟机可以互相直接访问,但需要注意虚拟机防火墙配置,否则SSH会连不上。

4.4 磁盘空间不够了怎么办

ROS和Gazebo都是磁盘大户,源码编译完动辄好几个G,模型文件、仿真日志、Docker镜像也会蚕食磁盘。虽然镜像默认给了60GB的动态增长磁盘,但还是建议养成定期清理的习惯。

# 清理apt缓存 sudo apt clean sudo apt autoremove # 清理ROS编译缓存 rm -rf ~/.ros/log # 查看大文件 du -sh * | sort -h

如果磁盘确实不够用,需要对VMware虚拟机磁盘扩容。先在VMware虚拟机设置里把磁盘大小扩大,然后进入Ubuntu用gparted工具调整分区。这个操作建议在备份或快照之后做,虽然gparted本身比较稳定,但分区调整一旦断电或出错,数据损失的风险是实打实的。

4.5 快照用得好,环境永不坏

我特别想强调快照的价值,这是虚拟机相对实体机最大的优势。每次你装好一套能用的环境,比如MoveIt跑通了、Gazebo仿真正常了、某个新库编译成功了,都值得打一个快照。

具体操作:VMware顶部菜单"虚拟机 -> 快照 -> 拍摄快照",给快照写个清晰的名字,比如"Gazebo+MoveIt_ok_202405"。以后无论你把环境搞得多烂,都可以随时恢复到快照状态。这比任何"修复环境"的技巧都管用。

我自己有个习惯:镜像交付前先打好一个干净快照,然后在快照基础上再做一些花里胡哨的配置,那些配置挂了就恢复快照,完全不心疼。注意快照不是备份,如果虚拟机文件本身损坏或者磁盘满了,快照也会受影响。重要的工程代码和论文资料,还是要同步到宿主机或网盘。

4.6 常见问题速查表

症状可能原因解决办法
Gazebo启动卡在"Loading model"模型库未就绪确认~/.gazebo/models有模型文件
RViz窗口花屏或卡顿3D加速未开启开启虚拟机3D加速,加大显存
roscore启动报地址错误ROS_MASTER_URI配置异常检查/etc/hosts中hostname映射
rosdep update超时网络对GitHub不稳定使用rosdep国内镜像或缓存
键盘控制小车方向错乱TURTLEBOT3_MODEL未设置设置export TURTLEBOT3_MODEL=burger
拖拽复制失效open-vm-tools未运行重装并重启桌面:sudo apt install --reinstall open-vm-tools-desktop
新终端找不到ros命令未加载环境变量检查~/.bashrc里的source语句

5. 镜像封装背后的经验与踩坑

5.1 封装镜像最容易翻车的三个点

这套镜像我前前后后打磨了好几版,每一版都有翻车教训,这里分享三个直接影响使用体验的坑。

第一个是体积控制。一开始我什么都想往里塞,各种库、各种模型、各种示例包全装进去,结果镜像解压后超过80GB,分发极为痛苦。后来做了瘦身:清理apt缓存、删除工作空间里的buildinstall目录、清掉~/.cache下的大文件。系统保持"干净可扩展"比"什么都装好"更重要。瘦身之后镜像体积控制在25GB以内,传输和导入都轻松很多,需要什么功能再按需装。

第二个是版本锁定。Ubuntu系统装好之后要封禁自动升级策略,避免用户一开机就自动升级内核和系统库导致ROS依赖崩掉。我在镜像里把自动更新服务关掉,同时建议用户用apt-mark hold锁定关键基础包。ROS本身依赖很多特定版本的库,系统一升级,轻则报警告,重则直接起不来。

第三个是用户习惯固化。我预置时把工作目录结构和常用命令写进了~/.bashrc的注释里,方便每个拿到镜像的人快速了解环境。还配好了一个基础的catkin_wscolcon_ws目录,这样用户不用从零创建工作空间,直接开始写功能包就行。

5.2 进阶玩法:从装好的镜像继续扩展

这套镜像不是终点,而是起点。很多朋友跑通TurtleBot3之后,就开始往里面按自己的项目需求装配环境了。

装了Docker之后,可以把一套干净的环境打包成容器,测试完即删,不影响虚拟机本体。ESP32开发板和ROS2的Micro-ROS集成我也在22.04镜像里测试过,micro_ros_espidf_component编译链是通的,接入传感器和执行器后,Gazebo里的仿真数据可以直接和真实硬件打通。海康相机这类工业相机的ROS驱动,我也在20.04镜像里做过适配,通过USB透传可以直接在虚拟机里读图像话题。

关键点在于:镜像提供了稳定的底座,你只需要在这个底座上做增量开发,而不用担心哪天一个不小心把环境搞坏了没法恢复。快照 + 干净的底座,就是继续折腾的底气。

5.3 最后分享一个小技巧

既然是分享,最后再送你一个小经验。虚拟机里用Gazebo做仿真,如果同时开多个launch文件,关的时候一定要留意终端进程是否真的退干净了。很多时候Gazebo窗口关了,但后台的gzserver进程还在跑,继续吃CPU。习惯性地在关闭仿真后执行:

pkill -f gzserver pkill -f gzclient

这个问题在文本终端里特别容易踩坑。养成习惯之后,虚拟机里的CPU占用会清爽很多,整个系统的响应速度都会不一样。做机器人开发,环境稳定比什么花活都重要,这也是我坚持维护这套镜像的核心理由。

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

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

立即咨询