室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践

张开发
2026/4/8 19:21:20 15 分钟阅读

分享文章

室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践
1. 室内无人机定位的挑战与解决方案在仓库巡检、隧道勘测等室内场景中无人机最头疼的问题就是失去GPS信号后的定位难题。传统光流传感器虽然能提供相对运动信息但在长距离飞行时误差会不断累积而激光雷达虽然精度高但单独使用时无法感知高度变化。去年我在一个自动化仓库项目中就遇到过无人机撞货架的尴尬情况——这正是因为单一传感器无法满足复杂环境的需求。Livox Mid360激光雷达MTF-01光流传感器的组合恰好解决了这个痛点。Mid360能生成每秒20万点的三维环境模型精度达到厘米级而光流传感器则像无人机的触角实时感知机体与地面的相对运动。实测在30m×50m的仓库环境中这套方案让定位误差稳定控制在±3cm以内完全满足货架巡检的精度要求。硬件配置上需要特别注意香橙派5B开发板负责传感器数据融合通过USB-TTL连接Pixhawk 6C飞控的TELE2口光流传感器则接在TELE3口。我第一次组装时把接口接反了结果无人机像喝醉酒一样乱飘——所以接线时务必对照说明书反复确认。2. 传感器数据融合的核心原理2.1 坐标系转换的玄机刚接触这个项目时我被各种坐标系搞得头晕机体坐标系、ENU坐标系、雷达坐标系...直到画了张示意图才明白关键所在。Mid360输出的位姿数据是基于雷达自身坐标系的而飞控需要的是以起飞点为原点的ENU东-北-天坐标系数据。这就好比一个人用自己身体的左右方向指路必须先告诉他和地球南北方向的夹角才行。代码中的init_q变量就是解决这个问题的钥匙Eigen::AngleAxisd(init_yaw, Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitX());这个四元数转换矩阵把光流传感器获取的初始偏航角机体与正北方向的夹角作为旋转基准。我在测试时发现如果初始角度校准误差超过5度10米外的定位就会偏差近1米——所以起飞前一定要让无人机静止2秒完成校准。2.2 滑动窗口滤波的实战技巧环境反射率变化时激光雷达会出现短暂的数据抖动。为此我设计了一个滑动窗口滤波器SlidingWindowAverage类用队列存储最近8次偏航角测量值。当检测到异常波动差值0.01弧度时会自动重置队列防止错误数据影响定位。这个技巧让系统在通过玻璃幕墙区域时仍能保持稳定输出。实际调试中有个坑要注意窗口大小设置过大会导致响应迟钝太小则滤波效果差。经过20多次试飞最终确定8-12这个范围最适合仓库环境。可以通过以下代码实时监控滤波效果ROS_INFO(Current yaw: %.2f, Average: %.2f, newData, windowAvg);3. 从零搭建系统的完整流程3.1 硬件组装避坑指南组装这套系统时我踩过三个典型的坑香橙派5B的USB供电不足导致雷达频繁掉线——后来改用独立5V/3A电源解决光流传感器安装角度偏差引发定位漂移——需要用水平仪确保安装面与机体平行飞控与开发板串口波特率不匹配——必须统一设置为921600bps建议按这个顺序接线先连接飞控与电池再接雷达和光流传感器最后连接开发板上电后通过QGC地面站的MAVLink检测工具确认能看到DISTANCE_SENSOR和LOCAL_POSITION_NED消息才算硬件配置成功。3.2 软件配置关键参数FAST-LIO算法的配置文件中这几个参数直接影响定位效果pointCloudTopic/livox/lidar/pointCloudTopic imuTopic/mavros/imu/data/imuTopic mapResolution0.1/mapResolution maxIteration5/maxIteration在mid360.launch文件中需要特别设置param namepublish_freq value20.0/ param namemulti_topic value0/ param namexfer_format value1/实测发现publish_freq低于15Hz时无人机快速移动会出现轨迹断裂。而将xfer_format设为1PointCloud2格式比0自定义格式节省30%的CPU占用。4. 飞行测试与调优经验4.1 校准流程的最佳实践在正式飞行前必须完成三个关键校准光流传感器校准在2m×2m的方格纸上缓慢平移无人机观察QGC中的光流数据是否与实际移动一致雷达-机体标定用棋盘格测量雷达与飞控的实际位置偏差填入fast_lio配置文件的extrinsicT参数磁罗盘干扰检测手持无人机绕场一周检查QGC中航向角变化是否平滑我开发了一个自动检测脚本可以一键完成所有校准检查#!/bin/bash rosrun calibration_check check_flow.py rosrun calibration_check check_extrinsic.py rosrun calibration_check check_mag.py4.2 异常情况处理方案遇到定位丢失时建议按这个流程排查检查/odometry话题是否持续输出查看mavros/vision_pose/pose数据是否正常用rostopic hz检测各话题频率重启fast_lio节点有个很管用的小技巧在开发板部署一个看门狗脚本当检测到定位异常时自动切换至光流气压计组合导航。这个方案在临时通过强反射区域时特别有效。

更多文章