☰
PX4 OpenDroneIdBasicId 消息详解:无人机远程身份标识(Remote ID)的 UORB 数据结构与广播实现
2026/9/29 2:40:03 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

导读:本文围绕 PX4-Autopilot 中的open_drone_id_basic_idUORB 主题(对应文档 docs/en/msg_docs/OpenDroneIdBasicId.md)展开,解析其 5 个字段的语义与取值范围,并沿 MAVLink 流与 DroneCAN 两条数据通路,深入源码说明 PX4 如何在缺乏外部发布者时自动生成 Basic ID 消息。读完本文,你将理解无人机 Remote ID 广播链路中"身份标识"一节的数据来源、字段填充规则与验证调试方法。

一、消息背景:Open Drone ID 与 Remote ID

Remote ID(远程识别)是日本、美国(FAA)与欧盟等地针对无人机强制推行的技术,要求无人机实时广播自身位置/高度、序列号、操作员 ID/位置、状态等信息,以实现无人机与其他航空器共享空域。Open Drone ID 是该规范的开放实现,PX4 通过 docs/en/peripherals/remote_id.md 中描述的方式与支持 Open Drone ID MAVLink 协议或 Remote ID over CAN(DroneCAN)的硬件模块协同工作。

在这一体系中,OpenDroneIdBasicId是承载"无人机身份信息"(本质上是序列号)的 UORB 消息,对应 MAVLink 的OPEN_DRONE_ID_BASIC_ID报文。它与OpenDroneIdSystem、OpenDroneIdLocation、OpenDroneIdSelfId、OpenDroneIdOperatorId、OpenDroneIdArmStatus等消息共同构成 PX4 的 Open Drone ID 消息族(对应源码见 msg 目录与 src/modules/mavlink/mavlink_messages.cpp 中的流注册)。

二、消息定义与字段详解

该消息的 UORB 主题名为open_drone_id_basic_id,定义文件为 msg/OpenDroneIdBasicId.msg,完整字段如下:

字段类型说明
timestampuint64时间戳(微秒),uORB 消息的标准首字段,由发布方填写
id_or_macuint8[20]仅用于接收自其他 UA(无人航空器)的 drone ID 数据;无空终止符,长度不足时以零填充
id_typeuint8遵循 MAVLinkMAV_ODID_ID_TYPE枚举,指明uas_id字段采用的格式
ua_typeuint8遵循 MAVLinkMAV_ODID_UA_TYPE枚举,指明无人航空器(UA)的类型
uas_iduint8[20]UAS(无人航空器系统)ID,格式由id_type指定;无空终止符,长度不足时以零填充

原始.msg定义如下:

uint64 timestamp uint8[20] id_or_mac # Only used for drone ID data received from other UAs, no null termination, null filled if shorter uint8 id_type # MAV_ODID_ID_TYPE: indicates the format for the uas_id field uint8 ua_type # MAV_ODID_UA_TYPE: indicates the type of UA (Unmanned Aircraft) uint8[20] uas_id # UAS (Unmanned Aircraft System) ID following the format specified by id_type, no null termination, null filled if shorter

值得注意的设计细节:

  • id_or_mac与uas_id均为 20 字节定长数组。注释明确"无空终止符(no null termination)、长度不足时以零填充(null filled if shorter)",因此消费方不能按 C 字符串方式用strlen截断处理,而应使用固定长度(20 字节)进行拷贝或比较。
  • id_or_mac仅在接收场景使用。当本机是从其他无人航空器收到 drone ID 数据时,该字段承载对方的 ID/MAC;本机作为广播源时该字段留空。这一点在下方实现章节会看到:MAVLink 流与 DroneCAN 发送路径中都明确注释"Only used for drone ID data received from other UAs"且不填充该字段。
  • id_type决定uas_id的编码格式。PX4 当前实现固定使用MAV_ODID_ID_TYPE_SERIAL_NUMBER(见下文源码),并存在"尚未按 ANSI/CTA-2063 格式编码"的 TODO 限制。

三、id_type 与 ua_type 的枚举语义与映射

3.1 id_type:UAS ID 的格式标识

id_type采用 MAVLinkMAV_ODID_ID_TYPE枚举值,指明uas_id的编码格式(如序列号、CAA 分配的 ID、UTM 分配的 ID 等)。从 PX4 源码看,两条广播路径目前均将id_type固定为MAV_ODID_ID_TYPE_SERIAL_NUMBER(序列号格式),并附有 TODO 注释指出序列号需要符合 ANSI/CTA-2063 格式要求,见 src/modules/mavlink/streams/OPEN_DRONE_ID_BASIC_ID.hpp 与 src/drivers/uavcan/remoteid.cpp。

3.2 ua_type:无人机类型映射

ua_type表示无人航空器(UA)的类型。PX4 在 src/modules/mavlink/open_drone_id_translations.cpp 中提供了odidTypeForMavType()函数,将飞控内部的MAV_TYPE_*系统类型(来自vehicle_status.system_type)映射为MAV_ODID_UA_TYPE枚举。常见映射如下(完整映射见源码):

MAV_TYPE(飞控系统类型)MAV_ODID_UA_TYPE(Remote ID 无人机类型)
MAV_TYPE_GENERICMAV_ODID_UA_TYPE_OTHER
MAV_TYPE_FIXED_WINGMAV_ODID_UA_TYPE_AEROPLANE
MAV_TYPE_QUADROTOR/HELICOPTER/COAXIAL/HEXAROTOR/OCTOROTOR/TRICOPTER/DODECAROTORMAV_ODID_UA_TYPE_HELICOPTER_OR_MULTIROTOR
MAV_TYPE_AIRSHIPMAV_ODID_UA_TYPE_AIRSHIP
MAV_TYPE_FREE_BALLOONMAV_ODID_UA_TYPE_FREE_BALLOON
MAV_TYPE_ROCKETMAV_ODID_UA_TYPE_ROCKET
MAV_TYPE_GROUND_ROVERMAV_ODID_UA_TYPE_GROUND_OBSTACLE
MAV_TYPE_FLAPPING_WINGMAV_ODID_UA_TYPE_ORNITHOPTER
MAV_TYPE_KITEMAV_ODID_UA_TYPE_KITE
MAV_TYPE_VTOL_TAILSITTER_DUOROTOR等所有 VTOL 机型MAV_ODID_UA_TYPE_HYBRID_LIFT
MAV_TYPE_PARAFOIL/MAV_TYPE_PARACHUTEMAV_ODID_UA_TYPE_FREE_FALL_PARACHUTE
MAV_TYPE_GCS/MAV_TYPE_ANTENNA_TRACKER/MAV_TYPE_GIMBAL等非飞行器类型MAV_ODID_UA_TYPE_NONE
未知类型(default)MAV_ODID_UA_TYPE_OTHER

从源码结构看,该映射函数被 MAVLink 流(OPEN_DRONE_ID_BASIC_ID.hpp)与 DroneCAN 控制器(remoteid.cpp)共同复用,保证了同一机架在两条链路广播的ua_type一致。

四、数据流:从 uORB 到 MAVLink 广播的完整链路

4.1 MAVLink 流实现(OPEN_DRONE_ID_BASIC_ID)

PX4 将 UORB 主题open_drone_id_basic_id与 MAVLink 报文OPEN_DRONE_ID_BASIC_ID关联的流定义在 src/modules/mavlink/streams/OPEN_DRONE_ID_BASIC_ID.hpp,并通过 src/modules/mavlink/mavlink_messages.cpp 中#if defined(OPEN_DRONE_ID_BASIC_ID_HPP)的条件编译注册。其send()逻辑体现了双源回退策略:

  1. 外部发布者优先:若 UORB 主题open_drone_id_basic_id已被发布(advertised()为真,例如有其他模块收到了其他无人机的 Remote ID 数据),则拷贝其id_type、ua_type与uas_id直接转发,并通过static_assert保证两处uas_id大小一致(20 字节),随后以mavlink_msg_open_drone_id_basic_id_send_struct发出。id_or_mac字段在此路径下同样不填充。
  2. 本机自动生成(默认路径):当没有外部发布者时,流会订阅vehicle_status主题(ORB_ID(vehicle_status)),在状态更新时自动生成一条 Basic ID:
    • target_system/target_component均置 0,表示广播(broadcast);
    • id_type固定为MAV_ODID_ID_TYPE_SERIAL_NUMBER;
    • ua_type由open_drone_id_translations::odidTypeForMavType(vehicle_status.system_type)映射得到;
    • uas_id由board_get_px4_guid_formated()填充——即飞控的 PX4 GUID(唯一标识符)的格式化字符串,充当本机序列号(源码注释同时标注 TODO:序列号格式需符合 ANSI/CTA-2063)。

这也解释了 docs/en/peripherals/remote_id.md 中"无需显式启用 Remote ID"的结论:即使未连接任何 Remote ID 硬件,PX4 也会基于自身状态生成并广播OPEN_DRONE_ID_BASIC_ID(该报文在normal、onboard、usb、onboard low bandwidth等流模式下按请求发送,需通过MAV_CMD_SET_MESSAGE_INTERVAL主动请求,而非像OPEN_DRONE_ID_LOCATION/OPEN_DRONE_ID_SYSTEM那样默认以 1 Hz 周期流式发送)。

4.2 DroneCAN 路径实现(remoteid.cpp)

对于通过 CAN 总线接入的 Remote ID 硬件,PX4 在 src/drivers/uavcan/remoteid.cpp 中实现了UavcanRemoteIDController,通过_timer.startPeriodic(1000 / MAX_RATE_HZ)周期性调用periodic_update(),进而执行send_basic_id()。其逻辑与 MAVLink 流几乎一致:

  • 若 UORB 主题open_drone_id_basic_id已被发布,则拷贝id_type、ua_type,并把 20 字节的uas_id逐个push_back到 DroneCANBasicID消息的定长数组字段(同样有static_assert做大小校验);
  • 否则使用默认值:id_type = ODID_ID_TYPE_SERIAL_NUMBER,ua_type由odidTypeForMavType()映射,uas_id取自board_get_px4_guid_formated();
  • 最终通过_uavcan_pub_remoteid_basicid.broadcast(msg)在 CAN 总线上广播。

该控制器还同时广播Location、SelfID、System、OperatorID等 DroneCAN Remote ID 消息,并订阅ArmStatus用于 Remote ID 健康检查,是整个 CAN 链路 Remote ID 功能的汇聚点。

五、配置、验证与调试

5.1 硬件接入与串口配置

Remote ID 设备可接在飞控任意空闲串口或 CAN 口上,常见做法是直连TELEM2(该口默认配置了 MAVLink)。以 TELEM2 为例,需在 QGroundControl 中设置以下参数(详见 docs/en/peripherals/remote_id.md):

  • MAV_1_CONFIG=TELEM 2
  • MAV_1_MODE= Normal
  • MAV_1_RATE= 0(使用端口默认发送速率)
  • MAV_1_FORWARD= Enabled

重启飞控后会出现新参数SER_TEL2_BAUD,波特率取决于所用 Remote ID 型号(如 Cube ID 需设为 57600)。若走 CAN 链路,则需将UAVCAN_ENABLE设为非零值以启用 DroneCAN。

5.2 验证 Basic ID 消息是否在广播

根据 docs/en/peripherals/remote_id.md 的调试章节,可用 QGroundControl 的Analyze Tools > MAVLink Inspector观察是否出现OPEN_DRONE_ID_BASIC_ID与OPEN_DRONE_ID_LOCATION报文。若消息缺失,可在 QGC MAVLink 控制台中执行:

uavcan status

以确认 Remote ID 的 CAN 节点是否出现在在线节点列表中(例如125 OK OPERAT)。若 CAN 节点存在但消息缺失,则需在 QGCApplication Settings中启用 Remote ID 视图并填写 Basic / Operator / Self ID 信息后重试。

5.3 起飞前的门控:COM_ARM_ODID

PX4 v1.18 起,COM_ARM_ODID参数同时配置 Remote ID 系统的起飞前检查与飞行中失效保护:UAV 只有在收到 Remote ID 的HEARTBEAT消息后才允许解锁(arming);将该参数设为1可改为"仅告警但仍允许解锁"。该参数与OPEN_DRONE_ID_ARM_STATUS消息共同构成 Remote ID 健康评估机制。

六、合规性现状与已知限制

Open Drone ID 功能在 PX4 中仍标记为Experimental(实验特性),相关说明见 docs/en/peripherals/remote_id.md。围绕OpenDroneIdBasicId消息,当前实现存在以下已知限制(均有源码或文档依据):

  • 序列号格式不完整:uas_id虽声明为MAV_ODID_ID_TYPE_SERIAL_NUMBER,但源码注释明确"TODO: needs to be ANSI/CTA-2063 format",即当前直接使用board_get_px4_guid_formated()的 GUID 字符串,尚未满足 ANSI/CTA-2063 标准序列号格式要求;
  • id_or_mac未被填充:两条广播路径均未写入该字段,它只在未来接收其他 UA 的 drone ID 数据场景中才会使用;
  • 广播方式限制:OPEN_DRONE_ID_BASIC_ID默认按请求发送(需MAV_CMD_SET_MESSAGE_INTERVAL主动请求),与默认 1 Hz 周期广播的OPEN_DRONE_ID_LOCATION、OPEN_DRONE_ID_SYSTEM不同;
  • 合规性缺口:PX4 v1.14 及早期版本未处理OPEN_DRONE_ID_ARM_STATUS,解锁仅以 Remote ID 设备的HEARTBEAT为条件,距离 FAA 标准要求的"以 Remote ID 硬件就绪状态为解锁条件"仍有差距。

七、关联消息一览

OpenDroneIdBasicId属于 PX4 Open Drone ID 消息族的一员,便于整体理解,该族还包含以下 UORB 消息(对应文档位于 docs/en/msg_docs):

UORB 消息对应 MAVLink 报文作用
OpenDroneIdBasicIdOPEN_DRONE_ID_BASIC_ID无人机身份信息(序列号)
OpenDroneIdLocationOPEN_DRONE_ID_LOCATION无人机位置、高度、航向、速度
OpenDroneIdSystemOPEN_DRONE_ID_SYSTEM操作员位置、多机(编队)信息、时间戳
OpenDroneIdSelfIdOPEN_DRONE_ID_SELF_ID操作员身份(明文描述)
OpenDroneIdOperatorIdOPEN_DRONE_ID_OPERATOR_ID操作员注册 ID
OpenDroneIdArmStatusOPEN_DRONE_ID_ARM_STATUSRemote ID 硬件状态,用于解锁条件与健康检查

参考路径汇总

  • 消息定义:msg/OpenDroneIdBasicId.msg、docs/en/msg_docs/OpenDroneIdBasicId.md
  • MAVLink 流实现:src/modules/mavlink/streams/OPEN_DRONE_ID_BASIC_ID.hpp
  • 流注册:src/modules/mavlink/mavlink_messages.cpp
  • 类型映射:src/modules/mavlink/open_drone_id_translations.cpp
  • DroneCAN 实现:src/drivers/uavcan/remoteid.cpp
  • 功能文档:docs/en/peripherals/remote_id.md
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

相关推荐

上一篇:如何用 osTicket-1.7 打造高效客户支持系统:新手必备的开源解决方案
下一篇:Crypto++安全审计终极指南:10个关键步骤确保代码安全

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询