ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ELRS与ArduPilot CRSF协议配置指南:遥测、失控保护与Yaapu脚本

ELRS与ArduPilot CRSF协议配置指南:遥测、失控保护与Yaapu脚本 1. 为什么ELRS加ArduPilot是当前穿越机与固定翼玩家的高性价比组合如果你最近两年一直在玩穿越机或者固定翼大概率会注意到一个趋势身边越来越多的飞手把遥控器换成了带ELRS高频头的方案飞控端则从Betaflight慢慢转向了ArduPilot。这个组合不是偶然流行起来的它背后有非常实际的成本、性能和功能三重驱动。ELRS的全称是ExpressLRS是一套开源的高频头与接收机固件方案。它最直接的吸引力在于硬件成本极低一对发射和接收模块可能只要百元出头但能实现几十公里级别的稳定链路同时保持极低的延迟。而ArduPilot则是目前开源飞控固件里功能最全面的一个从多旋翼、固定翼到无人车、船几乎覆盖了所有你能想到的载具类型它的航线规划、自动起飞降落、遥测回传、故障保护逻辑都做得非常成熟。把这两者搭在一起你得到的是一套成本可控、链路可靠、还能在遥控器上实时看到飞控完整遥测数据的系统。这跟早期玩ArduPilot必须配一个昂贵的数传电台或者图传OSD才能看到高度、速度、GPS星数的情况完全不同。ELRS的CRSF协议天然支持双向通信飞控可以把遥测数据通过接收机回传给遥控器遥控器上就能直接显示这些信息不需要额外的数传模块。但问题也恰恰出在这里。很多人第一次配置ELRS加ArduPilot的时候会发现遥控器能控制舵面但遥测数据死活出不来或者只出来一部分。也有人刷完固件之后发现通道映射全乱了或者失控保护根本不触发。这些坑我在过去一年多里几乎踩了个遍所以这篇文章不打算只给你一个“照着做就行”的步骤清单而是把每个环节背后的逻辑讲清楚让你遇到问题时知道该往哪个方向排查。这篇文章适合三类人第一类是刚从Betaflight转过来、第一次接触ArduPilot的飞手第二类是已经用ELRS飞穿越机想把它迁移到ArduPilot固定翼或者多旋翼上的玩家第三类是已经配通了基本控制但遥测显示不全、想进一步挖掘CRSF协议能力的人。不管你是哪一种下面的内容都会从最基础的接线一直讲到遥控器上自定义遥测页面的高级玩法。2. ELRS与ArduPilot之间的CRSF协议到底在传什么2.1 CRSF不是单纯的遥控协议它是双向串口协议很多人对CRSF的理解停留在“一种遥控信号协议”这个理解不算错但不够完整。CRSF的全称是Crossfire最早是TBSTeam BlackSheep搞出来的一套协议后来被ELRS采纳并做了开源实现。它的物理层是一根串口线也就是TX和RX两根信号线加电源地波特率通常跑在420000或者115200ELRS默认用420000。也就是说飞控和接收机之间不是通过PWM脉冲传递通道信息的而是通过串口数据包。这个区别非常关键。PWM时代每个通道对应一根线接收机把每个通道的脉宽传给飞控飞控再解析。而CRSF是把所有通道数据打包成一个帧通过串口发过去。一个标准的CRSF帧里可以包含最多16个通道每个通道11位分辨率同时还有遥测数据的回传通道。这意味着同一根线既传控制指令又传飞控状态数据这就是为什么ELRS能做到“一根线搞定控制和遥测”。在ArduPilot这边你需要把接收机的CRSF输出接到飞控的一个串口上然后在参数里把这个串口的协议设成23RCIN。这个数字23就是ArduPilot里代表CRSF的协议编号。设置完之后飞控就会从这个串口读取通道数据同时通过同一个串口把遥测数据发回给接收机。2.2 遥测数据是怎么从飞控回到遥控器的遥测回传的链路是这样的飞控通过串口把遥测数据发给接收机接收机通过无线链路发给发射机高频头高频头再通过串口或者USB把数据传给遥控器。遥控器上的EdgeTX或者OpenTX系统里有一个叫“遥测”的模块它会解析这些数据并显示出来。这里有一个容易忽略的点ELRS的遥测带宽是有限的。它不是把所有飞控数据都无脑回传而是有一个“遥测比例”的概念。你可以在ELRS的配置里设置遥测回传的速率比如1:64、1:128这样的比例。比例越高回传越频繁但会占用更多的无线链路时间可能影响控制信号的更新率。对于ArduPilot来说默认的遥测数据量比较大如果你把遥测比例设得太激进可能会发现控制延迟变大。我一般建议从1:64开始试如果遥控器上遥测刷新太慢再调整。另外ArduPilot回传的遥测数据不是全部都能被ELRS直接识别的。ELRS固件里内置了一套遥测数据的解析逻辑它认识哪些传感器ID就会把对应的数据转发给遥控器。比如GPS经纬度、高度、速度、电池电压、电流、飞行模式、GPS星数这些是标准支持的。但像EKF状态、振动水平、日志记录状态这些更底层的飞控内部数据ELRS默认是不转发的。如果你需要这些就得用Yaapu遥测脚本这个后面会详细讲。2.3 通道映射为什么容易乱通道映射混乱是新手最常见的问题之一。原因在于ELRS接收机输出的通道顺序和ArduPilot默认期望的通道顺序可能不一致。ELRS默认的通道顺序是AETR副翼、升降、油门、方向而ArduPilot默认的遥控器通道映射是Roll、Pitch、Throttle、Yaw也就是RPTY。这两个顺序在大多数情况下是一致的但如果你在遥控器上改了通道顺序或者在ELRS配置里调整了通道映射就可能对不上。更麻烦的是ArduPilot有一个RCMAP参数组它定义了飞控认为每个功能对应哪个通道。比如RCMAP_ROLL默认是1RCMAP_PITCH默认是2RCMAP_THROTTLE默认是3RCMAP_YAW默认是4。如果你发现打杆之后飞机反应不对第一件事就是去遥控器的通道监视器里看每个通道的输出然后再去ArduPilot的RCMAP参数里核对。这两个地方对上了控制就不会乱。3. 从接线到参数一步步把ELRS接收机接进ArduPilot3.1 硬件接线中最容易接错的两根线ELRS接收机通常有四个焊盘5V、GND、TX、RX。飞控这边你要找一个空闲的串口比如UART2或者UART6。接线的时候接收机的TX要接到飞控的RX接收机的RX要接到飞控的TX。这个交叉接法是串口通信的基本规则但很多人第一次接的时候会想当然地TX对TX、RX对RX结果就是完全没反应。我自己的习惯是先用万用表确认一下飞控串口的TX和RX焊盘位置因为不同飞控的丝印标注方式不一样有的标TX2/RX2有的标UART2_TX/UART2_RX还有的只标一个数字。确认清楚之后再焊焊完用万用表蜂鸣档测一下有没有虚焊或者短路。这一步花两分钟能省掉后面半小时的排查时间。还有一个容易忽略的点是供电。ELRS接收机的工作电压范围一般是5V但有些飞控的串口供电能力有限特别是当你同时接了GPS、光流、图传等多个外设的时候。如果你发现接收机偶尔失联或者遥测断断续续可以试试从飞控的另一个5V焊盘单独给接收机供电或者加一个小的滤波电容。3.2 ArduPilot串口参数的正确设置顺序接线完成之后打开Mission Planner或者QGroundControl进入参数设置页面。你需要设置三个参数SERIALx_PROTOCOL、SERIALx_BAUD和RC_PROTOCOLS。SERIALx_PROTOCOL里的x对应你接接收机的那个串口编号。比如你接的是UART2就设SERIAL2_PROTOCOL23。这个23就是CRSF协议。SERIALx_BAUD设成420000这是ELRS的默认波特率。如果你用的是老版本的ELRS固件可能是115200那就设成115200。RC_PROTOCOLS这个参数是告诉飞控从哪个串口读取遥控信号设成1表示只从第一个RC串口读设成2表示从第二个以此类推。如果你只接了一个接收机设成1就行。设置完这些参数之后重启飞控。重启之后去遥控器上给接收机上电然后在Mission Planner的“遥控器校准”页面里看看有没有通道条在动。如果通道条不动先检查接收机的LED灯是不是常亮常亮表示已经和发射机对频成功。如果灯在闪说明没有对频需要重新对频。3.3 遥控器端的通道顺序和失控保护设置遥控器这边如果你用的是EdgeTX进入模型设置里的“通道”页面确认通道顺序是AETR。然后进入“外部高频头”设置确认ELRS高频头的协议选的是CRSF波特率是420000。有些遥控器需要手动设置高频头的波特率有些会自动识别。失控保护是必须设置的。ELRS的失控保护有两种触发方式一种是接收机检测不到发射机信号时自动触发另一种是飞控检测不到接收机信号时触发。我建议两个都设。在ELRS配置里把失控保护模式设成“No Pulses”这样接收机失联时不会输出任何通道信号飞控就会进入失控保护逻辑。在ArduPilot里设置FS_THR_ENABLE1FS_THR_VALUE设成一个比最低油门稍高的值比如975。这样当飞控收不到接收机信号时就会自动进入返航或者降落模式。这里有一个细节ELRS的失控保护触发时间是可以设置的。默认可能是几秒钟你可以根据自己的机型调整。对于固定翼我一般设成1秒左右因为固定翼失联后如果太久不触发返航可能已经飞出很远了。对于多旋翼可以稍微长一点2秒左右避免因为短暂的信号遮挡就触发返航。4. 让遥控器显示完整遥测Yaapu脚本的配置与调优4.1 为什么ELRS自带的遥测显示不够用ELRS固件本身会把一部分飞控遥测数据转发给遥控器你在遥控器的遥测页面里能看到一些基本数值比如GPS高度、速度、电压。但这个显示方式很原始就是一行一行的数字没有图形化界面也没有语音播报。而且很多ArduPilot特有的数据比如飞行模式、EKF状态、GPS定位类型、Home点距离和方位ELRS默认是不转发的。Yaapu遥测脚本就是来解决这个问题的。它是一个运行在EdgeTX/OpenTX遥控器上的Lua脚本通过解析CRSF协议里的遥测数据在遥控器屏幕上绘制出一个完整的飞行仪表盘。你能看到姿态仪、高度表、速度表、GPS星数、电池电压电流、飞行模式、Home点箭头、甚至风估计和爬升率。而且它支持语音播报比如“GPS定位已获得”“电池电压低”“进入返航模式”这些提示。4.2 Yaapu脚本的安装和参数配置安装Yaapu脚本的第一步是确认你的遥控器支持Lua脚本。大部分较新的EdgeTX遥控器都支持比如Radiomaster TX16S、Jumper T16、FrSky X10/X12等。你需要在遥控器的SD卡里创建一个SCRIPTS/TELEMETRY文件夹然后把Yaapu的脚本文件复制进去。接下来是配置ArduPilot这边的遥测数据转发。Yaapu脚本依赖CRSF协议里的特定遥测帧你需要确保飞控把正确的数据发出来。在ArduPilot参数里设置CRSF_TELEMETRY_ENABLE1CRSF_TELEMETRY_RATE设成合适的值。这个速率决定了飞控每秒发送多少个遥测帧设得太高会占用串口带宽设得太低遥控器上刷新会卡顿。我一般设成10Hz左右也就是每秒10帧这样遥控器上的显示比较流畅又不会给串口太大压力。然后在遥控器的遥测页面里你需要把Yaapu脚本添加为一个遥测页面。具体操作是进入遥控器的“显示”设置选择“遥测页面”然后添加一个“脚本”类型的页面选择Yaapu脚本。添加完之后你还需要在脚本的设置里指定它从哪个遥测传感器读取数据。通常Yaapu脚本会自动检测但如果没有自动检测到你需要手动指定。4.3 遥测刷新率和失控保护之间的平衡这里有一个很多人会忽略的权衡遥测刷新率和失控保护响应时间是有冲突的。ELRS的无线链路时间被分成很多个时隙一部分用来传控制信号一部分用来传遥测信号。如果你把遥测比例设得很高比如1:2那么遥测数据占用的时隙就多控制信号的更新率就会下降。对于穿越机来说控制更新率下降是致命的因为你需要极低的延迟来打杆。我的建议是对于多旋翼和固定翼遥测比例设成1:64或者1:128就够了。Yaapu脚本在10Hz的遥测速率下已经能显示得很流畅不需要更高的刷新率。对于穿越机如果你主要用ELRS飞手动模式遥测比例可以设得更低比如1:256把更多的链路时间留给控制信号。但如果你飞的是ArduPilot的自动航线模式遥测刷新率可以适当提高因为自动模式下你对控制延迟的敏感度没那么高。还有一个技巧你可以把Yaapu脚本的语音播报关掉只保留屏幕显示。语音播报会占用遥控器的处理资源有时候会导致屏幕刷新变慢。如果你需要语音提示可以只保留几个关键的播报项比如电池低电压和GPS定位状态其他的关掉。5. 那些让我折腾了大半天的坑和最终解决方案5.1 遥测数据只出来一半CRSF帧长度限制我第一次配Yaapu脚本的时候发现遥控器上只显示了GPS高度和电压速度、飞行模式、Home点距离全都没有。我以为是脚本没装好重装了好几遍后来才发现是CRSF帧长度的问题。ELRS的遥测帧有长度限制默认只能携带一定数量的传感器数据。如果你启用了太多遥测传感器后面的数据就会被截断。解决办法是在ArduPilot里精简遥测传感器的数量。进入参数列表找到CRSF相关的遥测传感器使能参数把不需要的传感器关掉。比如你不需要电流数据就把电流传感器关掉不需要风速估计就把风速传感器关掉。只保留Yaapu脚本真正需要的那些GPS、高度、速度、电压、飞行模式、Home点。这样帧长度就不会超限所有数据都能正常显示。5.2 遥控器上遥测数值跳动严重串口波特率不匹配有一次我帮朋友配ELRS加ArduPilot遥控器上的遥测数值一直在跳高度从0跳到50又跳回0速度也是乱跳。我一开始以为是GPS没定位后来发现GPS星数已经12颗了定位是好的。最后查出来是串口波特率不匹配。他的ELRS接收机固件是旧版本默认波特率是115200但我在ArduPilot里设的是420000。波特率不匹配的时候串口通信不会完全断掉但会出现大量误码导致遥测数据解析错误。解决办法很简单确认ELRS接收机的固件版本然后查一下这个版本对应的默认波特率。如果不确定可以先把ArduPilot的SERIALx_BAUD设成115200试试如果遥测正常了说明就是波特率的问题。或者你也可以把ELRS接收机刷成最新固件最新固件默认都是420000。5.3 失控保护不触发接收机输出模式设错了失控保护这个问题困扰了我很久。我在ArduPilot里设了FS_THR_ENABLE1在ELRS里也设了失控保护但每次关掉遥控器飞机就是不进入返航模式。后来用Mission Planner的“遥控器校准”页面观察发现关掉遥控器之后通道条并没有降到最低而是保持在最后一个位置不动。原因是ELRS接收机的失控保护输出模式设成了“Hold”也就是失联时保持最后一个通道值不变。这个模式下飞控收到的通道信号一直是正常的所以不会触发失控保护。正确的设置应该是“No Pulses”失联时接收机停止输出任何脉冲信号飞控检测到信号丢失才会触发失控保护。这个设置在高频头的配置页面里不同版本的ELRS配置界面可能不太一样但一般都在“失控保护”或者“Failsafe”选项卡里。5.4 遥控器通道映射错乱RCMAP参数被意外修改有一次我刷完ArduPilot固件之后发现打副翼杆飞机却俯仰打升降杆飞机却滚转。我检查了遥控器的通道顺序是AETR没错。后来在ArduPilot参数里发现RCMAP_ROLL被设成了2RCMAP_PITCH被设成了1也就是Roll和Pitch对调了。这个参数可能是刷固件的时候被重置了也可能是我不小心改到了。解决办法就是进入RCMAP参数组把每个功能对应的通道号重新核对一遍。默认情况下RCMAP_ROLL1RCMAP_PITCH2RCMAP_THROTTLE3RCMAP_YAW4。如果你在遥控器上改了通道顺序比如把油门放在第1通道那RCMAP_THROTTLE就要设成1。核对完之后在Mission Planner的“遥控器校准”页面里打杆看看每个通道的响应是不是和预期一致。6. 进阶玩法用CRSF协议挖掘更多飞控数据6.1 自定义遥测传感器映射ArduPilot的CRSF遥测实现里有一个传感器映射表它定义了每个遥测数据对应CRSF协议里的哪个传感器ID。默认的映射表已经覆盖了大部分常用数据但如果你想要显示一些非标准的数据比如EKF的方差值或者振动水平你可以自己修改这个映射表。具体做法是在ArduPilot的源码里找到CRSF遥测相关的文件修改传感器ID的映射关系然后重新编译固件。这个过程需要你搭建ArduPilot的编译环境在Ubuntu下用waf工具编译。编译环境的搭建本身就是一个不小的工程需要安装一堆依赖包配置交叉编译工具链。如果你只是想显示一些额外的数据我建议先看看Yaapu脚本有没有现成的支持因为Yaapu脚本已经覆盖了大部分常用数据自己改源码编译固件的性价比不高。6.2 用ELRS的WiFi功能做无线调参ELRS接收机和发射机都支持WiFi功能。接收机上电之后如果在一定时间内没有和发射机对频它会进入WiFi模式你可以用手机或者电脑连上它的WiFi热点然后通过浏览器访问它的配置页面。这个功能在调参的时候非常有用特别是当飞控装在机身内部、USB口不好插的时候。你可以通过WiFi页面修改接收机的参数比如波特率、失控保护模式、遥测比例。也可以查看接收机的信号质量、丢包率、链路统计。对于ArduPilot来说你还可以通过ELRS的MAVLink隧道功能把飞控的MAVLink数据通过ELRS链路传到地面站。这个功能叫MAVLink over CRSF需要在ArduPilot里设置CRSF_MAVLink_ENABLE1然后在ELRS配置里启用MAVLink隧道。这样你就不需要额外的数传电台了直接用遥控器链路就能连Mission Planner。6.3 多接收机冗余配置对于大型固定翼或者长航时多旋翼链路冗余是一个值得考虑的方案。你可以装两个ELRS接收机分别接到飞控的两个不同串口上然后在ArduPilot里设置RC_PROTOCOLS3表示从两个串口同时读取遥控信号。如果一个接收机失联飞控会自动切换到另一个。这个配置需要两个接收机都对频到同一个发射机ELRS支持一个发射机对多个接收机。不过这个方案有一个限制两个接收机不能同时工作在同一个频段上否则会互相干扰。ELRS的解决方案是让两个接收机工作在同一个频段但不同的跳频序列上这样它们不会互相干扰但发射机需要同时管理两个接收机的跳频同步。这个功能在ELRS的较新固件里已经支持但配置起来稍微复杂一些需要在高频头配置里启用“多接收机”模式然后分别对频。7. 我在这套系统上积累的几个实用习惯第一个习惯是每次改完参数之后一定在Mission Planner的“消息”页面里看一遍飞控启动日志。ArduPilot启动的时候会打印每个串口的初始化状态如果CRSF串口初始化失败日志里会有明确的错误提示。这个习惯帮我省了很多猜测的时间因为很多时候问题就明明白白写在日志里只是我们没去看。第二个习惯是给ELRS接收机的天线做好固定和保护。ELRS接收机通常配的是一根细长的天线在飞行过程中如果天线晃动或者被螺旋桨打到信号质量会急剧下降。我一般用热缩管把天线根部固定住然后用扎带把天线引到机身外部尽量远离碳纤维和金属部件。碳纤维对2.4G信号的遮挡非常严重天线如果贴在碳板上有效距离可能直接减半。第三个习惯是定期检查ELRS的固件版本。ELRS的固件更新比较频繁新版本经常会修复一些遥测相关的bug或者增加新的遥测传感器支持。我一般每隔两三个月就会去ELRS的配置器里看一下有没有新固件如果有就顺手刷一下。刷固件的时候注意发射机和接收机的版本要匹配版本不匹配可能会导致对频失败或者遥测异常。第四个习惯是在遥控器上设置一个遥测数据记录功能。EdgeTX支持把遥测数据记录到SD卡里飞行结束后可以把日志导出来分析。这个功能对于排查链路问题特别有用你可以看到飞行过程中信号质量的变化曲线判断是哪个位置、哪个动作导致了信号衰减。我有一次飞固定翼遥控器上遥测时断时续后来看日志发现是转弯的时候天线被机身遮挡导致的调整天线位置之后就再也没出现过。
返回列表