
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载OpenDroneIdSelfId 是 PX4 中承载远程 ID 自描述信息Self-ID如应急状态、扩展状态等自由文本描述的 uORB 消息属于 PX4 开放无人机 IDOpen Drone ID / Remote ID消息族的一员。本文以 OpenDroneIdSelfId.msg 为骨架逐字段解读其布局与含义并结合 mavlink_receiver.cpp 与 remoteid.cpp 还原MAVLink 报文 → uORB 话题 → DroneCAN/UAVCAN 广播的完整数据流帮助开发者理解远程 ID 自描述字段从地面站注入到机载广播的底层实现。消息概览与话题名称该消息在 PX4 源码中的定义位于 msg/OpenDroneIdSelfId.msg对应 uORB 话题名TOPICS为open_drone_id_self_id由该消息生成的结构体类型为open_drone_id_self_id_s头文件由构建系统生成uORB/topics/open_drone_id_self_id.h并在多个模块中通过#include uORB/topics/open_drone_id_self_id.h引入例如 remoteid.hpp 与 mavlink_receiver.h。字段定义与逐字段解读文档 docs/en/msg_docs/OpenDroneIdSelfId.md 给出的完整字段表如下NameTypeUnit [Frame]Range/EnumDescriptiontimestampuint64id_or_macuint8[20]description_typeuint8descriptionchar[23]源消息文件完整内容uint64 timestamp uint8[20] id_or_mac uint8 description_type char[23] description各字段的含义与设计要点timestampuint64消息时间戳采用 hrt 单调时间。在接收路径中由hrt_absolute_time()填充见下文源码分析表示该自描述消息被机载系统接收/处理的时刻。id_or_macuint8[20]20 字节远程 ID 的标识符或 MAC 地址字段。从 remoteid.cpp 中对同类消息的注释// msg.id_or_mac // supposedly only used for drone ID data from other UAs可以推断该字段主要用于承载从其他无人机UA接收到的远程 ID 数据中的标识信息即本机在转发第三方无人机远程 ID 时携带其 ID/MAC本机自身的 UAS ID 则由 OpenDroneIdBasicId 消息承载。description_typeuint8描述类型枚举。该字段按 MAVLink 开放无人机 ID 协议的MAV_ODID_DESC_TYPE枚举取值如文本描述、应急描述、扩展状态等用于标识description字段的语义类别。仓库中未内联该枚举定义具体枚举值以 PX4 构建所依赖的 MAVLink 头文件为准。descriptionchar[23]23 字节自描述文本内容定长 23 字节。该长度与 MAVLinkOPEN_DRONE_ID_SELF_ID报文中description字段的载荷长度一致可从 mavlink_receiver.cpp 中memcpy(odid_self_id.description, odid_module.description, sizeof(odid_self_id.description))的逐字节对齐映射得到印证——即 uORB 字段与 MAVLink 报文字段按 1:1 长度映射确保无截断、无填充。数据流一MAVLink 报文接收地面站 → uORBOpenDroneIdSelfId 的典型来源是地面站GCS或外部远程 ID 注入源通过 MAVLink 发送的OPEN_DRONE_ID_SELF_ID报文。PX4 的 MAVLink 接收端在 mavlink_receiver.cpp 的handle_message()分发中对MAVLINK_MSG_ID_OPEN_DRONE_ID_SELF_ID调用handle_message_open_drone_id_self_id()其完整实现为void MavlinkReceiver::handle_message_open_drone_id_self_id(mavlink_message_t *msg) { mavlink_open_drone_id_self_id_t odid_module; mavlink_msg_open_drone_id_self_id_decode(msg, odid_module); open_drone_id_self_id_s odid_self_id{}; memset(odid_self_id, 0, sizeof(odid_self_id)); odid_self_id.timestamp hrt_absolute_time(); memcpy(odid_self_id.id_or_mac, odid_module.id_or_mac, sizeof(odid_self_id.id_or_mac)); odid_self_id.description_type odid_module.description_type; memcpy(odid_self_id.description, odid_module.description, sizeof(odid_self_id.description)); _open_drone_id_self_id_pub.publish(odid_self_id); }关键点先memset清零结构体避免未覆盖字节携带垃圾数据timestamp不使用 MAVLink 报文的原始时间戳而是统一改写为本地hrt_absolute_time()解码后通过_open_drone_id_self_id_pub在 mavlink_receiver.h 中声明为uORB::Publicationopen_drone_id_self_id_s _open_drone_id_self_id_pub{ORB_ID(open_drone_id_self_id)}发布到open_drone_id_self_id话题。数据流二DroneCAN/UAVCAN 广播uORB → 空中广播发布到open_drone_id_self_id话题的数据最终由 UAVCAN 远程 ID 控制器UavcanRemoteIDController消费并广播到 DroneCAN 总线。该控制器位于 src/drivers/uavcan/remoteid.cpp其中订阅了_open_drone_id_self_idremoteid.hppvoid UavcanRemoteIDController::send_self_id() { open_drone_id_self_id_s self_id; if (_open_drone_id_self_id.copy(self_id)) { dronecan::remoteid::SelfID msg {}; for (unsigned i 0; i sizeof(self_id.id_or_mac); i) { msg.id_or_mac.push_back(self_id.id_or_mac[i]); } msg.description_type self_id.description_type; for (unsigned i 0; i sizeof(self_id.description); i) { msg.description.push_back(self_id.description[i]); } _uavcan_pub_remoteid_self_id.broadcast(msg); } }该控制器的定时触发机制为初始化时在 remoteid.cpp 中启动周期定时器_timer.startPeriodic(uavcan::MonotonicDuration::fromMSec(1000 / MAX_RATE_HZ))MAX_RATE_HZ 1remoteid.hpp即以 1 Hz 的频率周期执行periodic_update()periodic_update()依次调用send_basic_id()、send_location()、send_self_id()、send_system()、send_operator_id()remoteid.cpp将各 OpenDroneId uORB 话题内容逐一封装为 DroneCAN 远程 ID 消息并广播。值得注意send_self_id()仅在_open_drone_id_self_id.copy(self_id)成功即话题上有新数据时才广播因此没有地面站注入自描述信息时不会空发无效载荷。与 OpenDroneId 消息族的关系OpenDroneIdSelfId 并非孤立消息它与其他远程 ID 消息共同构成 PX4 的完整远程 ID 数据链。仓库 msg/ 目录下与 docs/en/msg_docs/ 中对应的消息文档包括消息承载内容OpenDroneIdBasicId无人机基础标识UAS ID、ID 类型、UA 类型OpenDroneIdSystem系统级信息操作员位置、作业区、EU 分类OpenDroneIdOperatorId操作员 IDOpenDroneIdSelfId本文自描述文本description_type descriptionOpenDroneIdArmStatus解锁/待机状态该话题由 DroneCAN ArmStatus 报文订阅后反向发布见 remoteid.cpp在 remoteid.hpp 中这五个消息被全部订阅映射到 DroneCAN 的BasicID、Location、SelfID、System、OperatorID五个远程 ID 消息类型remoteid.hpp。其中SelfID的description_type与description两个字段完全来自本消息可见 OpenDroneIdSelfId 是 DroneCANSelfID广播的唯一数据源。观测与调试方式open_drone_id_self_id是标准 uORB 话题可直接用 PX4 Shell 的 uORB 调试工具观测其发布频率与字段内容。由于该话题默认只在地面站注入时才被发布调试时可先通过地面站发送OPEN_DRONE_ID_SELF_ID报文再在 PX4 Shell 中订阅查看listener open_drone_id_self_id此外该话题与其余 OpenDroneId 话题一同被记录进 ulog可用于事后回放分析远程 ID 注入数据是否符合预期。小结OpenDroneIdSelfId 虽然只有 4 个字段却是 PX4 远程 ID 体系注入自描述信息的关键一环地面站通过 MAVLink 注入 → mavlink_receiver.cpp 解码发布到 uORB → remoteid.cpp 以 1 Hz 频率封装为 DroneCANSelfID广播。理解这条链路就能在二次开发或调试远程 ID 功能时准确定位自描述信息的注入点、存储点与广播点。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4 CameraTrigger uORB 消息详解相机触发信号的定义、生成与消费链路PX4 CameraTrigger uORB 消息详解相机触发信号的定义、生成与消费链路 CameraTrigger 是 PX4 飞控中用于发布相机拍摄触发嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot BatteryInfo uORB 消息深度解析静态电池信息的定义、发布链路与 MAVLink 桥接PX4 Autopilot BatteryInfo uORB 消息深度解析静态电池信息的定义、发布链路与 MAVLink 桥接 本篇文章聚焦 PX4 Auto嵌入式物联网机器人自动驾驶智能硬件PX4 DebugArray UORB 消息详解从字段定义到 Mavlink 调试链路实战PX4 DebugArray UORB 消息详解从字段定义到 Mavlink 调试链路实战 PX4 的 debug_array 是一类专用于批量浮点调试数据的嵌入式物联网机器人自动驾驶智能硬件上一篇Bash调试终极指南set -x与set -v的完整区别解析下一篇Cantera核心功能解析化学反应动力学、热力学与输运性质计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考