
最近一直在折腾室内无人机定位GPS在天上挺靠谱可一旦进了厂房、停车场、桥底信号直接被按在地上摩擦。最后索性把目光转向了UWB折腾了一圈下来结论是在几十米范围的半封闭环境里UWB完全可以顶替GPS的角色给PX4飞控提供一个稳定、高精度的位置源。这篇东西不是概念科普是我从硬件选型、串口接线到QGC参数调整、试飞踩坑全流程的记录适合手里有PX4飞控、想在地下室或厂房里做定点悬停或航线飞行的朋友参考。1. 为什么非要用UWB把GPS替掉1.1 室内、桥底、树冠下GPS的“盲区”你到底碰没碰到过先说说我们实际遇到的场景。项目要求在室内厂房里做一台无人机的自动巡检飞行范围大概40米×40米高度3米左右。GPS在窗边偶尔能搜到四五颗星位置飘忽不定漂移能到5米以上这个精度别说做自动巡检连手动定点悬停都费劲。后来试过RTK室内信号衰减严重基站架在屋顶也只能保证窗边一小片区域稳定墙角、货架后面照样掉定位。这种“有GPS但不好用”的环境其实特别常见。桥下、隧道、地下车库、高密度货架仓库GPS信号要么被多路径反射搞到误差离谱要么干脆收不到。传统做法是换视觉定位、激光雷达定位但成本和调试复杂度一下子就上去了。UWB算是一个平衡点成本比激光雷达低精度比WiFi/蓝牙定位高调试复杂度也比视觉SLAM低得多。1.2 UWB定位到底用了什么黑科技UWB全称是超宽带Ultra Wide Band本质是一种脉冲无线电技术。它发射的信号带宽特别宽脉冲宽度极窄所以时间分辨率极高测距精度能做到厘米级。UWB定位常见有两种原理TOFTime of Flight标签主动给基站发脉冲基站回传测量信号往返时间乘以光速得到距离。拿到多个基站的距离后用三边定位算法解算标签位置。TDOATime Difference of Arrival标签只发信号多个基站记录同一个信号到达的时间差通过时间差解算位置。TDOA的优点是标签端不需要来回通信容量大适合大规模部署。市面上大部分UWB定位模块比如基于DW1000芯片的方案就是在这两种原理上做的。实际测试下来在空旷视距环境下静止位置精度可以做到10到30厘米动态跑动时位置抖动也能控制在0.3米以内刷新率典型值10到50Hz延迟通常在几毫秒到十几毫秒。这个特性用来替代GPS作为无人机的位置观测源是可行的。1.3 直接说结论UWB替代GPS替代的是什么首先得把概念理清UWB替代GPS不是把飞控里的GPS解算逻辑换掉而是把“位置观测数据”的来源从卫星换成UWB标签。PX4飞控本身不关心位置数据是卫星给的、视觉给的还是UWB给的它只认两类东西一类是GNSS协议数据NMEA/UBX另一类是MAVLink的外部位置估计消息。我们只要把UWB定位结果转换成这两种格式之一喂给PX4的EKF2估计器飞控就能正常做位置控制和航线任务。所以“替代”有三个层面的含义硬件替代把GPS模块摘掉换成UWB标签。协议替代让UWB标签输出类似GPS的NMEA语句或者由机载电脑把UWB位置包装成MAVLink消息。参数替代调整EKF2的传感器融合开关让飞控信任UWB提供的位置信息。一句话总结UWB只是换了个位置数据源飞控的底层控制链路完全不用动。2. 动手前先搞清楚硬件选型和通信方式2.1 UWB模块怎么选推荐两类方案UWB模块现在种类很多选型时别光看精度参数还要看接口协议、刷新率、是否开放配置。我用过的方案大致分两类。第一类是“一体化定位系统”比如Nooploop LinkTrack系列。这类模块一个硬件就能当基站或标签用官方提供配置软件和NMEA输出功能直接串口输出模拟GPS的语句飞控接上就能用。优点是省事适合验证方案缺点是价格稍高一套4基站加1标签下来成本不低。第二类是“基于DW1000芯片的DIY模块”比如Pozyx、DWM1001-Dev。这类模块灵活性更高能拿到原始测距数据自己写定位算法但需要自己处理坐标解算和协议转换开发量明显增大。如果你手头PX4开发环境很熟选这个没问题如果只是为了快速实现定位我建议老老实实用一体化方案。除了看定位原理还要注意几个参数刷新率至少10Hz以上推荐20Hz以上。输出协议是否支持NMEA或者串口自定义协议。坐标输出能否设置局部坐标系原点、坐标轴方向和高度偏移。供电和电平3.3V还是5V串口电平是否跟飞控兼容。2.2 飞控接UWB的三种常用方式这一块是新手最容易懵的地方。UWB标签跟飞控之间的数据通道常见有三种接法直连串口让UWB模块伪装成GPS。这种方式最简单UWB标签的串口TX接到飞控的GPS串口RX然后在地面站把GPS协议类型设成NMEA就完事了。很多一体化模块直接支持这个模式甚至厂商就叫它“GPS模拟模式”。UWB标签透过机载电脑走MAVLink。标签先把位置数据发给树莓派/NUC之类的机载电脑电脑上跑一个ROS节点或者MAVLink路由把位置信息通过mavros/vision_pose/pose发给飞控。这种方式更“高级”也更能发挥UWB的潜力因为你可以把多个传感器的数据一起融合。接飞控的通用串口用MAVLink外部消息。UWB标签自带串口接飞控的TELEM2口用自定义协议或MAVLink把位置发进去。这种方式介于前两者之间适合没有机载电脑但标签支持MAVLink输出的情况。我在后面正文里会重点讲第一种和第二种。第一种适合快速上手第二种适合追求精度的朋友。2.3 我这套配置的完整硬件清单说下我实际用的这套配置方便你照着准备飞控Pixhawk 6C固件PX4 v1.14.3。UWB定位系统某品牌一体化模块4个基站1个标签支持TOF输出NMEA串口波特率可设115200。机载电脑树莓派4B走MAVLink方案时需要。数传乐迪或者3DR数传用于QGC无线连接。电池、电调、电机等常规配件就不列了。重点提醒飞控的GPS串口供电能力有限有些UWB标签功耗稍大最好单独供电但必须和飞控共地。共地这个细节如果漏了串口数据会随机错乱排查起来非常难受。3. 保姆级配置流程从接线到起飞3.1 第一步布好UWB基站做好坐标标定UWB定位系统属于“一次性部署”的传感器基站的布局直接决定定位精度。别图省事只放三个基站做二维定位无人机要控高度必须三维定位至少4个基站。我建议室内40米×40米场地放6到8个基站高度尽量一致通常架在3米左右比飞行高度略高避免人或者货物遮挡信号。基站位置标定有两种办法用卷尺/激光测距仪测出每个基站的XYZ坐标手动录入配置软件。用系统自带的自动标定功能先指定一个基站为原点另一个基站为X轴方向第三个基站确定Y轴系统自动算出所有基站坐标。我手动测过坐标也自动标定过自动标定更方便但前提是基站间信号良好、没有被金属货架遮挡。标定完成后一定要把坐标系确认清楚室内定位通常用右手坐标系X和Y在地面平面Z向上。后面跟飞控的NED坐标北东地有区别这个坑后面单独说。3.2 第二步把标签输出改成“假GPS”这一步是核心。一体化UWB标签一般都有串口AT命令或者配置软件需要把标签模式设为“定位标签”输出内容选择NMEA。NMEA语句里GPGGA负责位置信息GPRMC里包含速度信息这两个最好都开。我建议输出格式里务必包含以下信息三维坐标X/Y/Z定位状态固定解/浮点解/无效时间戳有效速度如果模块能算出来波特率我用的115200这个值在飞控GPS口上支持比较稳。需要注意的是有些模块默认输出频率只有1Hz这个一定要改成10Hz以上。1Hz的位置更新喂给PX4做位置控制飞控会很难受横滚俯仰会一顿一顿的甚至直接切回自稳模式。坐标偏移也得在这一步设置。UWB原点的物理位置并不一定是你希望起飞点。比如我希望无人机在厂房门口起飞后定位原点在厂房中心那就在标签配置里把原点坐标偏移值设置成厂房中心相对于基站组原点的偏移量。偏移量正负号很容易搞反强烈建议设置完以后手动拿着标签朝北走看输出坐标是否变大确认一下方向。3.3 第三步接入飞控串口并完成PX4参数配置这里我先说“模拟GPS”接法这也是最不容易出问题的路径。接线UWB标签TX - 飞控GPS1串口 RXPixhawk 6C的GPS1口针脚定义注意看丝印UWB标签RX - 飞控GPS1串口 TX如果只需飞控收数据可以不接但连接上能方便标签回传命令GND - GND 必须共地如果标签是5V电平而飞控GPS口不是电平兼容型一定要加电平转换模块否则长时间运行容易烧飞控串口。接线完成后打开QGroundControl进入“参数”界面改这几个参数GPS_TYPE设为NMEA一般是5具体看固件选项QGC里会显示对应协议。SER_GPS1_BAUD设为115200必须和标签输出波特率一致。EKF2_GPS_CHECK建议先设为0关闭后面数据稳定了再打开。因为UWB的定位特性跟真实GPS不太一样健康检查太严格会导致EKF一直说GPS故障。EKF2_REQ_GPS_H可以设成1米或者暂时调小避免高度检查导致定位降级。改完参数后重启飞控在QGC的“MAVLink控制台”里输入gps status看能不能收到GPS位置信息。正常情况下会看到卫星数显示为0但经纬度已经有值UWB模块模拟出的经纬度定位状态显示3D Fix。很多同学看到“卫星数0”就慌了其实没关系因为数据源不是卫星。3.4 第四步用QGC验证数据质量参数配置好别急着解锁先做静态检查。先在QGC的“仪表盘”页面看地图正常情况下飞控的机标位置应该在你在厂房里的物理位置附近。然后拿着UWB标签或者带着整机缓慢向X正方向走观察地图上机标是否也朝对应方向移动。如果方向反了八成是坐标轴没对齐回到标签配置里改坐标旋转角。另一个检查项是看“飞行日志”里的ekf2_innovations。在QGC设置里打开高级模式记录日志然后手动晃动机身完事看vehicle_gps_position和ekf2_innovations曲线。如果位置创新值一直很大说明EKF不太信任这个位置源通常是坐标系偏移、延迟或者刷新率不够导致。4. 进阶方案用外部位置估计彻底摆脱GPS协议4.1 为什么有些老手不推荐“模拟GPS”模拟GPS方案确实简单但你知道它有个天生的问题GPS协议里带的是经纬度和高度UWB标签为了输出NMEA必须先把你厂房里的局部坐标“平移”到一个虚拟的经纬度原点上。这样一来飞控解算出的NED坐标会带一个巨大的经纬度偏置如果虚拟原点设置不当或者附近恰好有真实GPS信号干扰比如UWB天线旁的手机GPS模块会出现坐标跳变。另外NMEA协议刷新率一般限制在10Hz左右有些UWB系统本身能做到50Hz但模拟GPS后刷新率被压低了。位置控制反应会明显变慢。所以很多做地面机器人或者精细无人机定位的老手更愿意走“外部位置估计”这条路。4.2 用MAVLinkEKF视觉位置融合接管定位所谓的外部位置估计简单说就是不让UWB数据伪装成GPS而是直接通过MAVLink把位置发给PX4PX4里的EKF2会把这份位置当作“外部视觉位置”处理。具体拓扑UWB标签 - 串口/网口 - 机载电脑 - MAVLinkvision_pose/pose- 飞控。机载电脑上如果没有装ROS可以直接用一个Python脚本从串口读UWB数据转成MAVLink消息用pymavlink库发给飞控。如果装了ROS可以用mavros的vision_pose话题。原理都一样。关键参数调整EKF2_AID_MASK在QGC里打开参数把“Vision Position Fusion”选项打开不同版本显示可能略有差异。如果GPS还接着可以把GPS融合关掉避免两个位置源打架。EKF2_HGT_MODE高度源选择“Vision”让UWB的Z轴数据直接参与高度估计。EKF2_EV_DELAY这是外部位置的时间延迟补偿值单位是毫秒。UWB加上机载电脑和MAVLink的数据链路延迟大概会有20到50毫秒这个值需要实测调整。设不对的话飞机在动态飞行时会表现出明显的滞后震荡。这个方案我第一次调试时花了半天主要时间都耗在时间同步上。我的建议是先把EKF2_EV_DELAY设为0看日志里ekf2_innovations的峰值然后一点一点加直到创新值最小。5. 避坑指南这些坑我踩过你直接绕过去5.1 坐标轴转向不对飞机会自己“离家出走”这是最大、最坑、最隐蔽的问题。UWB系统默认的右手坐标系通常是Z向上X/Y可以任意定义PX4内部是NED坐标系X轴指向北Z轴向下。如果你不把UWB坐标系平移到NED对齐飞控会认为你给了它一个奇怪的姿态参考解锁后稍微推到位置模式飞机会突然朝某个方向加速“离家出走”一点也不夸张。我的排查经验在标签固件里把坐标旋转角按实际方位设置。比如你希望UWB原点的正东方向作为飞机的北方向那就在配置里把坐标系逆时针旋转90度。命名规则各个厂商不一样关键看实际效果拿着标签朝正东走QGC地图上机标应该朝上北走这样才对。5.2 EKF报错“GPS故障”其实是健康检查太严格模拟GPS方案下PX4的EKF2对GPS数据有一套严格的健康检查机制包括位置变化量、速度一致性、卫星数等。UWB模拟GPS时往往没有卫星数可能显示0速度也不是由多普勒频移算出来的而是差分得到的噪声大所以特别容易触发检查失败导致EKF拒绝位置更新。遇到这种情况先把EKF2_GPS_CHECK设成0禁用GPS健康检查。如果后续试飞发现位置估计噪声大再挨个打开项检查是哪一项不达标。5.3 UWB有定位没速度飞控反复进位置保持有一次我在试飞时发现飞控明明收到了位置但飞机在位置模式下像喝醉了一样一推摇杆它不前进松杆自己停下。查日志发现EKF的“速度创新值”指标很高。原因是很多UWB模块只输出位置不输出速度PX4内部只能靠位置差分来算速度。位置噪声稍大差分出来的速度就完全没法看。飞控为了安全会降低对位置传感器的信任导致控制很肉。解决办法是尽量让UWB模块输出速度信息如果能或者在EKF参数里调高位置噪声方差、调低速度约束。也可以打开EKF2_PVA_GATE等参数但这些最好在熟悉EKF调参后再动。5.4 多路径效应让位置跳来跳去怎么压UWB虽然抗多路径能力比WiFi强但室内金属货架、铁门、人体遮挡还是会造成反射导致测距出现野值。现象是位置偶尔会跳出去半米一米然后EKF又拉回来。压野值有几个实用手段基站布置尽量避开金属面正对方向天线不要朝向货架。标签天线尽量朝上保持和基站之间有视距。在PX4参数里适当增大EKF2_GPS_POS_X或者对应的位置噪声参数让EKF不那么容易相信突变的位置。实际数值需要试我用的模块最后设成0.25。最大的一招在UWB配置软件里打开“滤波”或者“平滑”选项。很多模块内置了卡尔曼平滑虽然会增加一点延迟但跳变会小很多。5.5 常见问题速查表现象可能原因解决办法QGC收不到GPS数据波特率不匹配检查SER_GPS1_BAUD和标签输出位置方向反了坐标轴旋转角设置错误拿标签朝东走看机标是否朝北飞机解锁后乱冲坐标系严重不对齐立即切回自稳检查NED/ENU旋转EKF一直报GPS故障健康检查触发设EKF2_GPS_CHECK0位置刷新率低控制肉标签输出频率太低设为10Hz以上位置跳变严重多路径/野值调整布局打开平滑滤波6. 定位效果评估与参数调优6.1 看日志这些曲线帮你判断融合质量试飞前一定要录日志。我最常用的几个量vehicle_local_position.x/y/z看位置估计是不是平顺。ekf2_innovations位置/速度创新值越小代表EKF越信得过这个数据源。vehicle_gps_position.fix_type模拟GPS的Fix状态。controller_state看姿态控制是否稳。如果ekf2_innovations里某个轴的创新值长期大于1说明你的UWB数据质量或者时间延迟还有问题。创新值抖动是正常的但均值不能一直偏。6.2 调参顺序和推荐参数范围调参有个顺序别上来就乱改一堆。第一优先保证位置源方向正确、刷新率足够。第二调整EKF对外部位置的信任程度具体参数包括EKF2_GPS_POS_X位置噪声标准差单位米。UWB精度如果在0.1到0.3米那么这个值设0.2左右比较合适。EKF2_GPS_VEL_X速度噪声标准差UWB差分速度噪声可能到1米/秒先设0.5到1。EKF2_EV_DELAY如果走MAVLink外部位置这个值很关键。第三再动控制环参数比如MPC_XY_P、MC_POS_RESP这类一般不需要大动。6.3 UWB替代GPS后的飞行注意事项跑通之后有几个操作上的习惯要养成开机后不要立刻解锁先让UWB标签和基站完成初始化一般等10秒以上确认QGC上位置已经稳定。飞行中如果发现位置突然跳得很夸张切自稳模式不要硬抢。定期检查标签电池UWB标签电量低时测距精度会明显下降。我个人的经验是UWB定位系统在静态场景下非常可靠但在有动态金属物体比如叉车经过时偶尔还是会有跳变提前设好“跳变超限后切自稳”的保护逻辑能少炸几架机。7. 写在最后我的个人体会折腾UWB替代GPS这套方案前后加起来大概两个星期。最深的体会是UWB的精度不输GPS但它的调试思路和GPS完全不一样——GPS是“天上来的数据你只要能收到就行”UWB是“地上布好的网你既要管坐标标定又要管数据链路还得照顾好信号传播环境”。如果让我重来一次我会先把坐标系方向、延迟补偿和野值滤波这三件事同时考虑而不是等飞起来再一个个排雷。希望这篇记录能帮你跳过那些我用炸机换来的教训。后面如果时间允许我会再写一篇基于ROS2和UWB的室内精确起飞降落实现欢迎关注交流。