- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
导读:本文围绕 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,完整字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
timestamp | uint64 | 时间戳(微秒),uORB 消息的标准首字段,由发布方填写 |
id_or_mac | uint8[20] | 仅用于接收自其他 UA(无人航空器)的 drone ID 数据;无空终止符,长度不足时以零填充 |
id_type | uint8 | 遵循 MAVLinkMAV_ODID_ID_TYPE枚举,指明uas_id字段采用的格式 |
ua_type | uint8 | 遵循 MAVLinkMAV_ODID_UA_TYPE枚举,指明无人航空器(UA)的类型 |
uas_id | uint8[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_GENERIC | MAV_ODID_UA_TYPE_OTHER |
MAV_TYPE_FIXED_WING | MAV_ODID_UA_TYPE_AEROPLANE |
MAV_TYPE_QUADROTOR/HELICOPTER/COAXIAL/HEXAROTOR/OCTOROTOR/TRICOPTER/DODECAROTOR | MAV_ODID_UA_TYPE_HELICOPTER_OR_MULTIROTOR |
MAV_TYPE_AIRSHIP | MAV_ODID_UA_TYPE_AIRSHIP |
MAV_TYPE_FREE_BALLOON | MAV_ODID_UA_TYPE_FREE_BALLOON |
MAV_TYPE_ROCKET | MAV_ODID_UA_TYPE_ROCKET |
MAV_TYPE_GROUND_ROVER | MAV_ODID_UA_TYPE_GROUND_OBSTACLE |
MAV_TYPE_FLAPPING_WING | MAV_ODID_UA_TYPE_ORNITHOPTER |
MAV_TYPE_KITE | MAV_ODID_UA_TYPE_KITE |
MAV_TYPE_VTOL_TAILSITTER_DUOROTOR等所有 VTOL 机型 | MAV_ODID_UA_TYPE_HYBRID_LIFT |
MAV_TYPE_PARAFOIL/MAV_TYPE_PARACHUTE | MAV_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()逻辑体现了双源回退策略:
- 外部发布者优先:若 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字段在此路径下同样不填充。 - 本机自动生成(默认路径):当没有外部发布者时,流会订阅
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 2MAV_1_MODE= NormalMAV_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 报文 | 作用 |
|---|---|---|
OpenDroneIdBasicId | OPEN_DRONE_ID_BASIC_ID | 无人机身份信息(序列号) |
OpenDroneIdLocation | OPEN_DRONE_ID_LOCATION | 无人机位置、高度、航向、速度 |
OpenDroneIdSystem | OPEN_DRONE_ID_SYSTEM | 操作员位置、多机(编队)信息、时间戳 |
OpenDroneIdSelfId | OPEN_DRONE_ID_SELF_ID | 操作员身份(明文描述) |
OpenDroneIdOperatorId | OPEN_DRONE_ID_OPERATOR_ID | 操作员注册 ID |
OpenDroneIdArmStatus | OPEN_DRONE_ID_ARM_STATUS | Remote 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
相关推荐
PX4 OpenDroneIdSelfId UORB 消息详解:远程 ID 自描述信息的定义、接收与广播路径
PX4 OpenDroneIdSelfId UORB 消息详解:远程 ID 自描述信息的定义、接收与广播路径 OpenDroneIdSelfId 是 PX4 中
嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot uORB 消息 IrlockReport 详解:IR-Lock 红外信标定位数据结构与驱动实现
PX4 Autopilot uORB 消息 IrlockReport 详解:IR Lock 红外信标定位数据结构与驱动实现 导读 IrlockReport 是
嵌入式物联网机器人自动驾驶智能硬件Cacti graph_view.php 未授权 SQL 注入链式利用至 RCE 复现(CVE-2023-39361 / CVE-2024-31459)
Cacti graph_view.php 未授权 SQL 注入链式利用至 RCE 复现(CVE 2023 39361 / CVE 2024 31459) Cac
嵌入式物联网机器人自动驾驶智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考