第一次把大疆MID360插上虚拟机的时候,我原本以为跟在物理机里一样,打开官方软件就能看到一片点云。结果雷达指示灯明明在闪,终端却始终找不到设备,断断续续折腾了一个晚上才发现问题不在雷达,而在虚拟机网络、IP网段、驱动版本这几个交叉点上。这篇内容就是把整条配置链路完整走一遍:从VMware里装好Ubuntu 22.04,到部署ROS2 Humble,再编译大疆官方的livox_ros_driver2驱动,最后在RViz2里看到实时点云数据输出。不需要双系统,不需要重装物理机,适合所有想先在纯虚拟机环境里跑通点云数据、为后续建图和导航做准备的开发者。
开始之前先明确一个前提:MID360本质上是一台以太网设备,它的点云数据走网线,通过UDP协议传出来,而不是像USB雷达那样即插即用。这也是为什么很多人在虚拟机里卡住——虚拟机能不能和雷达互通,完全取决于虚拟网卡能不能和雷达处在同一个网络里。搞懂了这一点,后面的每一步都有明确方向。
1. 为什么折腾虚拟机还不翻车:先把MID360的工作方式说清楚
1.1 MID360不是USB雷达,它靠网线说话
MID360是大疆Livox系列里的一款混合固态激光雷达,水平视场角360°、垂直视场角约59°,在很多中低成本的机器人方案里都能见到。它对外提供的是标准以太网接口,而不是USB口,这意味着驱动软件拿到原始点云包之前,必须先把电脑和雷达之间这条网络链路打通。
MID360使用的通信SDK是Livox SDK2。这一点非常关键。大疆早期的激光雷达驱动仓库叫livox_ros_driver,那是ROS1时代搭配SDK1的老驱动;而MID360以及后续的新设备,都必须使用livox_ros_driver2来对接ROS2。很多人上来就在ROS2环境里clone老驱动,编译到一半就报各种头文件缺失,根源就是SDK版本选错了。
从数据链路来看,雷达上电后会通过网口发送点云UDP包,默认IP一般是192.168.1.1。电脑需要把自己的网卡配置在同网段,比如192.168.1.50,这样才能收到数据。我见过有人把雷达直连到电脑上之后,一直去ping虚拟机的IP,却忽略了自己主机的物理网卡IP段,这就属于完全没有理解这条链路。
1.2 虚拟机方案适合谁、不适合谁
既然走的是以太网而不是USB直通,虚拟机方案就比我们想象中靠谱得多。USB直通的虚拟化兼容性差,但网络桥接是虚拟化软件最成熟的功能之一。只要虚拟网卡能以桥接模式挂到物理有线网卡上,虚拟机里的驱动就能收到来自物理网口的点云包。
适合用虚拟机跑MID360的典型场景是:主机是Windows,主要办公,另外想跑Ubuntu的ROS2环境来做算法验证;或者只想先看看点云效果,没有强实时要求;以及后续想做cartographer、nav2这类纯软件层面的SLAM调试。热词里经常见到“ros2 humble cartographer+nav2”,这正好是需要一套可复现虚拟化环境的方向。
不适合虚拟机的情况也有:如果对数据实时性要求极高,比如做实时运动控制闭环、对时间戳精度的毫秒抖动敏感,那就别用虚拟机,物理机装Ubuntu会省掉很多麻烦。另外,如果要在点云上跑深度学习模型,需要GPU加速的CUDA推理,虚拟机的显卡透传在普通笔记本上配置成本太高,也不建议走这条路。但只是点云输出和基本SLAM,虚拟机的性能绰绰有余。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:VMware里安装Ubuntu 22.04的几个关键选项
2.1 选用VMware Workstation而不是其他虚拟化工具
我习惯用VMware Workstation Pro,而不是某些轻量虚拟化工具,原因是在桥接物理网卡这件事上,VMware的“虚拟网络编辑器”更透明。你在里面能看到VMnet0对应哪张物理网卡,可以明确选择有线网卡还是Wi-Fi。而如果桥接对象选成Wi-Fi无线网卡,就算网络模式选对了,MID360的UDP包也大概率进不了虚拟机,因为无线网卡所在的二层网络和有线雷达之间根本不通。
2.2 创建虚拟机时容易被忽视的参数
创建虚拟机时,ISO镜像选择Ubuntu 22.04.3或更新的22.04版本。我这里给出一个经过实测的推荐配置,直接照着填即可:
| 配置项 | 推荐值 | 备注 |
|---|---|---|
| 操作系统版本 | Ubuntu 64位 | 不要选成Ubuntu 32位 |
| 处理器 | 4核心 | colcon编译驱动时明显吃CPU |
| 内存 | 8GB | 低于4GB会导致RViz2卡顿严重 |
| 硬盘 | 50GB以上 | 建议“将虚拟磁盘存储为单个文件” |
| 网络适配器 | 先选NAT,后续再增加桥接网卡 | 保证安装系统时能联网 |
| USB控制器 | USB 3.1 | 备用,虽然雷达不用USB |
还有一个特别容易踩的坑:如果创建完虚拟机后启动就报客户机操作系统已禁用cpu,或者一直卡在Ubuntu启动画面,优先检查电脑BIOS里是否开启了VT-x/AMD-V虚拟化。不开启的话,CPU指令集不支持,VMware根本无法正常启动64位客户机。这个问题在热词里出现频率很高,其实和Ubuntu本身没关系。
2.3 安装系统后第一件事:装好网络工具和虚拟机功能增强包
Ubuntu 22.04安装完成后,先做基础设置:
bash复制sudo apt update
sudo apt upgrade -y
sudo apt install -y open-vm-tools open-vm-tools-desktop net-tools iputils-ping curl vim git
open-vm-tools就是Ubuntu下的VMware Tools替代品,安装后虚拟机和宿主机之间的鼠标切换、屏幕分辨率自适应都会正常。net-tools带来ifconfig,iputils-ping提供ping,这些都是后面排查网络问题的基本工具。
安装完顺手看一下虚拟机网络是否能上网:
bash复制ping -c 4 baidu.com
如果安装系统时选择的是NAT网络,这一步通常没问题,先把基础系统环境准备好。
3. 安装ROS2 Humble,别绕路的官方流程
3.1 为什么要选Humble版本
ROS2的Humble是长期支持版本,支持周期比较长,而且目前很多主流功能包,比如Navigation2、Cartographer的ROS2版本,都对Humble适配得最完善。大疆的livox_ros_driver2也在Humble上有现成的launch示例,直接用这个版本可以省掉很多依赖冲突的麻烦。如果你后面要跑“cartographer+nav2”的组合,Humble基本是绕不开的稳定基础。
3.2 安装ROS2 Humble的完整命令
在Ubuntu 22.04里安装ROS2 Humble,我推荐走官方仓库的标准流程。前提是前面已经把系统更新过,并且能正常联网:
bash复制sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install curl -y
然后添加ROS2软件源并导入公钥:
bash复制sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
再次更新索引后,直接安装完整桌面版:
bash复制sudo apt update
sudo apt install -y ros-humble-desktop
桌面版包含了ROS2的核心库、常用消息类型、RViz2可视化工具和一堆demo节点,做点云显示完全够用。同时建议把colcon构建工具和管理依赖的rosdep也装好:
bash复制sudo apt install -y python3-colcon-common-extensions python3-rosdep
最后把ROS2环境写入bashrc,以后每次开终端就不用手动source了:
bash复制echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
3.3 装完后的基础验证
安装完先跑一个经典的talker和listener验证ROS2本身没问题。开第一个终端:
bash复制ros2 run demo_nodes_cpp talker
再开第二个终端:
bash复制ros2 run demo_nodes_py listener
如果两边的终端都在刷消息,说明ROS2的底层通信正常。这一步验证很值得做,因为如果ROS2本身没装好,后面排查MID360驱动问题时就会多一个干扰变量。跑通之后再关掉demo,进入下一步。
4. MID360驱动编译:从驱动仓库到colcon构建
4.1 找一个匹配的驱动版本
MID360使用的驱动是livox_ros_driver2,仓库地址在大疆Livox官方GitHub下。注意千万别clone成livox_ros_driver,那是SDK1的老驱动,和MID360的SDK2并不通用。很多网上教程把这两个混在一起,照着做的人编译时能过,但启动时就是找不到雷达。
建议直接clone最新主分支,因为对MID360的支持都已经合入主线了:
bash复制cd ~
mkdir -p livox_ws/src
cd livox_ws/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git
4.2 创建工作空间并编译
编译之前先确认依赖齐全:
bash复制sudo apt install -y python3-vcstool
然后回到工作空间根目录执行:
bash复制cd ~/livox_ws
colcon build --symlink-install
--symlink-install参数会让安装目录里的文件以软链接方式指向源码目录,这样后面修改config/config.json时,不需要重复colcon build就能直接生效。对反复调参的开发者来说,这个习惯非常省时间。
编译完成后:
bash复制source install/setup.bash
如果你想每次开终端都免去这一步,也可以写入bashrc:
bash复制echo "source ~/livox_ws/install/setup.bash" >> ~/.bashrc
但我的习惯是不写进bashrc,因为工作空间多了之后,不同项目之间的setup会互相覆盖。手动source更稳妥。
4.3 驱动包结构里必须知道的几个文件
编译完之后,驱动包结构里有三个区域需要熟悉:
config/目录,存放雷达配置JSON文件,驱动启动时会按这里面的参数找雷达。launch/目录,存放ROS2启动文件,里面有专门为MID360准备的launch脚本。sdk/目录,包含Livox SDK2源码,一般不用动。
尤其要注意config/config.json,这是驱动启动后读取的雷达列表配置。MID360在窗口中默认会读取对应配置,如果IP或雷达数量不对,驱动会反复提示连接超时。
5. 让雷达和虚拟机“通话”:网络与配置文件实战
5.1 桥接VS NAT:决定你能不能找到雷达
这是最核心的一步。当VMware的虚拟机网络设置选择NAT模式时,虚拟机是通过宿主机上的虚拟NAT网关访问外部网络的,虚拟机内部的IP地址属于VMware自己分配的虚拟子网,跟MID360所在的物理有线局域网不在同一个二层网络。雷达发出的UDP包到达物理网卡后,根本不会按NAT规则转发到虚拟机的虚拟网卡里。
所以必须用桥接模式。在VMware里,打开虚拟机设置,把网络适配器改为“桥接模式”,然后在“编辑 → 虚拟网络编辑器”里确认VMnet0桥接到了正确的物理网卡。这里有一个很多人踩过的坑:如果电脑同时有有线网卡和Wi-Fi,VMnet0默认可能桥接到Wi-Fi上。MID360明明插在有线网口,但虚拟机里的网卡却挂在无线网桥上,永远找不到雷达。
正确的做法是,在虚拟网络编辑器里,把VMnet0对应的物理网卡明确选择为那一个有线以太网适配器,比如Realtek PCIe GbE Family Controller或Intel Ethernet Connection。
5.2 给虚拟网卡一个静态IP
确认桥接网卡之后,需要在Ubuntu虚拟机里给这块虚拟网卡配置固定IP。雷达默认IP是192.168.1.1,为了和它通信,静态IP需要设置在同一个网段。
在Ubuntu 22.04里最简单的方式是用nmcli。先查看网卡名称:
bash复制nmcli con show
输出里会列出当前所有连接,比如“Wired connection 1”对应的是桥接的物理网卡。然后修改它的IP配置:
bash复制sudo nmcli con mod "Wired connection 1" ipv4.addresses 192.168.1.50/24
sudo nmcli con mod "Wired connection 1" ipv4.gateway 192.168.1.1
sudo nmcli con mod "Wired connection 1" ipv4.method manual
sudo nmcli con up "Wired connection 1"
我在这里有个实际经验分享:如果这台虚拟机同时还想着上外网安装软件包,桥接网卡和NAT网卡分开比较好。在VMware里可以给虚拟机加两块虚拟网卡,一块NAT用来上网,另一块桥接到有线物理网卡用来接雷达。否则你把唯一一张网卡配成192.168.1.50后,虚拟机可能就没法通过原来的路由器上网了。双网卡的方案从根上避免了这个冲突。
配置完成后,验证能不能ping通雷达:
bash复制ping -c 4 192.168.1.1
如果通了,说明二层链路已经建立。这时候哪怕驱动还没启动,也基本成功一半了。
5.3 修改config.json的关键字段
回到驱动源码目录,编辑~/livox_ws/src/livox_ros_driver2/config/config.json。不同版本的文件可能叫config.json或MID360_config.json,如果不确定,查看launch目录下launch脚本引用的配置文件名即可。典型的MID360配置内容如下:
json复制{
"lidar_config": [
{
"id": 0,
"ip": "192.168.1.1",
"cmd_ip": "192.168.1.1",
"enable": true,
"master": true
}
],
"pcl_config": {
"pcl_type": "PointXYZRTL",
"pcl_cfg": {
"kEnableFilter": true,
"kFilterConfig": {
"dual_return": true,
"high_sensitivity": false,
"narrow_lidar_return": 0
}
}
}
}
几个关键字段说明如下:
lidar_config是一个数组,你可以配置多台雷达。单台雷达就保留一个对象。ip改为你雷达实际的IP。默认出厂多为192.168.1.1,但如果你之前用Livox Viewer改过,这里要相应调整。enable设为true,表示这台雷达被驱动启用。master表示主雷达,多雷达组网时用它做标定基准,单台雷达直接设true。pcl_type建议保持PointXYZRTL,这是MID360最通用的点类型定义。dual_return双回波开启后点云量会更大,若测试时卡顿,可以先改为false。
如果雷达的IP被之前的配置改过,最简单的处理方式是用Windows下的Livox Viewer先恢复默认IP,再回到ROS2环境来连接。
6. 启动节点,在RViz里看到真实点云
6.1 启动驱动的标准命令
网络通、配置文件改好后,启动驱动:
bash复制cd ~/livox_ws
source install/setup.bash
ros2 launch livox_ros_driver2 rviz_MID360.launch.py
这个launch脚本会自动拉起驱动节点和RViz2。启动过程中留意终端输出。正常情况下会出现类似Connected to LiDAR 192.168.1.1或者lidar init success的提示,说明驱动与雷达握手成功。
如果不想直接打开RViz,只想先跑驱动节点,可以用另一个launch:
bash复制ros2 launch livox_ros_driver2 msg_MID360.launch.py
这种方式适合在服务器环境、没有图形界面时使用,点云主题依然会发布。
6.2 RViz显示配置
如果使用的launch没有自动打开RViz,或者你关掉了RViz想手动加,操作步骤如下:
- 新终端运行
rviz2。 - 在左侧
Global Options里把Fixed Frame设置为livox_frame。 - 点击左下角
Add,选择By topic。 - 找到
/livox/lidar这个PointCloud2主题,点击确认。 - 如果没有点云,检查一下
Size (m)和Style选项,通常Points风格下显示更直观。
livox_frame是驱动发布的话题坐标系。如果你希望点云显示在机器人底盘坐标系下,比如base_link,可以手动发布一个静态坐标变换:
bash复制ros2 run tf2_ros static_transform_publisher 0 0 0.3 0 0 0 base_link livox_frame
这行命令会把雷达坐标系放在底盘上方0.3米处,姿态一致。实际数值按你雷达安装位置调整。
6.3 如何判断点云数据真的“正常”
驱动起来未必代表点云就是正常的。我的判断习惯是分两步验证。
第一步,看话题频率:
bash复制ros2 topic hz /livox/lidar
MID360一般以10Hz左右发布点云。如果频率稳定在10Hz附近,说明数据流正常。
第二步,拿着雷达慢慢转一下,看RViz里的点云是否跟随变化。静止查看点云时,应该能看到天花板、墙壁等周围环境的轮廓;如果点云完全不动,可能只是显示缓冲问题,可以检查Topic的可靠性设置,或者重启RViz。如果启动后能稳定看到环境轮廓,并且随着雷达移动点云实时变化,这套虚拟机环境就彻底跑通了。
7. 踩坑记录:虚拟机跑MID360的典型故障与排查思路
7.1 ping不通雷达时的排查链路
这是遇到最多的问题。最典型的场景是:雷达上电,网线直连电脑,驱动启动后一直报Timeout。我的排查顺序是这样的:
先看物理层,确认网线插紧、雷达供电正常。MID360的供电不是通过网线POE供电,需要单独接电源线,电压10V到24V之间。很多人忽略了这一条,雷达没上电还以为是驱动问题。
再看虚拟机网络配置。检查Vmware虚拟网络编辑器里VMnet0到底桥接的是哪张物理网卡,千万不要是Wi-Fi。然后进Ubuntu终端执行ip add,确认桥接网卡的IP是不是192.168.1.x。如果还是自动获取的IP,就手动改成前面说的静态IP。
最后ping雷达:
bash复制ping -c 4 192.168.1.1
如果ping不通,可以关掉Ubuntu的防火墙试一下,虽然Ubuntu桌面版默认不启用ufw,但排查链路时顺手排除掉没坏处。还不行就在同一台物理机上换一根网线,或者换个路由器/交换机口。交叉验证一下,问题多半就定位了。
7.2 有话题没点云的几种原因
驱动节点已经启动,ros2 topic list里也看得到/livox/lidar,但RViz里什么都没有。这种情况和网络无关,重点检查三个方面。
第一,检查RViz的Fixed Frame。如果不设成livox_frame,而默认是map或base_link,驱动又没有发布对应的TF,RViz会报No transform from ... to ...或者直接空白。
第二,确认订阅的是正确的主题。MID360点云主题名一般是/livox/lidar,但有些版本可能发布在/livox/points。用ros2 topic list和ros2 topic info查看实际名称最保险。
第三,确认消息类型。在RViz里添加显示时,如果选错PointCloud2消息类型,也会不显示。ros2 topic type /livox/lidar查看类型,如果返回sensor_msgs/msg/PointCloud2就说明没问题。
7.3 虚拟机性能导致的点云卡顿
虚拟机跑RViz2,如果还开着网页、IDE,内存只有4GB,点云显示会卡到怀疑人生。优化方案有几种:
- 虚拟机内存提升到8GB以上,处理器至少4核。
- 关闭Ubuntu的桌面特效,可以在“设置 → 外观”里切换为性能优先。
- RViz2中不要同时显示太多其他有用的消息,点云的
Point Size不要开太大。 - 如果只是想验证数据,而不需要视觉效果,建议关闭RViz,只用
ros2 topic hz测频率,再用ros2 bag record /livox/lidar录制点云数据包,后续离线分析。这样既省资源又方便复现问题。
另外,如果虚拟机装在笔记本上,要留意Windows电源管理是否会把有线网卡自动关闭。这个问题不明显,我之前遇到过,雷达一直掉线,后来发现是Windows为了省电把物理网卡休眠了。
7.4 电源和线路:最容易忽略的物理层问题
最后这条和经验无关,纯粹是物理层问题。MID360的供电模块如果电流不够,会出现“雷达前面还正常,转两分钟就断连”的现象。建议用雷达原装电源,或者选择12V/2A以上且纹波较小的开关电源。
还有一点关于接线方式:雷达和电脑之间如果用路由器或交换机中转,这是没问题的;如果是网线直连,记得雷达和电脑的网口都是千兆自适应,网线建议用CAT5e以上。别用一根又长又折的旧网线去排障,我见过太多“软件没错、硬件没错、最后是网线接触不良”的案例。
配置完这一整套流程之后,你在虚拟机里获得的不只是一个可显示的PointCloud2话题,更是一套可以反复用来做集成测试的ROS2环境。后面接cartographer建图、接nav2导航路径规划,都不用再回到Windows折腾环境了。建议把这一步的虚拟机做一次快照,以后驱动或系统搞坏了,一分钟就能恢复到当前这个稳定状态。
