☰
Livox MID360激光雷达高速避障无人机实战:从硬件选型到算法部署
2026/9/29 2:26:18 网站建设 项目流程

1. 为什么偏偏是Livox MID360配高速避障无人机

1.1 从一次炸机说起:高速避障到底难在哪

我最早做避障无人机用的是超声波加双目视觉的方案,悬停状态下避障效果还行,一旦速度拉到8m/s以上,问题就全暴露出来了。双目视觉在高速运动时视差计算跟不上,图像模糊导致深度估计直接崩掉;超声波探测角度太窄,高速飞行时根本来不及反应。后来换过机械式激光雷达,效果是好了一些,但那个体积和重量对无人机来说太不友好了,而且机械旋转部件在振动环境下寿命堪忧。

高速避障的核心矛盾在于:速度越快,单位时间内需要处理的环境信息量就越大,留给感知和决策的时间窗口就越小。20m/s意味着每秒移动20米,如果避障系统需要0.5秒的反应时间,那有效探测距离至少要到10米以上才来得及做机动。这就对传感器的探测距离、视场角、数据刷新率和重量功耗同时提出了苛刻要求。

Livox MID360恰好卡在了这个需求点上。它是一款非重复扫描的固态激光雷达,水平视场角360度,垂直视场角59度,探测距离在反射率80%目标下可达70米,10%反射率下也有40米。最关键的是重量只有265克,功耗不到10瓦,这对续航本就紧张的无人机来说太重要了。非重复扫描的特性意味着它不是像传统机械雷达那样固定扫几条线,而是通过花瓣式扫描轨迹逐渐填满整个视场,时间积分后点云密度更高,对细小障碍物的检出率更好。

1.2 非重复扫描到底强在哪:和传统机械雷达的对比

很多人第一次接触MID360会疑惑:为什么它的点云看起来不像机械雷达那样是一圈一圈的线?这恰恰是它的核心优势。传统机械式激光雷达比如16线、32线的产品,每一帧就是固定角度上的几条扫描线,线之间的盲区只能靠多帧累积来弥补。而MID360的非重复扫描模式,每一帧的扫描轨迹都不重复,多帧叠加后点云会越来越密。

我用过一个很直观的类比:机械雷达像用梳子梳头,齿与齿之间总有漏掉的头发;MID360像用一把刷毛很密的刷子反复刷,每次刷的路径不同,刷几次之后基本没有遗漏。这个特性在避障场景下特别有价值,因为高速飞行时你不可能靠多帧累积来补盲区,单帧的点云覆盖度直接决定了能不能及时看到障碍物。

对比维度传统机械式激光雷达Livox MID360
扫描方式固定线束旋转非重复花瓣式扫描
单帧盲区线间存在固定盲区无固定盲区,多帧填充
重量通常500g以上265g
运动部件有,易磨损无,全固态
探测距离取决于线数和功率70m@80%反射率
价格区间较高相对亲民

1.3 20m/s这个速度意味着什么

20m/s大约是72km/h,这个速度在城市道路开车已经不算慢了。对于一架轴距几百毫米的无人机来说,这个速度下的动力学响应非常敏感。我实测过,在20m/s速度下做一个30度倾角的避让机动,横向过载会达到1.5g以上,如果飞控参数没调好,很容易出现震荡甚至失稳。

所以这套系统的设计不能只考虑感知,还要把飞控的响应能力、机架的刚性、电机的推力冗余一起纳入考量。我见过不少人雷达装上了、算法跑通了,但一飞高速就翻车,问题往往出在飞控参数和动力系统上,而不是感知本身。这也是为什么我在后面的章节里会花不少篇幅讲飞控调参和动力配置,这些和雷达选型同等重要。

2. 硬件选型与系统架构设计

2.1 机架与动力系统:20m/s的硬件底线

要跑到20m/s,机架的气动设计很关键。我用的是5寸穿越机机架改装的测试平台,轴距220mm,碳纤维板厚度4mm。为什么不用更大的机架?因为大机架阻力大,而且惯性大导致机动响应慢。5寸这个级别在速度和机动性之间平衡得比较好,市面上配件也丰富。

电机选型上,我最终用的是2806.5规格的无刷电机,KV值1700,配5.1寸三叶桨。这个组合在6S电池下单电机最大推力约1.8kg,四轴总推力7.2kg,而整机起飞重量控制在1.6kg左右,推重比超过4:1。为什么要这么高的推重比?因为高速避障时需要快速改变姿态,推重比不够的话机动做不出来。我试过推重比3:1的配置,在15m/s以上做紧急避让时明显感觉力不从心。

电调选用的是四合一电调,持续电流55A,支持DShot600协议。DShot数字协议比传统的PWM协议响应更快,在高速飞行时油门响应延迟能低不少。电池用的是6S 1300mAh锂聚合物电池,放电倍率100C,续航大概在6到8分钟,具体取决于飞行风格。高速飞行时续航会明显缩短,这是没办法的事,能量守恒摆在那里。

2.2 飞控与计算平台:算力要够用

飞控我选的是Pixhawk 6C,跑PX4固件。选它的原因一是生态成熟,和ROS2的桥接方案很完善;二是它的IMU减震设计不错,高速飞行时振动对IMU的影响很大,减震做不好姿态估计会飘。飞控固件版本我用的PX4 1.14,这个版本对外部定位信息的融合处理比较稳定。

机载计算平台用的是Jetson Orin NX 16GB版本,功耗控制在15W左右。为什么不用树莓派?因为MID360的点云数据量不小,单帧大约24000个点,10Hz刷新率下每秒24万个点,树莓派的算力跑建图和避障算法会非常吃力。Orin NX的GPU可以用来加速点云处理,跑一些轻量级的神经网络也没问题。

计算平台和飞控之间通过串口连接,走MAVLink协议。这里有个细节要注意:串口波特率要设到921600,不然高速飞行时姿态数据和避障指令的传输会有延迟。我一开始用的57600,结果避障指令发出去到飞控执行有将近100ms的延迟,20m/s速度下这就是2米的位移,足够撞上障碍物了。

2.3 供电与布线:容易被忽视的细节

MID360的供电范围是9到27V,我直接从6S电池通过分电板取24V给它供电。这里要特别注意:激光雷达对电源纹波比较敏感,如果和电机共用一路电源,电机加减速时产生的电压波动可能会影响雷达工作。我的做法是给雷达单独加一个LC滤波电路,电感和电容的参数分别是100uH和470uF,实测下来点云稳定性有明显改善。

布线方面,MID360的数据接口是百兆以太网,我用的是带屏蔽层的超六类网线,长度控制在30cm以内。为什么要这么短?因为以太网线太长的话,在电机和电调产生的电磁干扰下容易丢包。我试过用1米长的普通网线,点云偶尔会出现整帧丢失的情况,换成短屏蔽线之后就再没出现过。

3. 软件环境搭建与雷达配置

3.1 Ubuntu和ROS2环境准备

机载电脑上装的是Ubuntu 22.04,对应ROS2 Humble版本。为什么不装更新的版本?因为Livox的ROS2驱动在Humble上测试最充分,社区里遇到的问题也最少,踩坑成本低。安装ROS2的时候记得选ros-humble-desktop版本,后面跑RViz2可视化点云需要用到。

装完系统后先做几件事:把CPU调度策略改成performance模式,关闭不必要后台服务,把串口和网口的IRQ中断绑定到特定CPU核心上。这些优化看起来琐碎,但在资源紧张的机载环境里,每一点性能提升都很重要。我实测过,光是把CPU调度改成performance模式,点云处理帧率就提升了大概15%。

3.2 Livox SDK和ROS2驱动的编译安装

Livox官方提供了Livox-SDK2和livox_ros_driver2两个仓库。编译顺序不能搞反,必须先装SDK再装ROS驱动。SDK的编译很标准,cmake加make就行。ROS驱动编译的时候要注意,它默认是给ROS1用的,编译ROS2版本需要指定对应的分支或者用colcon build。

# 安装Livox-SDK2 git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build && cd build cmake .. && make -j$(nproc) sudo make install # 编译ROS2驱动 mkdir -p ~/ws_livox/src cd ~/ws_livox/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd .. colcon build --symlink-install

编译过程中如果报找不到livox_sdk2的错,检查一下/usr/local/lib有没有在ldconfig的搜索路径里。我遇到过这个问题,解决办法是在/etc/ld.so.conf.d/下新建一个conf文件,把/usr/local/lib写进去,然后跑sudo ldconfig。

3.3 网络配置与雷达IP修改

MID360出厂默认IP是192.168.1.1XX网段,机载电脑的网口需要配到同一网段。我一般把电脑网口设成192.168.1.50,子网掩码255.255.255.0。配置完之后用ping测试连通性,能ping通再往下走。

如果要修改雷达IP,需要用Livox Viewer或者SDK里的工具。修改IP的逻辑是:雷达上电后会广播自己的信息,工具软件发现设备后可以下发新的IP配置。这里有个坑:修改IP后雷达会重启,如果新IP和电脑不在同一网段,就连不上了,需要用Livox Viewer的搜索功能重新发现。我有一次把雷达IP改到了192.168.2.100,结果电脑还在192.168.1网段,折腾了半天才反应过来。

雷达的配置文件在livox_ros_driver2的config目录下,MID360对应的文件是MID360_config.json。里面需要填雷达的IP、电脑的IP、端口号等信息。数据端口我用的默认57000,命令端口是56000。如果同时用多个雷达,每个雷达的数据端口要不一样,不然会冲突。

3.4 点云数据验证与坐标系标定

驱动跑起来之后,用RViz2订阅/livox/lidar话题就能看到点云。第一次看到MID360的点云会觉得有点奇怪,因为它不是那种规整的线状点云,而是花瓣状的分布。这是正常的,多帧叠加后就会变得均匀。

坐标系标定是很多人容易忽略的一步。雷达装在无人机上,它的坐标系和机体坐标系之间有一个旋转和平移关系。如果不标定,避障算法算出来的障碍物位置和实际位置会有偏差。我的标定方法是:把无人机放在水平地面上,正前方放一个已知距离的障碍物,然后在RViz2里看点云里障碍物的位置,和实际距离对比,反算出外参。这个过程需要反复几次,直到误差在5cm以内。

4. 避障算法设计与机载部署

4.1 从点云到障碍物地图:实时处理流程

MID360输出的原始点云不能直接拿来做避障,需要经过一系列处理。我的处理流程是这样的:先做体素滤波降采样,把点云从两万多个点降到两三千个点,这样后续处理速度快很多;然后做地面分割,把地面点去掉,因为地面不是障碍物;接着做聚类,把属于同一个障碍物的点聚在一起;最后计算每个障碍物的包围盒和距离。

体素滤波的边长选择有讲究。太小了降采样效果不明显,太大了细小障碍物会被滤掉。我用的边长是0.1米,这个尺度下直径10cm以上的障碍物都能保留下来。地面分割用的是RANSAC平面拟合,迭代次数设100次,距离阈值0.05米。聚类用的是欧式聚类,距离阈值0.3米,最小簇点数10个。

整个流程在Orin NX上跑下来大概需要15到20毫秒,加上雷达本身的100毫秒刷新周期,从感知到决策的总延迟在120毫秒左右。20m/s速度下对应2.4米的位移,所以避障的安全距离要设在3米以上。

4.2 局部路径规划:为什么选VFH而不是DWA

局部避障算法我用的是VFH(Vector Field Histogram)的变种,而不是更常见的DWA(Dynamic Window Approach)。原因在于DWA需要考虑无人机的动力学约束,计算量比较大,而且参数调起来很麻烦。VFH的思路更直接:把周围空间划分成若干个扇区,每个扇区计算障碍物密度,然后选一个障碍物密度最低的方向飞过去。

VFH的计算量比DWA小很多,在Orin NX上跑一次只要2到3毫秒。而且VFH对障碍物的形状不敏感,不管是柱子还是墙面,它只看扇区里的点密度,鲁棒性更好。我试过DWA,在高速飞行时因为动力学约束导致可行速度窗口很窄,经常出现无解的情况,而VFH基本不会。

当然VFH也有缺点,它不考虑无人机的运动学约束,可能会选出一个需要急转弯的方向。我的解决办法是在VFH选完方向后,加一个方向平滑滤波,限制相邻两帧之间的方向变化率不超过30度。这样既保留了VFH的鲁棒性,又避免了过于剧烈的机动。

4.3 飞控接口与避障指令下发

避障算法算出来的速度指令需要通过MAVLink发给飞控。PX4支持外部设置速度指令的模式叫Offboard模式。进入Offboard模式之前要先发送心跳包,让飞控知道外部控制器在线。心跳包频率要大于2Hz,我一般设10Hz。

速度指令的坐标系要注意,MAVLink里的速度指令默认是NED坐标系(北东地),而避障算法算出来的速度通常是在机体坐标系或者雷达坐标系下。需要做一个坐标变换。这个变换矩阵由雷达外参和无人机当前姿态共同决定。我一开始忘了做这个变换,结果无人机往障碍物方向飞,差点炸机。

还有一个细节:PX4在Offboard模式下如果超过0.5秒没收到新的速度指令,会自动退出Offboard模式并切换到位置保持。所以速度指令的发送频率要稳定在20Hz以上,不能有大的抖动。我在代码里加了一个看门狗,如果避障算法因为某种原因卡住了,看门狗会触发一个悬停指令,保证安全。

5. 实测调参与问题排查实录

5.1 第一次试飞:点云飘移和避障误触发

第一次试飞是在一个空旷的操场上,无人机起飞后切到Offboard模式,刚开始还挺正常,但速度加到10m/s左右时,点云开始出现明显的飘移,地面点云像波浪一样起伏。避障算法把飘移的地面点误判成了障碍物,频繁触发避让,无人机飞得跟喝醉了似的。

排查下来发现两个问题。一是IMU振动太大,导致姿态估计有高频抖动,点云配准时把抖动传递到了地图上。解决办法是在飞控和机架之间加了一层减震棉,同时把飞控的IMU滤波参数调了一下,具体是把IMU_GYRO_CUTOFF从80Hz降到60Hz。二是雷达的安装位置有松动,高速飞行时的振动让雷达轻微晃动,点云自然就飘了。重新加固了雷达支架后,飘移问题基本解决。

5.2 高速避障时的震荡问题

速度提到15m/s以上后,无人机在避障时会出现前后震荡,就是刚避让完又往回摆。分析下来是避障算法的方向平滑滤波参数太保守,导致避让动作做了一半就开始回正,然后发现障碍物还在又继续避让,来回振荡。

调整方法分两步。一是把方向平滑滤波的变化率限制从30度放宽到45度,让避让动作更果断。二是在VFH的代价函数里增加了一个“方向一致性”项,让算法倾向于保持上一帧的避让方向,而不是每帧都重新选。这两个改动之后,高速避障的震荡问题基本消失了。

5.3 常见问题速查表

问题现象可能原因排查方法解决措施
点云整帧丢失网线太长或屏蔽不好检查网线长度和屏蔽层换短屏蔽网线
点云飘移IMU振动大或雷达松动检查减震和支架紧固加减震棉、加固支架
避障误触发地面分割阈值不当查看地面点残留调整RANSAC距离阈值
避障震荡方向平滑参数保守观察避让方向变化放宽变化率限制
Offboard掉出指令发送频率不够检查发送频率提高频率加看门狗
雷达连不上IP不在同一网段ping测试重新配置IP

5.4 几个让我印象深刻的坑

第一个坑是雷达的扫描模式配置。MID360支持多种扫描模式,默认模式在近距离下点云比较稀疏。我后来改成了近距离高密度模式,避障效果明显提升。这个配置在MID360_config.json里的“scan_pattern”字段,改成1就是近距离高密度。

第二个坑是ROS2的QoS设置。默认的QoS是可靠传输,但点云数据量大,可靠传输会导致缓冲区堆积,延迟越来越大。改成Best Effort模式后延迟稳定了很多。这个坑我踩了好几天才找到,因为表面上看驱动跑得好好的,就是延迟莫名其妙地涨。

第三个坑是飞控的Offboard模式切换逻辑。PX4要求先发一段时间的Offboard指令才能切换,我一开始没注意这个,直接切模式结果被拒绝。后来在代码里加了一个状态机,先发2秒的悬停指令再切模式,就顺畅了。

6. 性能优化与进阶方向

6.1 点云处理管线的加速技巧

点云处理是整套系统里最耗算力的环节。除了前面提到的体素滤波降采样,我还用了几个加速技巧。一是把点云处理放到GPU上,用CUDA做体素滤波和聚类,速度比CPU快5倍以上。二是用PCL的KD树做近邻搜索时,把搜索半径设成固定值而不是动态计算,省去了每次计算半径的开销。三是把整个管线做成多线程流水线,雷达数据接收、预处理、避障计算、指令下发各占一个线程,通过无锁队列传递数据。

这些优化加起来,把从点云接收到避障指令输出的延迟从50毫秒压到了20毫秒以内。别小看这30毫秒,20m/s速度下就是0.6米的差距,有时候就是撞和不撞的区别。

6.2 多传感器融合的扩展思路

MID360虽然视场角很大,但垂直方向只有59度,对于需要大角度俯仰的飞行场景还是不够。我后面加了一个IMU和一个气压计做融合,IMU提供高频姿态信息,气压计提供高度信息,和雷达的点云做互补。融合用的是扩展卡尔曼滤波,状态量包括位置、速度、姿态和雷达外参。

如果想进一步提升避障能力,可以加一个前向的深度相机,和雷达做前融合。雷达的优势是探测距离远、不受光照影响,相机的优势是分辨率高、能识别障碍物类型。两者融合后,既能远距离发现障碍物,又能近距离识别障碍物是什么,避障策略可以更精细。

6.3 从避障到自主导航的演进

这套系统目前只做了局部避障,没有全局路径规划。如果要扩展到自主导航,需要在上面加一层全局规划器。全局规划可以用A或者RRT算法,在已知地图上规划一条从起点到终点的路径,然后局部避障负责沿着这条路径飞并避开动态障碍物。

全局地图的构建可以用SLAM算法,比如LIO-SAM或者FAST-LIO2,这两个都支持Livox雷达。建图之后保存成栅格地图或者八叉树地图,供全局规划器使用。不过SLAM的计算量比纯避障大不少,Orin NX跑起来会比较吃力,可能需要换更强的计算平台或者做更激进的降采样。

我在实际使用中的体会是,高速避障和自主导航对系统的要求差别很大。避障更看重实时性和鲁棒性,导航更看重全局最优和地图质量。如果两个都要做,建议分阶段实现,先把避障做稳,再考虑加导航。不然两个问题混在一起,排查起来非常痛苦。

最后分享一个小技巧:每次改完参数后,先在仿真环境里跑一遍再上真机。Gazebo里可以搭一个带障碍物的场景,把避障算法接进去测试。虽然仿真和真机有差距,但至少能筛掉大部分逻辑错误和参数离谱的情况,省下不少炸机成本。

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

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

立即咨询