1. 从炸机到稳定飞行:高速避障无人机的核心挑战
20m/s 是什么概念?换算过来是 72km/h,这个速度下无人机每秒位移 20 米,而 Livox MID360 的有效探测距离在 40 到 70 米之间(10% 反射率目标约 40m,80% 反射率可达 70m)。这意味着从雷达"看到"障碍物到必须完成避让决策,留给整个系统的时间窗口只有 2 到 3.5 秒。听起来好像还挺充裕?但如果你真在飞控上跑过避障算法就会知道,这 2 秒里要完成点云采集、运动畸变校正、里程计更新、局部地图构建、碰撞检测、路径重规划、控制指令下发这一整条链路,任何一环卡顿都会直接导致炸机。
我前后搭过三套不同配置的高速避障平台,从最早的 MID40 到后来的 MID360,中间炸过两次机、烧过一块飞控、换过三版机架。这篇文章不讲虚的,就把整套配置逻辑、选型理由、参数计算和踩坑经验完整摊开,目标读者是已经有一定无人机装调基础、想往高速自主避障方向进阶的玩家和开发者。如果你连 PX4 的基本参数还没调明白,建议先把悬停和定点飞稳了再来看这个。
整套系统的核心思路可以概括成一句话:用 Livox MID360 提供非重复扫描的高密度点云,用 FAST-LIO2 做紧耦合激光惯性里程计,用机载计算机跑局部规划,飞控只负责底层姿态和位置执行。这个架构看起来简单,但每个环节的选型和参数都直接决定了你最终能飞多快、多稳。
2. 为什么是 MID360 加 FAST-LIO2 这套组合
2.1 MID360 相比传统机械式雷达的取舍
很多人第一反应会问:为什么不用 Velodyne 或者 Ouster 那种机械旋转式雷达?答案很直接——重量和视场角的平衡。MID360 重量约 265g,而同等点密度的机械式雷达普遍在 800g 以上,对于起飞重量本来就紧张的多旋翼平台来说,这几百克的差异直接影响到悬停时间和机动性。
MID360 的视场角是水平 360 度、垂直 -7 度到 52 度,这个非对称的垂直视场是专门为无人机场景设计的。垂直向下覆盖少,向上覆盖多,因为无人机在高速前飞时会有明显的俯仰角变化,向上的视场能保证雷达始终"看得到"前方的障碍物。相比之下,很多全向雷达的垂直视场是对称的,高速前飞时反而容易出现盲区。
非重复扫描模式是 Livox 系列的招牌特性。传统雷达每一帧扫的都是同样的角度,点云在空间上是"线状"分布的;而 MID360 的扫描图案每帧都在变化,多帧累积后点云会逐渐填满整个视场。这个特性对 FAST-LIO2 这种需要点云配准的算法来说非常友好,因为累积后的点云密度远高于单帧,配准精度自然就上去了。
不过 MID360 也有明显的短板。首先是探测距离,官方标称 70m@80% 反射率,但实际在户外对树木、电线这类低反射率目标,有效距离往往只有 30 到 40 米。其次是点云噪声,尤其是对玻璃、水面这类镜面反射目标,会产生大量虚假点。这两个问题在高速飞行时都会被放大,后面会专门讲怎么处理。
2.2 FAST-LIO2 为什么适合高速场景
FAST-LIO2 的核心优势在于它的紧耦合迭代卡尔曼滤波架构。简单说,它不是先把点云配准算出位姿、再和 IMU 融合,而是把点云残差直接作为观测方程塞进滤波器的迭代过程中。这样做的好处是,即使单帧点云因为高速运动产生了严重的运动畸变,滤波器也能通过 IMU 的预积分结果把畸变校正回来。
我实测对比过 LIO-SAM 和 FAST-LIO2 在同样硬件上的表现。在 5m/s 以下的低速场景,两者精度差异不大;但一旦速度超过 10m/s,LIO-SAM 因为依赖帧间配准,运动畸变导致配准失败的概率急剧上升,而 FAST-LIO2 依然能保持稳定的位姿输出。这就是紧耦合架构在高速场景下的价值。
另一个关键点是 FAST-LIO2 的增量式地图管理。它不像传统 SLAM 那样维护一个全局地图,而是用 ikd-Tree 动态维护局部地图,新点云进来就插入、旧点云超出范围就删除。这个机制让它的计算复杂度基本恒定,不会因为飞行时间变长而越来越卡。对于需要长时间高速飞行的任务来说,这一点至关重要。
2.3 硬件选型清单与重量预算
下面是我最终定型的硬件配置,起飞重量控制在 2.8kg 左右:
| 部件 | 型号 | 重量 | 备注 |
|---|---|---|---|
| 机架 | 450mm 轴距碳纤维 | 380g | 建议用 5mm 臂管 |
| 飞控 | Pixhawk 6C | 45g | 带减震板 |
| 机载计算机 | Jetson Orin NX 16G | 120g | 含散热片 |
| 激光雷达 | Livox MID360 | 265g | 含线缆 |
| 电机 | 2812 900KV x4 | 240g | 配 9 寸桨 |
| 电池 | 6S 5000mAh LiPo | 680g | 续航约 12 分钟 |
| 电调 | 45A BLHeli_32 x4 | 160g | 支持 DShot600 |
这个配置的推重比大约在 2.2:1,对于需要频繁机动避障的场景来说比较合适。如果你想把速度推到 20m/s 以上,建议把电机换成 3110 或 3115 级别,桨叶用 10 寸,推重比能到 2.8:1 左右,但续航会掉到 8 分钟左右。
3. 雷达与飞控的物理安装细节
3.1 MID360 的安装位置与减震处理
雷达装在哪里,直接决定了点云的质量。我试过三种安装方式:机架顶部、机架底部、机头前伸支架。最终选择的是机架顶部略靠前的位置,雷达光心比桨盘平面高约 8cm。
为什么不用机头前伸?因为前伸支架在高速飞行时会产生明显振动,而 MID360 对振动非常敏感。它的非重复扫描机制依赖精确的角度编码,一旦振动导致角度偏差,点云就会出现"重影",FAST-LIO2 的配准精度会大幅下降。装在机架顶部虽然视场会被桨叶遮挡一部分,但振动环境好得多。
减震处理是必须的。我用的是 3M 的硅胶减震球,四个角各一个,中间再垫一层 2mm 的减震棉。注意减震球不要压得太紧,否则起不到减震效果;也不要太松,否则雷达会在机动时晃动。判断标准是:用手轻推雷达,能感觉到弹性但不会明显位移。
提示:MID360 出厂时底部有一层保护膜,安装前务必撕掉,否则会影响散热。我第一次装的时候没注意,飞了五分钟雷达就过热降频了。
3.2 雷达与飞控的坐标变换
MID360 的输出坐标系是雷达自身的坐标系,而飞控用的是机体坐标系。这两个坐标系之间的变换关系必须在 FAST-LIO2 的配置文件中准确设置,否则里程计输出会完全错误。
具体来说,需要标定三个量:雷达相对于飞控的平移向量(单位米)和旋转四元数。平移向量用卷尺量就行,精度到厘米级足够。旋转四元数比较麻烦,如果雷达是水平正装、线缆朝后,那么旋转基本是单位四元数,只需要微调俯仰角。
我的做法是:先把雷达大致装正,然后在 FAST-LIO2 里用默认外参跑一遍,观察点云在地面平面上的表现。如果地面点云明显倾斜,就说明俯仰角有偏差,手动调整外参里的 pitch 值,每次调 0.5 度,直到地面点云基本水平。这个过程大概需要迭代五六次,但一次调好后就不用再动了。
3.3 供电与数据链路的可靠性
MID360 的供电是 9 到 27V,可以直接从无人机的 6S 电池取电,但必须单独走一路降压模块,不能和飞控共用。原因是雷达在启动瞬间电流能到 2A 以上,共用电源会导致飞控电压跌落,严重时直接重启。
数据链路方面,MID360 通过以太网输出点云数据,默认 IP 是 192.168.1.1XX 网段。机载计算机需要配置一个同网段的静态 IP。这里有个坑:Jetson Orin NX 默认的网口是千兆的,但如果你用的是 USB 转网口,带宽可能不够,点云会出现丢包。我建议直接用 Orin NX 板载的千兆网口,或者用 Intel I210 这类独立网卡。
网线也要注意,MID360 附带的线缆比较硬,在机架上走线时容易因为振动导致接触不良。我的做法是换用柔软的硅胶线,接头处用热缩管加固,再用扎带固定在机架上,留出足够的缓冲余量。
4. FAST-LIO2 的配置调参与实战验证
4.1 配置文件里最关键的五个参数
FAST-LIO2 的配置文件看起来参数很多,但真正影响高速性能的就那么几个。下面是我在 20m/s 场景下反复调试后确定的参数:
common: lid_topic: "/livox/lidar" imu_topic: "/livox/imu" time_sync_en: false time_offset_lidar_to_imu: 0.0 preprocess: lidar_type: 1 scan_line: 4 blind: 0.5 timestamp_unit: 3 mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001 fov_degree: 360 det_range: 70.0 extrinsic_est_en: false extrinsic_T: [0.011, -0.023, 0.045] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1] filter_size_surf: 0.2 filter_size_map: 0.3 cube_side_length: 500.0blind参数设成 0.5 米,意思是忽略雷达周围 0.5 米内的点。这些点大多是桨叶反射和近场噪声,留着只会干扰配准。filter_size_surf和filter_size_map是降采样体素大小,高速场景下我建议适当放大,0.2 和 0.3 是我实测下来精度和速度比较平衡的值。设太小计算量爆炸,设太大点云特征丢失,配准会飘。
extrinsic_T和extrinsic_R就是前面说的外参,必须准确。extrinsic_est_en设成 false,意思是关闭在线外参估计。高速场景下不建议开在线估计,因为运动激励太强,估计值容易发散。
4.2 IMU 数据的时间同步处理
MID360 内置了 ICM40609 IMU,输出频率 200Hz。FAST-LIO2 对时间同步非常敏感,如果雷达和 IMU 的时间戳有偏差,高速运动时里程计会明显漂移。
Livox 的 ROS 驱动默认会做硬件时间同步,但前提是雷达和计算机的时间要一致。我的做法是在机载计算机上跑一个 NTP 服务,让雷达通过 PTP 协议同步到计算机时间。如果嫌麻烦,至少要在启动驱动前用chrony把系统时间校准一次。
还有一个细节:MID360 的点云时间戳是每个点独立的,不是整帧统一时间。FAST-LIO2 支持逐点时间戳,这个特性对运动畸变校正非常重要。在配置里要确保timestamp_unit设置正确,MID360 用的是纳秒,对应值应该是 3。
4.3 高速飞行下的里程计漂移排查
我第一次跑 15m/s 直线飞行时,发现 FAST-LIO2 输出的位置在飞行 100 米后漂了将近 3 米。这个漂移量在避障场景下是致命的,因为局部地图会整体偏移,导致避障决策错误。
排查过程分三步。第一步,检查点云质量。把 FAST-LIO2 的可视化打开,观察点云在 RViz 里的表现。如果点云有明显的"拖尾"或"重影",说明运动畸变校正没做好,问题出在时间同步或 IMU 标定上。第二步,检查 IMU 数据。用rostopic hz看 IMU 频率是否稳定在 200Hz,如果有丢帧,说明数据链路有问题。第三步,检查外参。把无人机放在已知尺寸的场地里,手动推着走一圈,看里程计轨迹和实际轨迹是否吻合。
我最后发现的问题是 IMU 的内参标定不准。MID360 出厂时 IMU 只做了粗略标定,加速度计的零偏在温度变化后会漂移。解决办法是用imu_utils工具重新标定,标定后漂移量降到了 100 米 0.5 米以内,完全满足避障需求。
5. 局部规划与避障策略的实现
5.1 从点云到障碍物地图的转换
FAST-LIO2 输出的是里程计和注册后的点云,但避障算法需要的是"哪里能飞、哪里不能飞"的栅格地图。这一步我用的是ego-planner的局部地图模块,把点云投影到以无人机为中心的滚动栅格中,栅格分辨率设 0.15 米,地图范围 10 米 x 10 米 x 5 米。
为什么用滚动栅格而不是全局地图?因为高速飞行时全局地图的更新频率跟不上,而且全局地图会越来越大,查询效率下降。滚动栅格只维护无人机周围的一小片区域,查询是 O(1) 复杂度,非常适合实时避障。
栅格地图的膨胀处理很关键。原始点云是稀疏的,如果直接拿来做碰撞检测,无人机会从点与点之间的缝隙"钻"过去,但实际上那个缝隙可能只有几厘米宽。我的做法是对每个障碍物点做半径 0.3 米的膨胀,这样无人机就会保持至少 0.3 米的安全距离。膨胀半径根据飞行速度调整,速度越快,膨胀越大,20m/s 时我用到 0.5 米。
5.2 局部轨迹规划的算法选择
局部规划我用的是EGO-Planner的简化版,核心思想是在栅格地图里用 A* 搜一条粗略路径,然后用 B 样条做平滑,最后用梯度下降优化轨迹使其远离障碍物。
为什么不用 DWA 或 TEB?DWA 是基于速度采样的,在高速场景下采样空间太大,计算量爆炸;TEB 是基于图优化的,对动态障碍物的响应不够快。EGO-Planner 的 B 样条表示有个好处:轨迹的连续性天然得到保证,不会出现速度或加速度突变,这对无人机姿态控制非常友好。
规划频率我设在 20Hz,也就是每 50ms 重新规划一次。这个频率下,20m/s 飞行时每规划周期前进 1 米,足够应对大多数障碍物。如果障碍物出现得更突然,比如突然飞入的鸟,那就只能靠飞控的紧急刹车了。
5.3 飞控接口与速度指令下发
规划出的轨迹最终要转成飞控能理解的指令。我用的是 PX4 的Offboard 模式,通过 MAVROS 发送setpoint_raw/local消息,包含位置、速度、加速度和偏航角设定值。
这里有个关键细节:PX4 的 Offboard 模式要求指令流频率至少 2Hz,否则会自动退出。我设的是 50Hz,留足余量。速度指令的限幅也很重要,我设的最大水平速度 20m/s、最大垂直速度 5m/s、最大加速度 8m/s²。加速度限幅比速度限幅更关键,因为加速度突变会导致电机饱和,无人机姿态失控。
注意:第一次测试 Offboard 模式时,一定要在开阔场地、低速度下进行。我见过太多人直接上高速,结果飞控没调好,无人机直接翻跟头。
6. 实测中的炸机教训与参数修正
6.1 第一次炸机:雷达过热导致点云丢失
第一次炸机发生在夏天中午,气温 35 度。飞到第 8 分钟时,无人机突然朝一棵树直冲过去,避障完全没反应。事后检查发现,MID360 的温度保护触发了,雷达自动降频,点云输出从 10Hz 掉到了 2Hz,FAST-LIO2 因为点云太少直接发散,局部地图变成一片空白,规划器以为前方没有障碍物。
教训很直接:MID360 的散热必须做好。我后来在雷达底部贴了一块 40mm x 40mm 的铝制散热片,再用导热硅胶固定,温度降了 15 度左右。另外飞行时间也要控制,夏天连续飞行不要超过 10 分钟,中间落地休息 5 分钟让雷达降温。
6.2 第二次炸机:外参标定错误导致地图倾斜
第二次炸机更隐蔽。飞行时一切正常,但避障总是"慢半拍",最后撞上了一根电线杆。回放数据发现,FAST-LIO2 输出的点云地图整体向下倾斜了约 5 度,导致规划器认为前方是上坡,实际却是平路,等发现电线杆时已经来不及了。
问题出在外参的俯仰角上。我安装雷达时目测是水平的,但实际上因为机架加工误差,雷达前倾了 5 度。这个误差在低速时看不出来,高速时因为点云累积量大,倾斜被放大,最终导致地图整体偏移。
修正方法前面提过了,就是用地面的点云做参考,反复迭代外参。我现在养成了一个习惯:每次拆装雷达后,都要在平地上推着无人机走一圈,确认点云地面是水平的才敢飞。
6.3 参数修正后的最终配置
经过两次炸机,我把所有参数重新梳理了一遍,下面是最终稳定飞行的配置要点:
| 参数项 | 修正前 | 修正后 | 修正理由 |
|---|---|---|---|
| 雷达散热 | 无散热片 | 40mm 铝散热片 | 防止过热降频 |
| 外参俯仰 | 目测 0 度 | 实测 -5 度 | 消除地图倾斜 |
| 膨胀半径 | 0.3m | 0.5m | 高速下留足安全距离 |
| 规划频率 | 10Hz | 20Hz | 提高障碍物响应速度 |
| 最大加速度 | 10m/s² | 8m/s² | 防止电机饱和 |
| IMU 标定 | 出厂值 | imu_utils 重标 | 降低里程计漂移 |
这套配置下,我在开阔场地跑到了 22m/s 的直线速度,避障成功率在 95% 以上。剩下的 5% 主要是突然出现的动态障碍物,比如飞鸟,这个目前没有特别好的解决办法,只能靠飞控的紧急刹车兜底。
7. 从能飞到飞得好:几个容易被忽略的细节
7.1 电池电压对雷达性能的影响
6S 电池满电是 25.2V,飞到后期会降到 21V 左右。MID360 的供电范围是 9 到 27V,看起来 21V 还在范围内,但实测发现电压低于 22V 时,雷达的点云强度会下降,尤其是对远距离低反射率目标,有效探测距离会缩短 20% 左右。
我的做法是设置一个电压告警阈值,单片电芯低于 3.6V 就降落。这样虽然牺牲了一点续航,但保证了避障性能的一致性。另外,雷达的供电最好经过一个稳压模块,输出稳定的 24V,这样电池电压波动就不会影响雷达。
7.2 电磁干扰对 IMU 的影响
机载计算机、电调、图传都会产生电磁干扰,而 MID360 内置的 IMU 对磁场比较敏感。我遇到过 IMU 数据里出现周期性尖峰的情况,频率和电机转速一致,明显是电磁干扰。
解决办法有两个:一是把雷达尽量远离电调和电源线,至少保持 10cm 距离;二是在雷达供电线上套一个磁环,能滤掉大部分高频干扰。如果干扰还是很严重,可以考虑外接一个独立的 IMU,比如 BMI088,通过串口接入 FAST-LIO2。
7.3 起飞前的自检流程
高速避障飞行前的自检不能省,我总结了一个五分钟检查清单:
- 雷达点云在 RViz 里是否正常显示,地面是否水平
- FAST-LIO2 的里程计输出是否稳定,静止时漂移是否小于 1cm/s
- 局部地图是否正常构建,障碍物膨胀是否生效
- 飞控 Offboard 模式是否能正常切换,指令流是否连续
- 电池电压是否高于 24V,各部件温度是否正常
这个清单看起来简单,但每次飞行前花五分钟走一遍,能避免 90% 以上的低级失误。我现在的习惯是,只要拆装过任何部件,自检流程就要重新走一遍,绝不偷懒。
7.4 关于飞行场地的选择
高速避障测试一定要在开阔、无人的场地进行。我一般选郊区的废弃操场或者大片草地,周围 100 米内没有电线、树木和建筑物。第一次测试新参数时,速度从 5m/s 开始,每次加 2m/s,确认稳定后再往上加。
另外,场地最好有明确的边界,比如用锥桶围一个 50m x 50m 的区域。这样即使避障失效,无人机飞出边界时你也能及时发现并接管。我见过有人在完全开放的场地测试,无人机飞丢了几百米才找回来,非常危险。
这套系统从零搭建到稳定飞行,我前后花了大约三个月,中间炸了两次机,换了三版机架,调了无数遍参数。现在回头看,最难的不是算法本身,而是各个部件之间的配合和细节处理。雷达的安装角度、IMU 的标定精度、飞控的参数整定、电源的稳定性,任何一个环节出问题都会导致整个系统失效。希望这篇配置指南能帮你少走一些弯路,把精力集中在真正有价值的算法优化上。