搞3D激光雷达的朋友,应该都有过这种体验:费了半天劲把雷达驱动跑起来,点云在Rviz里也刷得飞起,结果真要拿去跑SLAM或者导航的时候,才发现手头没有一份能用的数据包。要么是现场环境太乱没法录,要么就是录的时候话题没选对,回头一看包里全是空话题。我最早折腾MID360的时候,就吃过这个亏,所以今天这篇东西,我就把从驱动配置到录制bag包,再到回放验证的完整流程,一次性说清楚。
这篇内容更适合准备做nav2导航、3D SLAM建图,或者想用MID360做算法验证的朋友参考。不管你是刚把雷达拿到手,还是已经被驱动折磨了一晚上,按照下面这套流程走,基本能少踩一半的坑。
1. MID360这块雷达,到底特殊在哪
1.1 为什么导航方案开始偏向3D雷达
很多做机器人的朋友,一开始用的是单线激光雷达,也就是2D雷达。2D雷达便宜、驱动成熟、建图算法也稳定,但问题在于它只能看到一个平面。地面稍微有点坡、车身稍微有点颠簸,或者货架底部有个悬空的横梁,2D雷达就“瞎”了。这两年机器人从室内往室外、从平地往复杂地形走,3D雷达的需求一下子就上来了。
3D雷达能提供几十万个空间点,能把障碍物的轮廓、高度、悬空物体这些信息全都带出来,配合上相应的SLAM算法,建出来的地图是带高度信息的,导航决策自然会聪明很多。而且现在的3D雷达价格也降了不少,已经不是动辄几十万的“贵族传感器”了。
1.2 MID360的硬件特点和核心参数
MID360是Livox(览沃)推出的一款非重复扫描式的3D激光雷达,它的结构设计很有意思,没有传统的机械旋转外壳,靠的是内部棱镜的摆动加旋转来改变激光的出射方向。这种设计的优势是体积小、重量轻,而且抗震性能好,用在移动机器人上很合适。
几个关键参数,我直接列出来:
- 测距范围:40米(在10%反射率的物体上),对于室内导航和大部分园区场景来说,完全够用。
- 视场角:水平360度,垂直方向59度,其中上仰52度、下俯7度。这个垂直视场角比很多同类产品要大,能更好地感知高处和近处地面。
- 盲区:约0.1米,几乎可以忽略不计,贴在雷达正下方的物体也能扫到。
- 点频:20万点/秒,点云密度在非重复扫描雷达里算不错的。
- 内置IMU:这个是亮点,雷达自带一个IMU,可以输出高频的角速度和加速度数据,做LIO类的SLAM算法时不需要再额外挂一个IMU,省了不少事。
需要特别说明的是,MID360是非重复扫描方式,它的扫描轨迹不会像机械雷达那样固定。0.1秒内它能把整个视场扫一遍,但点云分布是随时间累积变化的,时间越长覆盖越密。这就意味着,录制bag包时,话题的时间戳和点云本身的完整性非常重要,这些细节我后面会展开讲。
2. 录制bag包前的软硬件准备
2.1 硬件连接和IP规划
先说连接方式。MID360的默认接口是百兆以太网口,需要一根网线直连工控机,或者通过交换机接入局域网。它默认的IP是192.168.1.160,子网掩码255.255.255.0,工控机的网卡IP需要手动配成192.168.1.x网段,比如192.168.1.5。
这里有个容易出问题的地方:如果你只有一根网线直连,工控机这个网口的IP必须手动配,不能依赖DHCP自动获取,否则根本找不到雷达。而且这个网口因为要跑点云数据,尽量不要同时承担上网功能,带宽和路由上都有干扰,实测下来很容易掉线。
供电方面也要注意,MID360支持宽压输入,但建议使用稳定供电,不要用那种输出纹波很大的开关电源,点云数据出现跳变往往就是供电不稳定造成的。我开始用笔记本USB口转出来的5V供电试过,点云偶尔会丢帧,后来换了个12V稳压模块,问题就消失了。
2.2 ROS环境安装:新手建议直接用一键脚本
MID360的SDK和驱动封装在ROS里,所以得先有一个能用的ROS环境。很多人卡在ROS安装这一步,尤其是Ubuntu版本和ROS版本对应关系搞不清楚。我的建议是,新装系统的话直接选Ubuntu 20.04配ROS Noetic,这是目前资料最多、坑最少的组合。Ubuntu 18.04配Melodic也完全可以,但部分新版本的驱动和第三方SLAM包已经不再支持Melodic了,没必要逆着生态走。
ROS安装这件事,在中文社区里“鱼香ROS”一键安装脚本用得很多。它在服务器选择、软件源替换、rosdep初始化这些环节做了自动化处理,对新手来说确实能省不少时间。脚本拉下来之后,按提示选择对应版本和桌面版或基础版,整个安装过程大概十几分钟。对于已经装好ROS的朋友,这部分直接跳过就行。
装了ROS之后,记得先跑一下rosdep update,再验证一下roscore能不能正常启动。如果roscore起不来,最常见的原因是环境变量没生效,或者另一个ROS进程占用着端口,终端里先执行一下source /opt/ros/noetic/setup.bash看看。
2.3 驱动版本怎么选
Livox官方的ROS驱动有livox_ros_driver和livox_ros_driver2两个系列。老版本的livox_ros_driver对MID360的支持不完整,强烈建议直接用livox_ros_driver2。这个驱动同时支持ROS1和ROS2,而且代码结构更清晰,MID360的相关参数也都做了适配。
驱动获取方式我推荐从GitHub上Livox-SDK/livox_ros_driver2仓库拉取,然后按官方说明编译。编译依赖的livox_sdk2是作为子模块一起拉取的,所以克隆的时候记得加上--recursive参数。编译出现缺包的错误,基本都是缺ros-noetic-catkin、ros-noetic-roscpp这类依赖,缺什么装什么就行。
3. 驱动配置与雷达联调
3.1 编译并配置livox_ros_driver2
驱动编译其实很简单,但有一个关键点,就是你得知道你后面要用的SLAM框架或者导航框架,它们是基于ROS1还是ROS2。如果暂时不确定,先用ROS1 Noetic跑通就行,后面再换ROS2也不冲突。编译命令我以ROS1为例:
mkdir -p ~/mid360_ws/src cd ~/mid360_ws/src git clone --recursive https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/mid360_ws catkin_make source devel/setup.bash编译过程中如果报错找不到livox_sdk2,百分百是因为克隆时没加--recursive,子模块没拉下来。这时候可以在livox_ros_driver2目录下手动执行:
git submodule update --init --recursive然后再重新编译。
驱动编译后,在config/目录下有一个mid360_config.json文件,这是MID360的配置文件,核心配置项是host_ip和pcl_data_type。host_ip要填工控机网卡的IP地址,也就是刚才配的那个192.168.1.5。pcl_data_type建议填1,表示输出PointCloud2格式,这样在Rviz里可以直接显示,后续做点云转激光数据也方便。
3.2 启动雷达,在Rviz里看到点云
配置完成后,启动驱动:
roslaunch livox_ros_driver2 msg_MID360.launch正常启动后,终端会打印雷达的SN、固件版本和点云输出状态。如果卡在Waiting for UDP data...,说明雷达和主机之间的网络没通,先ping一下192.168.1.160,不通就回到网卡IP配置去排查。
点云数据的话题名是/livox/lidar,IMU数据的话题名是/livox/imu。在Rviz里添加PointCloud2显示,Fixed Frame改成livox_frame,这时应该就能看到雷达周围环境的三维点云了。转动雷达或者摆动雷达,点云会跟着变,说明联调成功。
这里有个经验要分享:如果你是在室内录制,建议把雷达放在一个相对空旷的位置,四周2米内不要有太多反光物体。MID360对黑色物体和镜面物体的探测能力很弱,黑色吸光、镜面镜面反射,都会造成点云空洞。这不是雷达坏了,是物理特性决定的,录制数据时尽量考虑进去。
3.3 IMU数据要不要录
MID360内置IMU输出的/livox/imu话题,频率在200Hz左右,做LIO-SAM、FAST-LIO这类算法时,IMU数据是必须的。即便你暂时只打算跑LOAM或者复现点云配准,我也建议把IMU话题一并录进去。bag包比实时数据多了IMU,将来算法的选择空间就大很多,而且IMU这种传感器数据,录制的时候也不会额外占用多少空间。
需要说明的是,MID360的IMU和雷达的时钟是同步的,时间戳做的很好,这也算是它内置IMU的一个优势。做算法的人都知道,外置IMU和雷达之间如果时间没对齐,跑LIO类算法一定会飘,MID360天然就没有这个问题。
4. 录制bag包的完整流程
4.1 录制前的三个检查
录制之前,我一般会做三个检查,全部通过才开始正式录。
第一,重新确认雷达稳定运行了至少3分钟。刚上电的时候,雷达内部的器件需要一个热稳定过程,前几分钟的点云可能会有轻微漂移,如果这个阶段录了数据,后面做标定会有麻烦。第二,在Rviz里反复查看点云是否连续、地面是否平整,有没有大量跳变点。第三,确认所有需要用的话题都已经稳定发布,用下面命令查看一下:
rostopic list rostopic hz /livox/lidar rostopic hz /livox/imu/livox/lidar的频率应该稳定在10Hz附近,/livox/imu的频率应该在200Hz左右。如果hz值大幅度波动,说明网络传输不稳定,优先排查网线和供电。
4.2 执行rosbag record
录制命令我这样写:
mkdir -p ~/bag_files cd ~/bag_files rosbag record /livox/lidar /livox/imu -O mid360_test.bag-O参数的意思是把bag包命名为mid360_test.bag,这样比默认生成的带时间戳文件名更好认。录制过程中,终端会实时显示每条话题的消息数、包大小和总时长。如果消息数长时间不变,大概率是话题没对上。
如果你后续想基于这个bag做nav2导航仿真,也可以顺便把TF相关的topic录进去。比如你有一个简单的雷达基座到雷达的坐标变换,tf_static话题建议一起录。不过如果是纯数据采集,后面回放时再发布TF也来得及,不一定非要在录制阶段就带上。
关于录制时长,我的建议是每次录制至少连续跑5分钟。太短的数据包没有统计意义,点云分布也未必完整;太长的话,bag包体积会非常大,MID360每秒的点云数据量在3MB左右,加上IMU数据,10分钟大概2GB,后期处理时会有点压力。5到10分钟是一个比较合理的区间。
4.3 回放验证bag包
录完以后,我习惯第一时间回放查看,而不是直接拷走。回放的好处是能发现录制过程中没察觉的问题,比如丢帧、时间戳跳变、点云断层。回放命令如下:
rosbag info mid360_test.bag rosbag play mid360_test.bag --clockrosbag info会打印bag包的话题、时长、消息数。这个阶段看一下消息数是否与录制时长匹配。比如录制600秒,/livox/lidar话题应该大约有6000帧消息,误差不能太大。
回放的同时,另开一个终端打开Rviz,用完全相同的方式显示PointCloud2点云。回放的点云应该和实时点云表现一致。如果回放时发现点云断断续续,但实时显示正常,通常说明录制时雷达掉过线,或者系统负载过高导致丢帧。这种bag包建议直接删除重新录,不是靠后期能修回来的。
还有一个小技巧:回放的时候可以加--clock参数,让ROS系统时间跟着bag包的时间走。这样如果你后面要用rosbag play + 外接其他节点的方式做联合测试,各节点之间的时间基准是统一的,不会出现时间戳乱掉的问题。
5. 录完bag之后:坐标、频率和后续用法
5.1 坐标系设置
MID360驱动默认发布的点云,坐标是定义在livox_frame下的。这个坐标系的原点在雷达的几何中心,X轴指向雷达前方(对应雷达外壳上的箭头方向),Y轴向左,Z轴向上,符合右手坐标系。
如果你需要把点云转到机器人的base_link坐标系,就要额外发布一个livox_frame到base_link的静态坐标变换,也就是TF。这里要特别谨慎,很多人录数据的时候没有固定好雷达安装位置和姿态,或者安装角度是歪的,又没有记录,后面做算法时坐标系怎么都对不上。我的建议是,在录制前就把雷达安装固定好,测量好相对车体中心的位置和角度,直接用静态TF发布,不要指望靠算法自动标定来解决安装偏差。
5.2 bag包如何用于SLAM建图和导航
有了bag包,后续处理基本上有两类路径。
一类是复现纯建图算法,比如LIO-SAM、FAST-LIO、Point-LIO。这些算法接收/livox/lidar和/livox/imu两个话题,正好对应我们录制的话题。回放bag包,同时启动算法节点,就能离线重建出三维点云地图和机器人的运动轨迹。这种离线复现的好处是可控性好,参数调整可以一版一版地迭代,不会因为现场数据不再而无法验证。
另一类是用在nav2导航上。nav2本身吃的是2D激光数据,所以需要用pointcloud_to_laserscan这类工具把3D点云投影成2D激光,再喂给nav2的代价地图。MID360的垂直视场角大,投影出来的2D激光范围比单线雷达宽,但也要注意投影高度区间的选择。如果投影区间取得太高,会把货架顶层也判定为障碍物,导致机器人不敢靠近货架;取得太低,又会漏掉地面上的小障碍物。这个高度区间需要根据自己的机器人底盘和通过性去实验,没有一劳永逸的参数。
5.3 录制数据的预处理
录完的bag如果需要长期保存,建议先做一个轻量级预处理,把IMU话题的异常数据过滤掉,把点云的离群点做一次滤波。其实这一步在算法里面通常会做,但如果数据集是给别人用的,提前处理好能省去对方很多麻烦。
工具上可以直接用ROS自带的PCL滤波器节点,也可以用Livox提供的livox_point_cloud_process工具,操作起来都不复杂。不过我必须提醒一句:预处理只改点云的“质量”,不能改点云的“原始坐标”。一旦做了滤波、降采样、去畸变这类操作,点云数据就不能再当作原始传感器数据用于所有算法了。所以,最原始的bag包一定要备份一份,后续所有处理都在副本上进行,这是底线。
6. 实操中高频出现的坑,汇总排查
6.1 雷达找不到,ping不通设备IP
这个问题的比重最高。先检查网线是否插紧,再检查工控机网口IP是否为静态IP,并且和雷达IP在同一个网段。很多工控机有多个网口,容易搞混。我用ifconfig查当前活动网口的IP地址,确认是192.168.1.5之后就排除了这个问题。还有一个细节,有些交换机端口是关闭自动协商的,如果你用了交换机连接而不是直连,可以换一个端口试试。
6.2 点云有大量跳变噪点
先观察噪点出现的位置。如果只是在某些角度固定出现,大概率是被旁边反射物体干扰;如果是随机跳变,优先怀疑供电。我遇到过一台工控机的USB口供电不稳,雷达离得又远,网线太长信号衰减,点云噪点非常多。后来把供电改为独立12V2A电源,问题就解决了。另外,网线质量也很重要,不建议用超过10米的普通网线,最好使用带屏蔽的工业网线。
6.3 rosbag play时TF确实发布时间不对
如果回放bag包时,发现点云显示位置不对或者Rviz里坐标系报错,多半是bag包里的TF话题和当前环境的TF冲突了。处理办法是在回放时把/tf和/tf_static话题过滤掉,只在bag里播放雷达和IMU数据,然后用一个专门的节点发布静态TF。这个习惯建议从一开始就养成,特别是做多传感器融合测试的时候。
6.4 录制和回放常用命令速查
我整理了一张表,把录包过程中最高频用到的命令放在一起,方便你现场参考。
| 用途 | 命令 |
|---|---|
| 查看当前活跃话题列表 | rostopic list |
| 查看点云话题发布频率 | rostopic hz /livox/lidar |
| 查看IMU话题发布频率 | rostopic hz /livox/imu |
| 启动MID360驱动 | roslaunch livox_ros_driver2 msg_MID360.launch |
| 查看网络端口与IP | ifconfig |
| 查看雷达设备IP连通性 | ping 192.168.1.160 |
| 录制bag包 | rosbag record /livox/lidar /livox/imu -O xxx.bag |
| 查看bag包信息 | rosbag info xxx.bag |
| 回放bag包 | rosbag play --clock xxx.bag |
| 仅回放指定话题 | rosbag play xxx.bag --topic /livox/lidar |
这张表省去你临时翻文档的时间,建议直接存下来。
7. 录包之外的一点心得
说到最后,我特别想强调一个观念。很多人觉得,录制bag包嘛,一句rosbag record就完了。但真正做过几轮SLAM和导航算法验证的人都明白,数据包的质量决定了算法调试的效率。一份时间戳平稳、坐标清晰、无丢帧的数据包,能让你在同一个数据集上快速对比好几套参数,这种迭代速度是现场实测给不了的。
我自己的习惯是,拿到的每一批bag包,会在第一时间用rosbag info拉出基本信息,然后回放一遍,把回放过程中Rviz的截图存档。这些元信息虽然不起眼,但等三个月后再回头找数据,你会发现当初花两分钟做的记录,能帮你省下两个小时找数据。
后续如果想把这套数据接入nav2导航,最顺的路径是先把点云投影成2D激光,再跑一下Nav2的事先配置,看看代价地图能否正确感知地面和悬空物。如果测试中发现雷达的安装高度、俯仰角对投影结果影响明显,不要怕反复调整,MID360小巧轻便,拆装非常方便,这个优势在实际调试中会被不断放大。