YAOTU INSIGHTS

M3芯片用VMware Fusion跑Ubuntu ROS2无人车仿真全记录

M3芯片用VMware Fusion跑Ubuntu ROS2无人车仿真全记录
简介面向在MacM3芯片上开展无人车仿真实验的开发者与研究者资源包围绕虚拟机搭建、Ubuntu系统安装及ROS环境配置的完整流程配套提供仿真机器人的模型描述、传感器与底盘配置以及用于速度发布控制的Python脚本适合需要快速搭建仿真基础环境的入门至进阶用户。压缩包共53个文件体积22.52MB核心内容以xacro、dae、stl模型文件以及sdf、yaml配置和rviz可视化视图为主辅以py脚本、xml与txt说明便于按模型、配置、控制脚本分层查阅整体结构清晰。目前已有415人学习下载。资源从VM安装起逐步覆盖Ubuntu镜像选择与虚拟机参数调优、ROS软件源与密钥配置、环境变量初始化等关键步骤并针对M3芯片架构给出兼容性处理思路可帮助读者少走弯路直接获得一个可运行的无人车仿真环境。1. M3芯片装VM跑无人车仿真这条路值不值得走我自己做无人车仿真这几年在Windows和Linux物理机上搭过好几套ROS环境换到M3芯片的MacBook后第一反应是“又得折腾一遍”。实际跑完一个完整实验才发现M3上用VMware Fusion装arm版Ubuntu再装ROS2 Humble和Gazebo完全撑得起中小规模的无人车仿真比想象中省心。这篇笔记把“Mac、VM、Ubuntu、ROS、无人车仿真实验”这条链路的完整走法和踩坑记录放在一起适合两类人一类是刚接触ROS、想用Mac起步的学生另一类是刚换成M系列芯片、想确认虚拟机方案靠不靠谱的从业者。内容只讲环境怎么搭通、参数怎么给、哪些坑会让你白折腾一天不写ROS入门语法。2. 虚拟机选VMware FusionM3芯片上的Arm虚拟化为什么最关键2.1 三款虚拟机对比VMware Fusion、Parallels Desktop、UTM为什么要把选型放在最前面因为M3芯片是ARM架构和Intel Mac时代的x86环境完全是两码事。你搜“vm安装ubuntu”“mac vmware”会看到大量教程还在用Intel版配置照着做大概率失败。M3上跑虚拟机本质上是在arm64上虚拟化arm64选对工具比选对教程更重要。虚拟机Arm Ubuntu支持个人授权设备直通踩坑点VMware Fusion 13原生支持Apple Silicon个人免费USB、摄像头、串口都完整3D加速有限需官网注册账号Parallels Desktop原生支持付费订阅集成度高价格贵授权策略频繁变UTMQEMU底层支持免费开源看运气性能打折USB直通看玄学我选VMware Fusion的核心原因是它把设备直通做得很老实摄像头、USB转串口、网络桥接都在设置面板里这些全是无人车仿真刚需。Parallels体验更顺滑但付费UTM适合折腾但别指望Gazebo帧率能看。另外提醒一句这里的VM是VMware Fusion跟“VM虚拟机安装Win10”里的VM是同一个词两个概念下载时认准“VMware Fusion for Mac”别下成别的虚拟机软件。2.2 在VMware Fusion里装Ubuntu 22.04 arm64参数与步骤先讲镜像。M3上必须下arm64版Ubuntu推荐22.04.3桌面版镜像。别下amd64版安装到一半会报“Invalid architecture”或者能装但慢到没法用。新建虚拟机时资源分配我一般这么给以M3 Pro 16G内存为例参数建议值说明内存8G虚拟机里跑Gazebo加RViz2很吃内存低于6G会频繁swapCPU核数4~6核别把所有核心让出去编译ROS包时再临时调满磁盘60GUbuntu本体加ROS2加仿真模型40G是最低线安装时语言建议直接选中文装完再把“区域格式”改成英文避免以后终端里碰到中文路径的麻烦。有中文输入法需求的话装完系统后补一个fcitx5sudo apt install fcitx5 fcitx5-chinese-addons然后在登录界面把默认输入法框架切成fcitx5就行这就是“ubuntu中文输入法怎么设置”的完整答案。装好系统第一件事是装VMware Tools。Fusion在arm版下对open-vm-tools兼容最好sudo apt update sudo apt upgrade -y sudo apt install open-vm-tools open-vm-tools-desktop -y sudo rebootopen-vm-tools负责共享剪贴板、拖拽文件和自适应分辨率open-vm-tools-desktop让桌面环境拿到分辨率同步和鼠标无缝进出。这两个包在Ubuntu仓库里有arm64版直接apt装比Fusion菜单里的“Install VMware Tools”更省事。重启后在虚拟机设置里添加共享文件夹把macOS侧的代码目录挂进来sudo mkdir -p /mnt/hgfs vmware-hgfsclient提示共享目录挂载失败时先确认“虚拟机→设置→共享文件夹”里勾选了启用共享再执行sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000手动挂载。2.3 宿主机Homebrew失败的坑装虚拟机前的环境准备这一节看起来跟Ubuntu无关但很多人M3上装Homebrew失败后连VMware Fusion下载都没耐心了。搜索“mac安装homebrew失败”能看到大量案例典型报错就两类。第一类安装脚本卡在curl: (7) Failed to connect to raw.githubusercontent.com port 443。这是网络环境连GitHub raw资源超时和芯片架构无关。解决方法是换镜像源跑安装/bin/bash -c $(curl -fsSL https://gitee.com/Homebrew/install/raw/master/install.sh)选国内源镜像安装后Homebrew本体和bottle都走镜像通道能避开超时。第二类报Error: /opt/homebrew is not writable。原因是目录已经存在但不是当前用户所有常见于之前用sudo装过半截的残留。解决先执行sudo chown -R $(whoami):admin /opt/homebrew再重跑安装脚本。这段血泪经验的核心是别在宿主机环境没干净之前就去碰虚拟机尤其别把x86版Homebrew装在/usr/local和arm版装在/opt/homebrew混着用。M3上混装会引发一堆链接错误到时候你可能误判成Fusion的问题实际是宿主机环境被污染了。3. 装ROS2 Humble从鱼香ROS一键脚本到手动编译的取舍3.1 无人车仿真选ROS2还是ROS1版本与生态取舍装ROS前先回答一个老问题选ROS1还是ROS2。网上大量教程还在推ROS1 Noetic但Noetic官方只支持Ubuntu 20.04我们刚装的22.04没有官方ROS1仓库硬装只能走第三方源或源码编译等于给自己挖坑。维度ROS1 NoeticROS2 Humble官方系统支持Ubuntu 20.04Ubuntu 22.04Arm64支持无官方构建官方支持多机通信依赖ROS_MASTER_URIDDS自动发现无人车栈生态成熟但停滞Nav2、行为树新包都在这里我在这个环境里选ROS2 Humble的理由很直接版本和Ubuntu 22.04天然对齐apt装完就能用无人车仿真需要多机协作ROS2的自动发现机制省掉大量配置。如果你的项目里必须用ROS1旧包建议在Docker里单独跑Noetic容器而不是在22.04上硬编译Noetic——后者会让你连续几天和gcc版本、sophus、Eigen较劲。3.2 鱼香ROS一键安装命令与每一步的实质FishROS这个一键脚本在中文ROS社区用的人很多搜“鱼香ros一键安装”能找到大量反馈。它的价值是把换源、加ROS2仓库、装依赖这些零碎步骤统一接管对新手很友好。执行命令wget http://fishros.com/install -O fishros . fishros接下来按提示输数字选择关键选项有两个一个是选“ROS2安装”版本选humble另一个是安装类型选“全量安装ros-humble-desktop”。无人车仿真要带RViz2和Gazebo选基础版只有命令行工具后面会缺包缺到怀疑人生。脚本逻辑说明它会先检查当前Ubuntu版本和架构再配置apt国内源可选接着写ROS2官方apt源并执行apt install ros-humble-desktop最后尝试初始化rosdep。执行过程中如果中途断网重跑一次脚本就行它是幂等的。装完记得把环境变量写进shell配置文件echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc如果你用zsh第一行的bashrc要换成zshrc。很多人漏了这一步新开终端找不到ros2命令就怀疑装错了实际上只是没有source。另外rosdep init如果报错多半是网络问题可以用rosdep init --include-eol-distros或者直接跳过仿真实验暂时用不到rosdep。3.3 验证安装ros2 doctor、talker/listener、小乌龟装完先别急着跑仿真先做基础通信验证source /opt/ros/humble/setup.bash ros2 doctor --reportros2 doctor会检查环境变量、网络接口和DDS配置输出里没有红色ERROR才算正常。接着跑talker和listenerros2 run demo_nodes_cpp talker # 终端1 ros2 run demo_nodes_py listener # 终端2listener持续打印接收到的消息说明节点通信链路是通的。再跑个小乌龟ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_key键盘能控制乌龟移动说明ROS2核心和键盘事件都工作。这一步是整个无人车仿真的最小可行验证——后续Gazebo里的车能跑起来本质和小乌龟是同一套话题发布订阅机制。3.4 手动编译的依赖坑gcc、sophus与Eigen如果你偏要手动编译而不是用一键脚本翻车点基本集中在三处。第一处是gcc版本。Ubuntu 22.04默认gcc 11对Humble够用但如果之前用PPA改过gcc版本编译时会报internal compiler error。解决sudo apt install --reinstall gcc g再gcc --version确认版本。搜索“ubuntu安装gcc失败”有一半结果是这个原因。第二处是sophus库。源码编译SLAM包时经常碰到“sophus-13fb328”这种具体commit的编译失败报错信息通常是找不到Eigen3或者符号未定义sudo apt install libeigen3-dev libfmt-devsophus依赖Eigen3且对版本敏感安装libeigen3-dev后再编译基本能过。顺手把fmt也装了能解决一堆未知符号报错。第三处是colcon build找不到系统库。这类问题的通用排查法是先把ros-humble-desktop全套依赖装好再编译自己的工作区不要在干净系统上直接编译ROS2源码包。顺序反了报错会五花八门。4. 无人车仿真落地Gazebo、摄像头直通与多机通信4.1 VM里打开摄像头usb_cam与权限无人车仿真实验里视觉感知是核心环节。很多人在Mac上用着摄像头好好的进虚拟机一看就是黑屏。问题多半出在VMware Fusion有一个开关没打开。在“虚拟机→设置→USB与蓝牙”里勾选“连接Mac上的摄像头”虚拟机里才会出现/dev/video0ls -la /dev/video* sudo apt install ros-humble-usb-cam ros2 run usb_cam usb_cam_node_exe这段逻辑是VMware通过USB重定向把Mac的内置摄像头模拟成虚拟机的USB视频设备Ubuntu内核自动加载uvcvideo驱动后生成video节点。usb_cam节点读取该设备并发布/image_raw话题。运行后新开终端执行ros2 topic hz /image_raw有频率输出就是成功。如果提示权限不足执行sudo usermod -aG video $USER注销重进生效。4.2 串口直通VMware Fusion配置USB转串口真车实验时底盘控制板通常通过USB转串口连主机Mac上是/dev/cu.usbserial-xxx。要让虚拟机里的ROS2直接控制底盘必须把USB设备直通进虚拟机而不是宿主机和虚拟机来回倒数据。VMware Fusion的做法是插上USB转串口适配器后在“虚拟机→设置→USB与蓝牙”里勾选该设备它会从宿主机“断开”并重定向到虚拟机。进Ubuntu后用dmesg确认dmesg | grep -i usb ls -la /dev/ttyUSB0 sudo usermod -aG dialout $USER把用户加入dialout组是串口权限里最容易漏的一步。不加组普通用户打开串口会报Permission denied折腾半天还以为是设备没直通。芯片方面建议选CH340或CP2102VMware对这两种的UART模拟最成熟某些国产山寨芯片在arm64 Ubuntu下根本没有驱动只能认栽。注意同一时刻串口设备只能被宿主机或虚拟机一方占用如果Mac端开着串口调试工具虚拟机里必然打不开这是常见的“串口被占用”翻车点。4.3 多机通信ROS2 DDS发现机制与多节点发/cmd_vel时的取舍无人车仿真的多机通信和普通ROS教程不太一样。ROS2没有ROS_MASTER_URI它靠DDS的Discovery协议在局域网里自动发现节点。VMware默认NAT网络会隔离组播导致宿主机和虚拟机里的ROS2节点互相发现不了。解决方法是把网络改成桥接再确认两端IP在同一网段ip a ping 宿主机IP如果桥接后发现网络不通多半是VMware把桥接绑到了没在用的物理网卡上。插着Wi-Fi又连着有线时最容易出现去“虚拟机→设置→网络适配器”里手动指定桥接到当前活跃网卡。搜“vm虚拟机网络地址怎么改”一半答案是在说这个问题。改完桥接DDS默认就能跨机器发现。如果环境里存在多个ROS2网络怕串扰可以用ROS_DOMAIN_ID隔离export ROS_DOMAIN_ID42两端设成同一个ID节点就能正常通信不会串到别人的ROS2网络。接着是无人车指令话题的核心问题键盘控制、自主导航、避障模块可能同时往/cmd_vel发速度指令底盘节点收到的消息一会向左一会向右车必然疯掉。搜“ros多个节点发布移动指令话题时底盘节点如何取舍”社区标准做法是引入话题仲裁而不是在底盘节点里写死逻辑。快速方案是用topic_tools的muxsudo apt install ros-humble-topic-tools ros2 run topic_tools mux /cmd_vel /cmd_vel_teleop /cmd_vel_nav /cmd_vel_avoid ros2 run topic_tools mux_select /cmd_vel /cmd_vel_navmux节点订阅多个输入话题统一输出到/cmd_velmux_select手动切换当前活跃源。更灵活的做法是写一个带优先级的仲裁节点#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist class CmdVelMux(Node): def __init__(self): super().__init__(cmd_vel_mux) # 数值越大优先级越高avoid权限最高 self.priority {/cmd_vel_avoid: 3, /cmd_vel_nav: 2, /cmd_vel_teleop: 1} self.current_topic None self.pub self.create_publisher(Twist, /cmd_vel, 10) for topic in self.priority: self.create_subscription( Twist, topic, lambda msg, ttopic: self.cmd_vel_cb(msg, t), 10) def cmd_vel_cb(self, msg, topic): # 低优先级来源不能覆盖当前高优先级来源 if self.current_topic is None or self.priority[topic] self.priority[self.current_topic]: self.current_topic topic self.pub.publish(msg) def main(argsNone): rclpy.init(argsargs) node CmdVelMux() rclpy.spin(node) if __name__ __main__: main()代码逻辑说明current_topic记录当前活跃源新消息来源的优先级不低于当前源时才发布。lambda里的ttopic把topic绑定为默认参数避免闭包里的变量共享坑。这个版本是精简演示实际工程里还要加时间戳看门狗——超过一定时间没收到任何仲裁输出就自动停车这是无人车安全的底线别省。4.4 Gazebo仿真加载无人车模型与性能调优仿真实验最常用的组合是Gazebo物理仿真器加RViz2可视化。装好后先跑Turtlebot3这是无人车领域验证环境最快捷的模型sudo apt install ros-humble-gazebo-ros-pkgs sudo apt install ros-humble-turtlebot3-gazebo export TURTLEBOT3_MODELburger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.pylaunch文件会拉起一个带障碍物的世界、Turtlebot3模型和传感器插件RViz2里能看到激光扫描。Gazebo在VMware里跑第一个感受就是帧率低因为M3的GPU没有直通给虚拟机渲染全靠CPU软模拟。我一般这样调优在Gazebo GUI里关掉“Shadows”和“Anti-aliasing”阴影和高抗锯齿是CPU渲染的大头物理步长从默认1000Hz降到500Hz精度损失不大但CPU占用明显下降场景里减少非必要传感器不需要摄像头就把camera插件注释掉跑大规模实验时直接无头模式跑不启动GUIros2 launch turtlebot3_gazebo turtlebot3_world.launch.py headless:true调优空间有限虚拟机没有独立GPU是硬限制但配置到位后中小规模单车的仿真帧率能稳定在15到20Hz足够跑导航和路径规划验证。想确认当前显卡状态用lspci | grep -i vga看到的会是VMware虚拟显卡别指望它能干活物理仿真计算主要在CPU上跑。5. 避坑排查M3加VMware环境最常见的5个翻车点5.1 安装阶段最容易翻车的两个点第一条翻车点是Ubuntu装好后黑屏卡Logo。现象是系统启动到Ubuntu Logo就停住鼠标键盘都不响应。原因是VMware Fusion的3D加速驱动在arm版Ubuntu上兼容性差。解决很直接虚拟机设置→显示→取消勾选“使用3D加速”重启后桌面正常。我后来每建一个新虚拟机第一件事就是先把3D加速关掉省得装完再折腾驱动。第二条是宿主机Homebrew安装失败。具体报错是curl: (7) Failed to connect网络原因占绝大多数。解决先确认DNS能解析再用镜像源脚本跑安装。这里要特别提醒别在宿主机上装一堆“一键解决”脚本M3里x86和arm的Homebrew路径不同装乱了会导致Fusion创建虚拟机时工具栏服务异常你可能会错误甩锅给VMware。5.2 ROS2通信玄学虚拟机里的节点到底能不能发现现象宿主机和虚拟机各跑一个ROS2节点topic互相看不到ros2 doctor提示DDS discovery失败。原因VMware默认NAT网络把组播隔离在虚拟机内部DDS的发现报文出不去。解决把虚拟机网络模式改成桥接确保两端IP在同一网段同时检查防火墙sudo ufw allow from 192.168.1.0/24这里有个比较隐蔽的坑改完桥接还是不通大概率是Mac和Ubuntu不在同一子网。VMware桥接默认会自动选择物理网卡但如果插着Wi-Fi又连着有线它可能把桥接绑到没在用的网卡上需要手动在VM设置里指定桥接到当前活跃网卡。这个点我排查了一个晚上才确认是双网卡问题。5.3 设备直通与仿真性能的踩坑记录摄像头黑屏虚拟机里ls /dev/video0存在但画面全黑。原因是Mac端摄像头被FaceTime或其他App占用VMware拿不到帧数据。解决先关掉宿主机所有调用摄像头的程序再重启VM里的usb_cam节点。串口识别不到USB转串口插上后Ubuntu毫无反应。原因是M3上某些USB Hub会吞掉串口设备的VID/PIDVMware直通失败。解决优先把串口适配器直接插Mac本体的USB-C口不要经过Hub。如果还是不行看VM设置里该USB设备是否显示为“可连接”没显示就先在宿主机上确认能被识别。Gazebo卡到个位数帧率这是所有M3虚拟机的通病。解决办法前面章节说过关3D加速、降物理步长、关阴影。如果都做了还卡强制软件渲染试试export LIBGL_ALWAYS_SOFTWARE1软件渲染能规避VMware虚拟GPU带来的偶发崩溃代价是帧率再降一点但稳定性优先。除此之外给虚拟机打快照是最大的后悔药。VMware Fusion支持快照每次装大包或改系统配置前先拍一张翻车了直接回滚比重装Ubuntu快得多。现在我的习惯是环境没动过不拍每次要装依赖前必拍。6. 让仿真结果可信ros2 bag录包与时间戳校验仿真的最后一公里不是画面能动而是结果可复现、数据可回放。这一步做不好前面调通的环境等于白干。我最常用的两个工具是ros2 topic hz和ros2 bag。先验证关键话题频率ros2 topic hz /cmd_vel /odom /scan这条命令同时订阅三个话题并打印频率。/cmd_vel正常波动在5到10Hz/odom和/scan应该有稳定频率输出。如果/scan只有个位数频率就该回到第四章调优否则后续定位建图全是废数据。仿真实验结束后用bag录制整个过程的传感器数据ros2 bag record /cmd_vel /odom /scan /image_raw -o run_2025_01_01.bag录制时加-o指定输出目录便于管理。回放时用ros2 bag play按原时间戳发布数据让下游算法拿到的数据节奏和实车一致。回放前先看包信息确认话题名和消息数没有异常ros2 bag info run_2025_01_01.bag还有一道时间戳检查。我在验收仿真实验时会写一条简单的Python脚本订阅/odom检查header.stamp与接收时刻的差值超过200ms说明Gazebo物理节拍和实际时钟脱节数据不能用。这就是我的验收习惯跑完一次仿真必须同时满足三个条件才算通过——bag能完整回放、话题频率在合理区间、时间戳差值小于200ms。从那以后我每次做无人车仿真实验前都强制走一遍“录包→查频率→对时间戳”这三个步骤宁可多花五分钟也不拿肉眼看到的画面当结论希望帮到你。本文还有配套的精品资源点击获取