M360 的点云数据,跟你想的不一样 拿到 M360 的第一周,我们写了一套 ROS2 的驱动包,直接跑 Livox 官方的 SDK,点云出来之后发现跟预想的不太一样。 M360 用的是非重复扫描(转镜式),跟传统机械式雷达的均匀扫描模式完全不同。这个区别看起来只是"扫出来的图案不一样",但实际上会影响很多下游算法。 非重复扫描是什么意思 传统机械式雷达的扫描线是固定的——16线雷达就有16条固定的水平线,每一帧扫出来的点云都是同样的16条线,只不过线上点的位置随着障碍物远近变化。 M360 的非重复扫描不是这样。它的转镜在不停旋转,每一帧扫出来的图案都跟上一帧不一样。随着时间的推移,扫描图案会逐渐覆盖整个 FOV 区域,最终形成一张"花朵状"的点云图。 好处是:不需要很高的线数就能实现高密度的 3D 覆盖。M360 只有 1 个激光发射器(不算双回波的第二通道),但经过一段时间的积累,点云密度可以接近甚至超过 16 线机械式雷达。 坏处是:单帧的点云覆盖不均匀。某一帧可能上半部分密、下半部分稀疏,下一帧又反过来。如果下游算法依赖"每一帧都是完整的 3D 覆盖",就会出问题。 哪些算法会受影响 实时避障。 如果避障算法只看当前帧的点云,非重复扫描可能导致某一帧里某个方向上的点很少,障碍物被"漏看"。比如前方有一个障碍物,但当前帧恰好那个角度的扫描线还没有扫到,算法就认为前方安全。 解决方案有两个:一是用时间窗口累积多帧点云再做避障判断(比如最近 100ms 的所有点云叠加),二是用预测模型根据上一帧的信息估计当前帧的覆盖情况。 我们实际用的是方案一,100ms 的时间窗口。200kHz 的点频在 100ms 内能累积 20000 个点,足够做避障判断了。延迟 100ms 对于 1m/s 的移动速度来说,只多了 10cm 的刹车距离,可以接受。 SLAM 建图。 大部分主流 SLAM 算法(FAST-LIO2、LIO-SAM、Point-LIO)对非重复扫描都有很好的支持。这些算法本身就用 IMU 做运动补偿,多帧累积是它们的常规操作。 我们用 FAST-LIO2 配合 M360 跑过多次,建图效果很好。非重复扫描的高密度点云反而让建图更精细——传统 16 线雷达在垂直方向上只有 16 层点,中间的缝隙很大;M360 的非重复扫描经过累积之后,垂直方向上的点分布更均匀、更密。 不过有一点要注意:FAST-LIO2 对点频敏感。M360 输出 200kHz,如果处理器性能不够,可能处理不过来。我们实测在 Jetson Orin Nano 上跑 FAST-LIO2 + M360,CPU 占用率大概 60~70%,还能跑其他算法。在树莓派 4 上就有点吃力了,CPU 基本跑满。 点云数据的实际格式 M360 通过以太网输出点云数据,默认使用 Livox 自定义的协议,也可以配置为标准的 PTP(Precision Time Protocol)时间同步。 官方 SDK(livox_sdk2)可以把原始数据转换成 ROS2 的 PointCloud2 格式,也可以转成 PCD 文件用于离线处理。 有一个细节容易踩坑:M360 输出的点云坐标是雷达本体坐标系,原点在雷达的光学中心。如果你把雷达倒着装(光学中心朝下),需要在驱动里做一个坐标变换,不然点云的 Z 轴是反的。 另一个细节:双回波模式下,每个激光脉冲会产生两个点(第一回波和第二回波),点频会翻倍。200kHz 在双回波模式下实际上每秒输出 400k 个点。如果下游算法没有做好处理,可能会因为数据量突增而卡顿。 我们遇到过一次,开着双回波跑 FAST-LIO2,突然开始丢帧。排查了半天发现是双回波模式下点云数据量翻倍,Jetson 的内存带宽不够。关掉双回波就好了,后来调整了算法的内存分配策略才解决。 200kHz 的点频意味着什么 200kHz = 每秒 200,000 个点。这是什么概念? 一台 16 线机械式雷达,转速 10Hz,每线 1800 个点(水平 0.2° 分辨率),总点频 = 16 × 1800 × 10 = 288kHz。所以 M360 的 200kHz 大概相当于一台 11~12 线的机械式雷达。 但这是"等效"比较。实际上非重复扫描的 200kHz 在经过时间累积之后,有效点密度比 12 线机械式雷达更高——因为 12 线雷达的垂直方向上永远只有 12 层点,而 M360 的垂直方向上随着时间推移会越来越密。 一个实际的数据:在 3m 距离处,M360 经过 1 秒的累积,垂直方向上的点间距大约 2~3cm。12 线机械式雷达(垂直分辨率 2°)在 3m 处的垂直点间距大约 10cm。差距还是很明显的。 ROS2 驱动搭建的几个坑 1. 网络配置。 M360 默认 IP 是 192.168.1.1xx,需要把电脑/工控机的网卡配到同一个网段。很多人第一次连接时 ping 不通,就是因为网卡不在同一网段。 2. 防火墙。 M360 用的是 UDP 协议传输点云数据,端口 56000。如果系统防火墙开了,可能会把 UDP 包挡掉,导致收不到点云。 3. 时间同步。 M360 支持 PTP(IEEE 1588),但需要网卡和交换机都支持 PTP。如果用普通的网卡和交换机,PTP 精度大概在毫秒级,做 SLAM 建图勉强够用。如果需要微秒级的时间同步(比如多雷达融合),需要用支持 PTP 硬件时间戳的网卡。 4. 双回波的点云处理。 开双回波之后,ROS2 驱动会为每个脉冲输出两个点。这两个点有相同的水平角和垂直角,但距离不同(第一回波是近处的物体,第二回波是远处的物体)。在点云可视化工具里,这两个点看起来像是同一个方向上的两个"层"。 如果你的算法不理解双回波的语义,可能会把第二回波的点当成独立的障碍物。处理方法是在驱动层或者算法层做过滤——比如只保留第一回波的点(如果不需要穿透能力),或者根据应用场景做选择性保留。 一个实用的调试技巧 如果你刚拿到 M360,不确定点云数据是不是正常的,可以用 livox_viewer2 工具看一下。这是 Livox 官方的可视化工具,不需要安装 ROS,直接运行就行。 打开 livoviewer2,输入雷达 IP,能看到实时点云。正常的 M360 点云应该呈现花朵状的扫描图案,随着时间的推移逐渐变密。如果看到的点云很稀疏或者只有一条线,检查网络连接和驱动配置。 另外一个快速判断点云质量的方法:对着平整的白墙(或者任何大面积的平面)扫描,看点云是不是形成一条平滑的直线。如果直线有明显弯曲或锯齿,可能是时间同步有问题,或者雷达安装不牢固(有振动)。 以上基于实际开发经验,M360 参数以坦途智行官方为准。不同 ROS2 版本和硬件平台下的表现可能有差异。