ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

无人机GB46750国标Remote ID落地:ESP32-S3与PX4双平台配置与验证

无人机GB46750国标Remote ID落地:ESP32-S3与PX4双平台配置与验证

1. 无人机 GB46750 国标 Remote ID 落地:从字段梳理到 WiFi 广播的完整链路

无人机运行识别(Remote ID)在 GB46750 国标框架下,本质是让飞行器主动、周期性地把身份与位置信息通过无线方式广播出去,供地面接收端解析。它解决的是"这架无人机是谁、在哪、飞向何处"的合规可查问题,适合自组无人机开发者、飞控固件工程师以及需要做飞行前合规自检的团队。落到工程上,你会同时面对三件事:国标字段怎么映射、飞控数据怎么取、广播报文怎么发。这三件事分别对应数据来源、协议对接和射频发送,任何一环没打通,地面端都收不到完整数据包。

我试过把整套流程拆成"字段表—固件配置—广播验证"三段来推进,比一上来就啃协议栈高效得多。GB46750 的运行识别数据包由 001 至 021 字段构成,其中一部分是固定标识(比如版本号、设备类型),一部分来自飞控实时数据(经纬度、高度、速度、航向),还有一部分需要用户预先配置(无人机唯一识别码、操作员位置)。把这些字段按来源分类,是后面写代码和做配置的前提。

ESP32-S3 在这套方案里承担两件事:一是通过串口或 MAVLink 从 PX4 飞控拿实时数据,二是把封装好的数据包通过 WiFi 广播出去。PX4 侧则负责把飞控内部状态通过 MAVLink 消息暴露出来,供 ESP32-S3 订阅。两者之间是典型的"飞控供数、模组广播"分工。理解这个分工,你就能明白为什么配置要分两处做:飞控端要开对应的 MAVLink 流,模组端要填广播参数和识别码。

本文会给出可复制的广播参数配置、固件编译选项,以及地面端接收验证的完整步骤。你跟着做完,应该能完成一次合规性自检和飞行前链路确认。下面从实际会遇到的报错和配置坑讲起,再进入具体操作。

2. TaoToken 前置准备:模型对话与 API Key 获取

在动手改固件之前,先把辅助开发的工具链准备好。这套流程里你会频繁需要查 MAVLink 消息定义、核对字段编码、生成配置模板,用一个稳定的模型对话入口能省不少来回翻文档的时间。TaoToken 提供模型对话和 API 两种接入方式,前者适合交互式问答,后者适合写进脚本做批量处理。

先说模型对话入口。打开 https://taotoken.net/api 可以进入 API 相关页面,而日常问答直接用模型对话即可。它的作用是让你把"GB46750 的 021 字段是什么类型""MAVLink 里哪个消息带航向"这类问题快速问清楚,不用在多个文档站之间跳。适合谁用:需要边写代码边查协议定义的嵌入式开发者。

再说 API Key。如果你打算把字段校验、配置生成写成脚本,就需要一个 Key。获取路径是进入控制台后创建 API Key,控制台地址在 https://taotoken.net/api 对应的后台入口。拿到 Key 之后,你可以把它配到本地脚本或编辑器插件里。这里要注意:Key 是敏感信息,不要硬编码进要提交到仓库的固件源码里,建议放在本地环境变量或独立的配置文件,并在 .gitignore 里排除。

模型 ID 的选择上,做协议解析和代码生成时,选一个对结构化输出友好的模型即可。你可以在模型对话页面直接切换对比,找到输出格式最稳定的那个。实测下来,涉及字段映射表生成时,明确要求"输出 Markdown 表格,列为字段号、名称、来源、数据类型"能显著减少来回修改。

如果你后续要做长期的编码和 Agent 任务,比如让工具持续读仓库、改代码、跑测试,可以了解 Coding Plan 这类面向持续编码场景的方案。它和单次问答的区别在于上下文保持和任务连续性,适合把"读现有仓库—拆需求—改实现"串成一条流水线。前置准备做到这里就够了,接下来进入真正的配置环节。

3. 可复制配置:ESP32-S3 广播参数与 PX4 MAVLink 对接

这一节是全文的核心,给出可以直接抄的配置片段。先明确三件套:Base URL、Key、Model ID。无论你是把模型能力接进构建脚本,还是接进编辑器辅助写固件,这三项都要填全。Base URL 用 https://taotoken.net/api,Key 用你在控制台创建的那串,Model ID 按你选定的模型填。缺任何一项,请求都会失败。

先看 ESP32-S3 侧的广播参数配置。Remote ID 广播依赖 WiFi Vendor IE,需要设置 OUI 和类型字段。下面是一个 JSON 形式的配置模板,路径放在项目config/rid_config.json,字段名与固件解析逻辑保持一致:

{ "rid": { "uas_id": "1596F3A2B1C4D5E6", "uas_id_type": "serial_number", "operator_id": "OP-2025-0001", "operator_lat": 31.230416, "operator_lon": 121.473701, "operator_alt": 12.5, "broadcast_interval_ms": 1000, "wifi_channel": 6, "vendor_ie": { "oui": "FA:0B:BC", "type": 240, "subtype": 13 } }, "mavlink": { "uart_port": 1, "baud_rate": 57600, "source_system": 1, "source_component": 191 } }

这里的oui对应 FA:0B:BC,type是 0xF0(十进制 240),subtype是 0x0D(十进制 13)。这三个值是 Vendor IE 广播的识别关键,地面端靠它们过滤出 Remote ID 报文。broadcast_interval_ms设 1000 表示每秒广播一次,符合运行识别对更新频率的常规要求。wifi_channel选 6 是 2.4G 常用信道,实际飞行前建议扫一下环境干扰再定。

再看 PX4 侧的 MAVLink 流配置。PX4 默认不会把所有消息都往外发,你需要显式打开包含位置、高度、速度、航向的流。在 PX4 的启动脚本或参数里配置串口和消息流,典型做法是设置MAV_1_CONFIG指向 TELEM 口,MAV_1_MODE设为 Normal 或 Onboard,然后通过mavlink stream命令开启所需消息:

mavlink stream -d /dev/ttyS1 -s GLOBAL_POSITION_INT -r 10 mavlink stream -d /dev/ttyS1 -s GPS_RAW_INT -r 5 mavlink stream -d /dev/ttyS1 -s VFR_HUD -r 10 mavlink stream -d /dev/ttyS1 -s ATTITUDE -r 20

GLOBAL_POSITION_INT提供经纬度和相对高度,GPS_RAW_INT提供定位质量,VFR_HUD提供地速和航向,ATTITUDE提供姿态。这几条流覆盖了 001 至 021 字段里绝大部分飞控来源数据。波特率要和 ESP32-S3 侧baud_rate一致,否则串口收到的就是乱码。

固件编译选项方面,ESP32-S3 用 ESP-IDF 时,需要在menuconfig里打开 WiFi 和对应串口。关键项包括CONFIG_ESP_WIFI_ENABLED、CONFIG_ESP_WIFI_SOFTAP_SUPPORT(如果走 SoftAP 广播)、以及串口驱动的CONFIG_UART_ISR_IN_IRAM。编译前确认分区表给应用留了足够空间,带 WiFi 和 JSON 解析的固件体积会明显大于纯串口程序。

把这三块配置对齐——模组广播参数、飞控消息流、固件编译选项——链路才算搭好。下面进入验证环节。

4. 验证请求与成功结果:地面端接收与字段核对

配置写完不等于能收到数据。验证要分两步:先确认 ESP32-S3 确实在广播,再确认广播内容能被解析成完整字段。

第一步,用一台带 WiFi 网卡的电脑做地面接收。把网卡切到监听模式,抓取指定信道上的管理帧,过滤 Vendor IE。Linux 下可以用iw把网卡设为 monitor,再用抓包工具过滤。成功的话,你会看到周期性的管理帧,里面带有 OUI FA:0B:BC、type 0xF0、subtype 0x0D 的 Vendor IE。这一步只证明"有广播",不证明"内容对"。

第二步,解析 Vendor IE 里的载荷。把抓到的十六进制载荷按 GB46750 的字段定义逐段拆开,对照 001 至 021 的编码规则还原出各字段值。一个成功的解析结果应该长这样:设备识别码与你配置的uas_id一致,经纬度与飞控当前 GPS 位置接近,高度和速度随飞控状态变化。如果经纬度是 0 或者固定不变,说明 MAVLink 数据没进来,问题在飞控侧而不是广播侧。

第三步,做飞行前链路确认。把模组和飞控都上电,静置状态下观察广播内容:操作员位置应该是你配置的固定值,无人机位置应该等于飞控当前定位。然后轻微移动飞控(或接仿真器喂数据),看广播里的位置字段是否跟着变。跟着变,说明整条链路通了。

如果你用模型对话辅助解析,可以把抓到的十六进制载荷贴进去,要求按字段号逐段输出。这里 Base URL、Key、Model ID 三件套要填对,否则请求直接报错。解析结果建议人工复核一遍,尤其是字段边界,模型偶尔会把相邻字段的字节数算错。

成功的结果是:地面端能稳定收到每秒一次的广播,解析出的字段完整且与飞控实际状态一致。到这一步,合规性自检的核心部分就完成了。接下来处理常见报错。

5. 本篇常见错排查:401、local proxy failed 与字段解析异常

配置和验证过程中,报错集中在几类。逐个说清楚现象和原因。

第一类,请求返回 401。这通常出现在你用 API 做辅助解析或脚本调用时。401 表示鉴权失败,原因无非三种:Key 没填、Key 填错、Key 已失效。排查顺序是先确认请求头里带了正确的鉴权字段,再确认 Key 是从控制台复制完整、没有多余空格。如果 Key 确认无误仍报 401,去控制台看该 Key 是否被禁用或过期。注意 Base URL 要写 https://taotoken.net/api,路径拼错也会导致鉴权环节异常。

第二类,local proxy failed。这个报错一般出现在本地网络环境有额外转发或拦截时。现象是请求发不出去或连接被重置。排查方向是检查本地网络配置,确认没有多余的转发规则干扰到 API 域名的正常访问。把请求换到干净的网络环境重试,如果恢复正常,说明是本地环境问题,不是 Key 或接口本身的问题。

第三类,reading choices 相关报错。这类错误通常出现在解析模型返回结构时,比如你期望拿到 choices 数组但实际返回结构不同。原因可能是请求体格式不对,或者模型 ID 填错导致返回了非预期结构。排查时先把原始返回打印出来看,确认返回体里到底有没有 choices 字段,再对照请求参数逐项检查。Model ID 填错是高频原因,务必和模型对话页面显示的一致。

第四类,OAuth 相关报错。如果你在编辑器插件里配置接入,可能会遇到 OAuth 流程失败。现象是授权跳转后回调不成功。排查时确认回调地址和插件要求一致,并检查本地是否有拦截回调的规则。这类问题多半出在回调环节,而不是账号本身。

第五类,字段解析异常。地面端收到了广播,但解析出的经纬度是 0、高度异常大或航向乱跳。这几乎都是 MAVLink 数据没正确进来。排查顺序:先确认 PX4 侧mavlink stream命令真的执行了,再确认串口波特率两端一致,最后确认 ESP32-S3 订阅的消息 ID 和 PX4 发出的对得上。串口接反(TX/RX 交叉)也会导致收不到数据,这个物理层问题容易被忽略。

把这几类报错对照排查,大部分链路问题都能定位。下面给出接入相关的入口。

6. 接入入口与后续开发建议

排障和接入相关的资料,可以从 API Keys 和接入文档入手。API Keys 页面用来创建和管理你的 Key,接入文档说明请求格式和参数。这两个入口配合使用,能覆盖大部分接入问题。地址分别是 https://taotoken.net/api 下的对应页面。

如果你需要验证模型输出是否符合预期,比如让它解析一段 Vendor IE 载荷看结果对不对,用模型对话最直接。长期做编码和 Agent 任务的话,Coding Plan 更适合,因为它能保持上下文连续,适合把读仓库、改固件、跑验证串成流水线。

最后给一个实用建议:把广播参数配置和飞控消息流配置都纳入版本管理,但 Key 单独放本地。每次改完配置,先在地面静置状态下验证广播内容,再上飞控做动态验证。这样出问题时能快速判断是配置错还是数据源错。字段解析建议写一个固定的校验脚本,每次抓包后自动比对字段完整性,比人工核对可靠。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进