嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本篇技术指南围绕 PX4-Autopilot 中的LogMessageUORB 消息主题名log_message展开完整解析其消息结构timestamp/severity/text与队列常量并结合仓库源码说明PX4_WARN、PX4_ERR、PX4_INFO等日志宏如何将文本消息发布到该主题以及 logger 模块如何将其写入 ULog 飞行日志、MAVLink 模块如何通过STATUSTEXT与地面站互通。读完本文你将掌握log_message从产生、发布、订阅到落盘/回传的完整数据链路并能在自己的模块中正确使用 PX4 文本日志接口。一、消息定义总览LogMessage的定义位于仓库 msg/LogMessage.msg对应的官方消息文档为 docs/en/msg_docs/LogMessage.md。该消息用于承载一条日志文本官方注释明确说明它由PX4_WARN、PX4_ERR、PX4_INFO等日志宏输出主题名固定为log_message。消息源码原文如下# A logging message, output with PX4_WARN, PX4_ERR, PX4_INFO uint64 timestamp # time since system start (microseconds) uint8 severity # log level (same as in the linux kernel, starting with 0) char[127] text uint8 ORB_QUEUE_LENGTH 41.1 字段定义表名称类型单位/框架说明timestampuint64微秒µs自系统启动以来的时间用于标识日志产生时刻severityuint8—日志级别与 Linux 内核日志级别一致从 0 开始textchar[127]—日志正文文本最长 127 个字符不含结尾\01.2 常量定义表名称类型值说明ORB_QUEUE_LENGTHuint84log_message主题的发布队列长度二、字段语义详解2.1 timestamp系统启动以来的微秒时间戳timestamp类型为uint64记录自系统启动boot以来的微秒数。在 ULog 落盘时logger 会将该值原样写入日志记录见下文第四节因此通过该字段可以精确还原每条日志消息在飞行日志时间轴上的位置与其它 UORB 主题如传感器、状态估计数据共享同一时间基准便于日志分析时对齐事件顺序。2.2 severity与 Linux 内核一致的日志级别severity为uint8类型取值范围与 Linux 内核日志级别KERN_*一致从 0 开始数值越小表示级别越高、越紧急。常用级别对应关系如下数值级别含义对应 Linux 内核宏0Emergency系统不可用KERN_EMERG1Alert必须立即处理KERN_ALERT2Critical严重错误KERN_CRIT3Error错误KERN_ERR4Warning警告KERN_WARNING5Notice提示KERN_NOTICE6Info常规信息KERN_INFO7Debug调试信息KERN_DEBUG在仓库的 MAVLink 日志辅助头文件 src/lib/systemlib/mavlink_log.h 中可以找到与之严格对应、按相同数值顺序定义的优先级常量#define _MSG_PRIO_DEBUG 7 #define _MSG_PRIO_INFO 6 #define _MSG_PRIO_NOTICE 5 #define _MSG_PRIO_WARNING 4 #define _MSG_PRIO_ERROR 3 #define _MSG_PRIO_CRITICAL 2 #define _MSG_PRIO_ALERT 1 #define _MSG_PRIO_EMERGENCY 0这套 0–7 的编号体系同样与 MAVLink 协议中的MAV_SEVERITY枚举一致EMERGENCY0、ALERT1、CRITICAL2、ERROR3、WARNING4、NOTICE5、INFO6、DEBUG7这使得log_message的severity字段可以在 MAVLinkSTATUSTEXT消息之间无损转换详见第五节。2.3 text最长 127 字符的日志正文text为char[127]定长字符数组最多容纳 127 个可见字符末尾由调用方保证\0终止。需要留意的是日志文本在进入 ULog 时会被写入 128 字节的存储缓冲ulog_message_logging_s::message为char[128]见 src/modules/logger/messages.h因此 127 字符的正文加上终止符恰好完整容纳。三、队列深度 ORB_QUEUE_LENGTH 4 的设计意图LogMessage定义了常量ORB_QUEUE_LENGTH 4即该主题的 uORB 发布队列长度为 4。在 PX4 的 uORB 通信模型中发布者Publisher将消息写入队列订阅者Subscriber按自己的节奏读取当订阅者处理速度暂时跟不上、且队列已满时最旧的消息会被丢弃以腾出空间容纳最新消息。对log_message而言其典型发布方是日志宏高频、突发性输出典型订阅方是 logger以 20ms 轮询间隔批量读取见 src/modules/logger/logger.h 中的uORB::SubscriptionInterval _log_message_sub{ORB_ID(log_message), 20}与 MAVLink 模块。队列深度取 4 是一种折中既能缓冲短时间的突发日志、降低丢失概率又不会让过期日志在队列中滞留过久——毕竟文本日志讲究“新鲜度”旧消息延迟送达地面站意义不大。四、生产侧PX4 日志宏如何发布 log_message4.1 PX4 核心日志宏PX4_INFO / PX4_WARN / PX4_ERR文档开篇即指出LogMessage由PX4_WARN、PX4_ERR、PX4_INFO输出。这些宏定义于平台公共头文件 platforms/common/include/px4_platform_common/log.hPX4_INFO(FMT, ...)信息级日志默认构建下通过__px4_log_modulename(_PX4_LOG_LEVEL_INFO, ...)输出PX4_WARN(FMT, ...)警告级日志输出到控制台并携带模块名PX4_ERR(FMT, ...)错误级日志另有PX4_DEBUG、PX4_PANIC等且支持TRACE_BUILD/DEBUG_BUILD/RELEASE_BUILD多档构建裁剪——例如在RELEASE_BUILD下PX4_WARN和PX4_DEBUG会被编译期省略__px4_log_omit以最小化固件中的字符串占用。控制台输出的同时日志内容会被封装为log_message_s并发布到log_message主题。以 MAVLink 文本日志封装宏为例src/lib/systemlib/mavlink_log.h 中的实现清晰地展示了“uORB 发布 控制台输出”的双通道模式#define mavlink_log_info(_pub, _text, ...) \ do { \ mavlink_vasprintf(_MSG_PRIO_INFO, _pub, _text, ##__VA_ARGS__); \ PX4_INFO(_text, ##__VA_ARGS__); \ } while(0); #define mavlink_log_warning(_pub, _text, ...) \ do { \ mavlink_vasprintf(_MSG_PRIO_WARNING, _pub, _text, ##__VA_ARGS__); \ PX4_WARN(_text, ##__VA_ARGS__); \ } while(0); #define mavlink_log_emergency(_pub, _text, ...) \ do { \ mavlink_vasprintf(_MSG_PRIO_EMERGENCY, _pub, _text, ##__VA_ARGS__); \ PX4_ERR(_text, ##__VA_ARGS__); \ } while(0);mavlink_vasprintf()会将格式化后的文本连同severity即_MSG_PRIO_*值一并发布到log_message主题供 logger、MAVLink 等下游模块订阅消费。注意MAVLINK_LOG_MAXLEN#define MAVLINK_LOG_MAXLEN 50用于限制单条 MAVLink 侧文本长度而 uORB 侧text字段上限为 127二者并不冲突。4.2 模块开发中的典型用法在编写 PX4 模块时通常会先orb_advertise或通过uORB::Publicationlog_message_s创建发布句柄然后调用mavlink_log_info / mavlink_log_warning / mavlink_log_critical / mavlink_log_emergency向地面站发送文本告警同时叠加PX4_INFO / PX4_WARN / PX4_ERR输出到本机控制台与日志文件。这也正是LogMessage消息在“日志宏”层面的直接落地形态。五、消费侧之一logger 模块写入 ULog 飞行日志log_message最重要的消费者是 logger 模块src/modules/logger/logger.cpp。logger 以 20ms 间隔轮询该主题一旦有新的log_message即将其转换为 ULog 协议中的LOGGING消息写入日志文件。核心代码位于 src/modules/logger/logger.cpp// check for new logging message(s) log_message_s log_message; if (_log_message_sub.update(log_message)) { const char *message (const char *)log_message.text; int message_len strnlen(message, sizeof(log_message.text)); if (message_len 0) { uint16_t write_msg_size sizeof(ulog_message_logging_s) - sizeof(ulog_message_logging_s::message) - ULOG_MSG_HEADER_LEN message_len; _msg_buffer[0] (uint8_t)write_msg_size; _msg_buffer[1] (uint8_t)(write_msg_size 8); _msg_buffer[2] static_castuint8_t(ULogMessageType::LOGGING); _msg_buffer[3] log_message.severity 0; memcpy(_msg_buffer 4, log_message.timestamp, sizeof(ulog_message_logging_s::timestamp)); strncpy((char *)(_msg_buffer 12), message, sizeof(ulog_message_logging_s::message)); write_message(LogType::Full, _msg_buffer, write_msg_size ULOG_MSG_HEADER_LEN); } }这里有两个值得注意的实现细节severity 以 ASCII 字符形式入日志log_message.severity 0把 0–7 的数值映射为字符0–7写入ulog_message_logging_s的severity字段与 ULog 格式定义char severity保持一致空文本跳过message_len 0才写入避免在日志中产生无意义的空记录。对应的 ULog 消息结构定义于 src/modules/logger/messages.hstruct ulog_message_logging_s { uint8_t msg_type static_castuint8_t(ULogMessageType::LOGGING); uint8_t severity; /// severity: 0 emergency, 7 debug uint64_t timestamp; /// timestamp in microseconds char message[128]; /// log message };单元测试 src/modules/logger/ULogMessagesTest.cpp 中对上述结构的内存布局做了严格校验EXPECT_EQ(sizeof(ulog_message_logging_s), ULOG_MSG_HEADER_LEN 1u 8u 128u);即 3 字节头 1 字节级别 8 字节时间戳 128 字节正文保证落盘格式与解析端严格对齐。这样飞行结束后用ulog解析工具打开.ulg文件即可看到带时间戳、带级别、带模块名的全部日志文本。六、消费侧之二MAVLink 模块与地面站双向互通log_message与 MAVLinkSTATUSTEXT消息存在双向映射这也是“机上日志实时上屏”的核心机制。6.1 接收方向地面站 STATUSTEXT → log_messageMAVLink 接收端在 src/modules/mavlink/mavlink_receiver.cpp 中对MAVLINK_MSG_ID_STATUSTEXT进行处理经由MavlinkStatustextHandlersrc/modules/mavlink/MavlinkStatustextHandler.hpp将mavlink_statustext_t重组为log_message_s再发布到log_message主题_log_message_pub.publish(_mavlink_statustext_handler.log_message());该 Handler 的实现src/modules/mavlink/MavlinkStatustextHandler.cpp负责两项关键工作severity 透传直接把 MAVLink 的msg_statustext.severity0–7写入log_message.severity并在收到分片首包时保存timestamp多分片重组MAVLinkSTATUSTEXT单帧正文仅 50 字节而log_message.text最长 127 字节因此 Handler 维护_last_log_chunk_seq与_last_log_id按chunk_seq将多个分片拼接进_log_msg.text缺失分片时以[ missing ... ]占位避免产生断裂文本。6.2 发送方向log_message → 地面站机内模块调用mavlink_log_info / mavlink_log_warning等宏时mavlink_vasprintf()将消息发布到log_message主题MAVLink 模块随后以STATUSTEXT报文发送给地面站地面站据此在 HUD / 状态栏实时显示警告或错误文本。由于severity字段与MAV_SEVERITY数值一致级别信息可以原样保留地面站可按紧急程度分级展示。七、日志回放与调试场景除 logger 与 MAVLink 外回放模块 src/modules/replay/Replay.cpp 也引用了log_message主题在进行日志回放replay时存储的 LOGGING 记录被还原为log_message重新注入 uORB 总线使依赖该主题的下游模块如 MAVLink 状态文本输出在回放过程中仍能重现当时的告警与提示保证回放行为与实机一致。实际调试时一条log_message的典型“生命周期”如下模块内调用PX4_WARN(...)/mavlink_log_warning(...)日志宏发布log_message_s到log_message主题队列深度 4logger 模块以 20ms 间隔订阅并转换为 ULogLOGGING记录写入.ulg文件severity 转字符存储MAVLink 模块同时以STATUSTEXT发送给地面站实时显示飞行后可用ulog解析工具在日志中检索LOGGING消息按severity过滤并对照timestamp定位故障时刻。八、相关文件导航消息定义msg/LogMessage.msg权威字段来源消息文档docs/en/msg_docs/LogMessage.md平台日志宏platforms/common/include/px4_platform_common/log.hMAVLink 文本日志封装src/lib/systemlib/mavlink_log.hlogger 订阅与 ULog 写入src/modules/logger/logger.cpp、src/modules/logger/logger.hULog LOGGING 消息结构src/modules/logger/messages.h结构布局单元测试src/modules/logger/ULogMessagesTest.cppMAVLink STATUSTEXT 接收与重组src/modules/mavlink/mavlink_receiver.cpp、src/modules/mavlink/MavlinkStatustextHandler.hpp、src/modules/mavlink/MavlinkStatustextHandler.cpp回放引用src/modules/replay/Replay.cpp赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4-Autopilot uORB 消息详解ActuatorServosV0actuator_servos_v0舵机归一化控制消息PX4 Autopilot uORB 消息详解ActuatorServosV0actuator_servos_v0舵机归一化控制消息 ActuatorSe嵌入式物联网机器人自动驾驶智能硬件IDM激活脚本终极指南永久免费解锁下载管理神器IDM激活脚本终极指南永久免费解锁下载管理神器 在数字时代高效下载工具已成为工作和学习的必备利器。Internet Download ManagerIDM嵌入式物联网机器人自动驾驶智能硬件AsyncAwaitBestPractices MVVM实战AsyncCommand和AsyncValueCommand的完整教程AsyncAwaitBestPractices MVVM实战AsyncCommand和AsyncValueCommand的完整教程 在.NET开发中异步编程开发工具软件架构上一篇在 Model-Optimizer 评估技能库中运行 LiveCodeBench v6NEL 配置、评分提取与量化模型代码生成基准实战指南下一篇macOS终极配置优化指南3步打造无干扰的Electronic Wechat工作环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考