
1. 室内无人机定位这件事为什么值得认真折腾室内飞无人机最让人头疼的不是飞控调参也不是电机选型而是定位。你在室外飞GPS一搜星十几颗卫星挂着位置信息稳得不行。可一进厂房、仓库、地下车库、隧道或者自家客厅GPS信号立马歇菜无人机就像被蒙住眼睛的人飘来飘去轻则撞墙炸机重则直接失控飞丢。这个问题在无人机自主导航和无人机视觉感知领域里属于绕不开的核心门槛。我最早接触室内定位是在一个厂房巡检项目里当时用的是光流传感器加超声波定高飞是能飞但漂移严重飞个三五米就偏了半米多根本没法做精细化巡检。后来换了Livox Mid360激光雷达配合光流传感器做融合定位效果一下子就不一样了——悬停精度能压到厘米级室内自主飞行终于稳下来了。这套方案的核心思路就是用激光雷达提供水平方向的高精度位置约束用光流传感器提供速度估计和冗余备份两者互补实现无GPS环境下的稳定定位。这篇文章适合谁看如果你正在做室内无人机项目不管是巡检、盘点、安防还是科研验证只要涉及到无GPS定位这套方案都能直接参考。如果你刚入门对激光雷达和光流传感器还不熟我也会把原理和实操细节讲清楚。如果你已经有一定基础可以直接跳到实操部分和避坑指南那里有我踩过的坑和总结的经验。注意室内飞行涉及安全风险务必在空旷、无人的环境下测试桨叶必须装好防护罩电池状态要提前检查。2. 方案整体设计与核心思路拆解2.1 为什么选Livox Mid360而不是传统机械式激光雷达室内定位对激光雷达的要求其实挺苛刻的。传统机械式激光雷达比如16线、32线的体积大、重量重、价格高装在小型无人机上很吃力。而且机械式雷达的扫描方式是旋转的在室内这种结构化环境里容易产生运动畸变点云配准的难度也大。Livox Mid360是非重复扫描方式的固态激光雷达体积小、重量轻大概只有265克功耗也低。它的视场角是水平360度、垂直59度覆盖范围很广室内环境下基本没有盲区。最关键的是它的点云密度在近距离下非常高这对室内定位来说太重要了——室内空间小特征距离近点云密度高意味着配准精度高位置估计自然就准。我实测下来Mid360在10米以内的点云质量非常扎实墙面、地面、货架这些结构特征都能清晰捕捉到。而且它的价格相比传统多线雷达便宜不少性价比很高。当然它也有缺点比如远距离点云会稀疏一些但在室内场景下这个缺点基本可以忽略。2.2 光流传感器在这里扮演什么角色光流传感器的原理不复杂就是通过摄像头拍摄地面纹理计算像素移动速度从而推算出无人机的水平速度。它的优势是响应快、频率高能提供短时间内的速度估计。但缺点也很明显地面纹理不明显的时候比如纯色地板、光滑瓷砖光流就会失效而且光流只能测速度不能直接给位置时间一长积分漂移就出来了。所以在这套方案里光流传感器的定位是辅助和冗余。激光雷达负责提供绝对位置约束光流负责提供高频速度估计两者通过扩展卡尔曼滤波或者因子图优化进行融合。这样即使激光雷达偶尔因为遮挡或者快速运动导致点云配准失败光流也能顶上一段时间让无人机不至于瞬间失控。2.3 整体架构与数据流整套系统的数据流是这样的Mid360输出点云数据经过点云预处理去畸变、降采样、地面分割然后和预先构建的室内地图做点云配准得到无人机的位姿估计。光流传感器输出速度信息和IMU数据一起做状态估计最终融合输出稳定的位置、速度、姿态。飞控这边我用的是Pixhawk系列刷的PX4固件。PX4对外部定位源的支持很完善可以通过MAVROS或者直接串口把定位数据喂给飞控飞控再结合IMU做融合。整个链路的关键在于时间同步和坐标系对齐这两个地方如果没做好融合出来的位置会跳变飞行效果会很差。提示如果你用的是ROS系统建议用robot_localization包做融合它支持多传感器输入配置灵活社区资料也多。3. 核心细节解析与实操要点3.1 Livox Mid360的安装与标定安装位置很讲究。Mid360最好装在无人机顶部或者底部视场角要尽量避开桨叶和机架遮挡。我试过装在底部朝下结果地面点云被起落架挡了一部分配准精度下降明显。后来改到顶部朝上利用天花板和墙面做特征效果反而更好。当然具体装哪里要看你的飞行环境如果天花板很高或者没有明显特征还是朝下装更靠谱。标定分两步内参标定和外参标定。内参标定Mid360出厂已经做好了一般不需要动。外参标定是标定雷达和IMU之间的相对位姿这个必须做而且要做准。我用的是lidar_imu_calib工具采集一段包含充分旋转和平移的数据然后离线优化。标定误差控制在0.5度以内位置误差控制在1厘米以内不然后面融合的时候会一直有偏差。3.2 光流传感器的选型与安装光流传感器我试过好几种最后用的是PMW3901加超声波定高的组合。PMW3901体积小、重量轻I2C接口直接接飞控就行。它的分辨率是160x160在室内低空飞行时足够用了。安装的时候要注意光流镜头必须垂直朝下倾斜角度不能超过5度否则测出来的速度会有系统性偏差。超声波定高模块我用的是TFmini Plus它是激光测距精度比超声波高而且不受地面材质影响。安装位置要避开桨叶气流不然测距会跳变。我一般装在机腹中心位置周围加个遮光罩防止阳光干扰。3.3 点云配准与地图构建室内定位的精度很大程度上取决于点云配准的质量。我用的配准算法是NDT正态分布变换相比ICPNDT对初值不敏感收敛范围更大适合室内这种结构化环境。地图构建用LOAM或者LIO-SAM先离线跑一遍把室内环境的三维点云地图建好然后在线定位的时候直接和这个地图做配准。建图的时候要注意尽量覆盖无人机所有可能到达的区域墙角、柱子、货架这些特征丰富的地方要多采集几遍。地图分辨率不要设太高0.1米到0.2米就够了太高了计算量大实时性跟不上。3.4 多传感器融合策略融合策略我试过两种松耦合和紧耦合。松耦合是把激光雷达和光流分别算位姿然后在飞控层面做加权平均。这种方式实现简单但精度一般而且当某个传感器失效时切换不够平滑。紧耦合是把原始观测数据一起丢进滤波器里优化精度高鲁棒性也好但实现复杂度高。我最后用的是基于EKF的紧耦合方案状态向量包括位置、速度、姿态、陀螺仪零偏、加速度计零偏。激光雷达的配准结果作为位置观测光流的速度作为速度观测IMU做预测。整个滤波器的频率跑到100Hz激光雷达10Hz光流50Hz融合出来的位姿很平滑悬停的时候位置波动在2厘米以内。注意融合的时候一定要做好时间同步激光雷达、光流、IMU的时间戳必须对齐到同一时钟源不然融合结果会震荡。4. 实操过程与核心环节实现4.1 硬件清单与接线先列一下我用的硬件清单组件型号数量备注飞控Pixhawk 6C1刷PX4固件激光雷达Livox Mid3601串口转USB光流传感器PMW39011I2C接口测距模块TFmini Plus1串口机载电脑树莓派4B1跑ROS无人机机架450mm轴距1碳纤维接线方面Mid360通过以太网转USB接到树莓派PMW3901接飞控的I2C口TFmini Plus接飞控的串口。树莓派和飞控之间通过串口或者USB转TTL连接跑MAVROS。4.2 软件环境搭建树莓派上装Ubuntu 20.04和ROS Noetic。然后装Livox SDK和livox_ros_driver编译的时候注意把livox_ros_driver的版本和ROS版本对应上。光流的驱动用px4flow或者自己写个I2C读取节点。TFmini Plus的驱动用tfmini_ros。飞控这边PX4固件要开EKF2的外部定位输入参数EKF2_AID_MASK设置成使用外部视觉定位EKF2_HGT_MODE设置成测距模块定高。MAVROS把融合后的位姿通过/mavros/vision_pose/pose话题发给飞控。4.3 建图与定位流程建图的时候手动遥控无人机在室内飞一圈尽量覆盖所有区域。Livox驱动输出点云LIO-SAM建图保存成PCD文件。然后在线定位的时候加载这个PCD地图NDT配准输出位姿。配准参数我调了挺久最后用的体素栅格是0.2米NDT的步长是0.1最大迭代次数30。这些参数不是固定的要根据你的室内环境调整。环境大的话体素栅格可以大一点环境小的话可以小一点。4.4 飞行测试与调参第一次试飞的时候我先在室外GPS模式下飞了一遍确认无人机基本功能正常。然后转到室内切到Offboard模式用ROS脚本发送位置指令。刚开始悬停的时候无人机有点飘位置波动大概10厘米。后来把EKF2的噪声参数调了一下EKF2_POSXY_NOISE从0.5降到0.2EKF2_VELXY_NOISE从0.3降到0.1波动就降到2厘米以内了。提示调参的时候要一点一点改每次改完飞一次记录数据对比效果。不要一次改太多参数不然出了问题都不知道是哪个参数导致的。5. 常见问题与排查技巧实录5.1 激光雷达点云配准失败这是最常见的问题。表现是无人机位置突然跳变或者直接飘走。原因一般有三个一是环境特征太少比如纯白墙面、空旷大厅二是无人机运动太快点云畸变严重三是地图和实际环境不一致比如家具挪动了位置。解决办法特征少的环境可以在地面贴一些标记物增加特征点运动太快的话限制飞行速度室内建议不要超过1米每秒地图不一致的话重新建图或者用在线建图模式。5.2 光流传感器数据跳变光流数据跳变一般是因为地面纹理不明显或者光照变化太大。我遇到过在光滑瓷砖地面上光流直接失效速度估计变成0无人机就开始漂。解决办法是换一个有纹理的地面测试或者在光流镜头下面加一个补光灯保证光照稳定。5.3 融合后位置震荡位置震荡一般是时间同步没做好或者坐标系没对齐。检查方法录一段bag用rqt_plot看激光雷达位姿、光流速度、IMU数据的时间戳看看是不是对齐的。坐标系的话检查雷达和IMU的外参标定是不是准确TF树是不是完整。5.4 常见问题速查表问题现象可能原因排查方法解决方案位置跳变点云配准失败查看配准得分增加特征、降低速度速度估计为0光流失效检查地面纹理换地面、补光位置震荡时间不同步检查时间戳统一时钟源高度漂移测距模块干扰检查测距数据加遮光罩、换位置起飞后漂移外参标定不准检查TF树重新标定注意每次修改硬件或者软件配置后都要重新做一次地面测试确认无误后再飞。6. 实操心得与避坑经验6.1 别迷信单一传感器我一开始只用了激光雷达觉得点云配准够了。结果有一次飞到一个走廊里两边都是白墙特征极少雷达直接失效无人机撞墙了。后来加了光流做冗余即使雷达短暂失效光流也能顶几秒钟足够飞控做出反应。所以多传感器融合不是锦上添花是保命手段。6.2 标定这件事偷懒必吃亏外参标定我一开始随便估了个值觉得差不多就行。结果飞的时候位置一直有系统性偏差往一个方向偏。后来老老实实重新标定偏差才消掉。标定的时候数据要采集充分旋转、平移、加减速都要有不然优化出来的结果不准。6.3 室内飞行安全第一室内飞行比室外危险得多空间小、障碍物多、GPS没有一旦失控很容易炸机。我的经验是第一次飞一定要用护桨飞行高度不要超过1.5米速度不要超过0.5米每秒旁边要有人随时准备切手动模式。电池电量不要低于30%低电量的时候电压下降飞控可能会异常。6.4 参数调优是个耐心活EKF2的参数有几十个不是每个都要调。我一般只调EKF2_POSXY_NOISE、EKF2_VELXY_NOISE、EKF2_GPS_DELAY这几个。调的时候用rosbag录数据离线分析看看滤波后的位姿和原始观测的残差残差大的话就调大噪声参数。这个过程很枯燥但调好了效果提升很明显。6.5 地图维护不能忘室内环境不是一成不变的家具挪了、货架换了位置地图就对不上了。我一般每周重新建一次图或者用在线建图模式让无人机边飞边更新地图。在线建图的计算量大一些但对机载电脑的性能要求也高树莓派4B跑起来有点吃力后来换了Jetson Nano才流畅。这套方案我前后折腾了大概两个月从硬件选型到软件调试再到飞行测试踩了不少坑。现在这套配置在厂房巡检项目里已经稳定运行了半年多悬停精度2厘米自主飞行轨迹误差5厘米以内完全满足巡检需求。如果你也在做类似的项目希望这些经验能帮你少走点弯路。