PX4 PowerButtonState UORB 消息详解:电源按钮状态事件与自动关机流程
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本文以 PX4-Autopilot 仓库中的 PowerButtonState UORB 消息文档 为核心深入剖析该消息的字段定义、事件枚举语义并结合 Commander 模块 与板级电源驱动源码还原从物理按键按下到系统安全关机的完整调用链。读完本文你将掌握 PowerButtonState 消息的发布/订阅模型、四类事件常量的触发条件以及如何基于该 topic 扩展自定义电源管理逻辑。消息概述PowerButtonState是 PX4 内部用于广播电源按钮状态通知的 uORB 消息。它不直接参与飞控解算而是将板载硬件电源按键的状态变化以统一的事件形式上报供上层模块主要是 commander据此执行相应的电源管理动作例如播放按键提示音或发起关机流程。该消息对应的 uORB topic 名为power_button_state与消息名一致。所有对该事件感兴趣的程序都可以通过 uORB 订阅机制接收它而当前仓库中真正消费该消息的模块是 src/modules/commander/Commander.cpp其声明见 Commander.hpp。消息字段定义文档中给出的消息包含两个字段结构非常精简字段名类型单位 [坐标系]取值范围/枚举说明timestampuint64——自系统启动以来的时间微秒eventuint8—PWR_BUTTON_STATE_*具体的电源按钮事件timestamp由发布方在事件产生时通过hrt_absolute_time()打点表示该事件相对于系统启动时刻的时间戳单位微秒供接收方判断事件的时效性event是事件类型编码取值为下表的四个常量之一是消息的核心载荷。该消息的真实定义位于 msg/PowerButtonState.msg构建系统会依据它生成对应的 C/C 头文件与序列化代码。事件常量语义PowerButtonState定义了四个事件常量覆盖了电源按键的完整状态机。下表完整继承自原文档常量名类型值说明PWR_BUTTON_STATE_IDELuint80按钮松开但按下时长未达到关机要求作为取消事件使用PWR_BUTTON_STATE_DOWNuint81按钮被按下PWR_BUTTON_STATE_UPuint82按钮被松开PWR_BUTTON_STATE_REQUEST_SHUTDOWNuint83按钮松开且按下时长已达到关机要求其中PWR_BUTTON_STATE_IDEL的语义值得注意它并非空闲而是 Idle无效/取消——即用户按了一下按钮又松开但按住时间不够触发关机该事件被用作一个删除/取消信号用于清理此前PWR_BUTTON_STATE_DOWN产生的提示音等副作用详见下文 Commander 实现。从源码结构看该命名中的 IDEL 应为 IDLE 的历史笔误并在板级枚举board_power_button_state_notification_e见 board_common.h中以PWR_BUTTON_IDEL的形式继承了下来。发布端板级电源按键驱动power_button_state消息并非由某个独立驱动模块周期性发布而是由板级硬件驱动通过回调机制在按键中断IRQ上下文中触发。整个发布链可以拆成三层1. 板级 IRQ 与状态判定以 boards/atl/mantis-edu/src/pwr.cpp 为例该文件注释明确其为 Board-specific power button functions其核心流程为初始化阶段board_pwr_init将按键 GPIO 配置为带上下拉的 EXTI 中断输入并挂接board_button_irq中断服务函数见 pwr.cpp中断服务函数读取 GPIO 电平按下时记录按下时刻time_down并回调PWR_BUTTON_DOWN松开时计算按下持续时长若超过阈值则回调PWR_BUTTON_REQUEST_SHUT_DOWN否则回调PWR_BUTTON_UP与PWR_BUTTON_IDEL见 pwr.cpp关机按下时长阈值由板级宏MS_PWR_BUTTON_DOWN定义该板为750 ms见 board_config.h同时该板通过BOARD_HAS_POWER_CONTROL宏声明自身具备电源控制能力board_config.h。2. 板级枚举与回调签名板级中断调用的并不是 uORB API而是一个统一的平台回调接口定义在 platforms/common/include/px4_platform_common/board_common.htypedef enum board_power_button_state_notification_e { PWR_BUTTON_IDEL, /* 按钮松开但未达到关机按下时间 */ PWR_BUTTON_DOWN, /* 按钮按下 */ PWR_BUTTON_UP, /* 按钮松开 */ PWR_BUTTON_REQUEST_SHUT_DOWN, /* 按钮松开且已达到关机按下时间 */ PWR_BUTTON_RESPONSE_SHUT_DOWN_PENDING, /* 回调响应板级代码后续会调用关机 */ PWR_BUTTON_RESPONSE_SHUT_DOWN_NOW, /* 回调响应板级代码立即关机 */ } board_power_button_state_notification_e; typedef int (*power_button_state_notification_t)(board_power_button_state_notification_e request);该枚举将板级事件与 uORB 消息事件一一对应并额外定义了回调的两种返回值用于告诉板级驱动关机动作由谁执行详见下文 Commander 回调实现。3. Commander 注册回调并发布消息commander 在run()初始化阶段完成两件关键工作见 Commander.cpp预先执行一次orb_advertise()发布占位消息——注释明确指出这是必要的因为uORB 的缓冲区分配不能发生在 IRQ 上下文中必须提前在主线程上下文完成分配调用board_register_power_state_notification_cb(power_button_state_notification_cb)将回调注册进板级驱动。之后任何板级按键事件都会进入静态回调power_button_state_notification_cb见 Commander.cppstatic int power_button_state_notification_cb(board_power_button_state_notification_e request) { power_button_state_s button_state{}; button_state.timestamp hrt_absolute_time(); const int ret PWR_BUTTON_RESPONSE_SHUT_DOWN_PENDING; switch (request) { case PWR_BUTTON_IDEL: button_state.event power_button_state_s::PWR_BUTTON_STATE_IDEL; break; case PWR_BUTTON_DOWN: button_state.event power_button_state_s::PWR_BUTTON_STATE_DOWN; play_power_button_down_tune(); break; case PWR_BUTTON_UP: button_state.event power_button_state_s::PWR_BUTTON_STATE_UP; stop_tune(); break; case PWR_BUTTON_REQUEST_SHUT_DOWN: button_state.event power_button_state_s::PWR_BUTTON_STATE_REQUEST_SHUTDOWN; break; default: PX4_ERR(unhandled power button state: %i, (int)request); return ret; } if (power_button_state_pub ! nullptr) { orb_publish(ORB_ID(power_button_state), power_button_state_pub, button_state); } else { PX4_ERR(power_button_state_pub not properly initialized); } return ret; }该回调值得注意的实现细节IRQ 安全回调可能在硬件中断上下文中被调用因此它只做两件事——打时间戳、填充event并orb_publish把真正的业务处理关机判定交给 commander 主循环这与run()中的注释publish a message that will be handled on the main thread of commander完全对应提示音联动按下时播放电源键提示音play_power_button_down_tune()松开时停止stop_tune()而PWR_BUTTON_STATE_IDEL的取消事件作用正体现在此处——短按未达关机阈值时消息事件配合提示音实现听觉反馈的启停返回值默认返回PWR_BUTTON_RESPONSE_SHUT_DOWN_PENDING即关机由更高层发起对比之下若板级代码返回PWR_BUTTON_RESPONSE_SHUT_DOWN_NOW则如 pwr.cpp 所示板级驱动会自行调用board_power_off()立即断电。消费端Commander 主循环的关机判定commander 主循环在每轮迭代中都会调用handlePowerButtonState()见 Commander.cpp其逻辑非常克制void Commander::handlePowerButtonState() { #if defined(BOARD_HAS_POWER_CONTROL) if (_power_button_state_sub.updated()) { power_button_state_s button_state; if (_power_button_state_sub.copy(button_state)) { if (button_state.event power_button_state_s::PWR_BUTTON_STATE_REQUEST_SHUTDOWN) { if (!isArmed() (px4_shutdown_request() 0)) { while (1) { px4_usleep(1); } } } } } #endif }关键安全设计只有满足PWR_BUTTON_STATE_REQUEST_SHUTDOWN且当前未解锁!isArmed()时才会调用px4_shutdown_request()发起系统关机请求若成功则进入死循环挂起等待断电。这一先判定解锁状态、后执行关机的防御逻辑确保了飞行器在带动力输出状态下绝不会因误触电源键而断电。从仓库中px4_shutdown_request()的其他调用点如 Commander.cpp 的 MAVLink 关机命令分支、shutdown 系统命令可以推断该函数是 PX4 统一的平台级关机入口PowerButtonState消息只是触达它的方式之一。端到端事件流梳理综合发布端与消费端源码一次长按电源键关机的完整时序为用户按下电源键板级 GPIO 中断触发board_button_irq记录按下时刻回调PWR_BUTTON_DOWNcommander 回调将事件映射为PWR_BUTTON_STATE_DOWN并发布power_button_state消息同时播放按键提示音用户持续按住直至超过板级阈值如 mantis-edu 的 750 ms松开瞬间中断再次触发回调PWR_BUTTON_REQUEST_SHUT_DOWNcommander 回调发布PWR_BUTTON_STATE_REQUEST_SHUTDOWN消息并返回PWR_BUTTON_RESPONSE_SHUT_DOWN_PENDINGcommander 主循环在下一轮迭代中收到消息校验!isArmed()后调用px4_shutdown_request()系统开始安全关机。若用户只是短按则第 3 步变为回调PWR_BUTTON_UP与PWR_BUTTON_IDEL对应消息事件PWR_BUTTON_STATE_UP/PWR_BUTTON_STATE_IDEL仅停止提示音不触发任何关机动作。应用与扩展建议power_button_state是一个公共 uORB topic任何模块都可以像 commander 一样通过uORB::Subscription订阅它参考 Commander.hpp 的_power_button_state_sub用法可用于自定义电源事件响应例如在收到PWR_BUTTON_STATE_DOWN时记录日志或切换外设状态收到PWR_BUTTON_STATE_REQUEST_SHUTDOWN时执行数据落盘等收尾工作扩展板级支持若要在新硬件上启用电源键功能需要完成三件事——在板级配置中定义BOARD_HAS_POWER_CONTROL、实现board_register_power_state_notification_cb与按键中断处理可参考 boards/atl/mantis-edu/src/pwr.cpp并设置合适的MS_PWR_BUTTON_DOWN阈值调试与观测通过 uORB 工具订阅power_button_statetopic 即可实时查看timestamp与event两个字段快速验证按键状态机是否符合预期。相关资源消息定义源码msg/PowerButtonState.msg消费端实现src/modules/commander/Commander.cpp、handlePowerButtonState 实现平台回调接口与枚举platforms/common/include/px4_platform_common/board_common.h板级参考实现boards/atl/mantis-edu/src/pwr.cpp、boards/atl/mantis-edu/src/board_config.h文档原文docs/en/msg_docs/PowerButtonState.md另有 中文版赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4-Autopilot UORB 消息详解FailureDetectorStatus 故障检测器状态消息PX4 Autopilot UORB 消息详解FailureDetectorStatus 故障检测器状态消息 failure_detector_status嵌入式物联网机器人自动驾驶智能硬件PX4 ButtonEvent 消息深度解析安全按钮事件从物理按键到 UORB 消息的完整链路PX4 ButtonEvent 消息深度解析安全按钮事件从物理按键到 UORB 消息的完整链路 ButtonEvent 是 PX4 Autopilot 中用于嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot UORB 消息详解GpioOutGPIO 掩码与状态输出PX4 Autopilot UORB 消息详解GpioOutGPIO 掩码与状态输出 导读 GpioOut 是 PX4 Autopilot 中用于对外发布嵌入式物联网机器人自动驾驶智能硬件上一篇【免费下载】 Open3D点云数据处理教程【vscode python环境配置】并安装Open3D下一篇Wrest Chat 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Composio 开发框架实战:用 TaoToken 统一 Key 打通 AI Agent 与 500+ 应用

Composio 开发框架实战:用 TaoToken 统一 Key 打通 AI Agent 与 500+ 应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 4:31:14 阅读更多 →
ROS2机器人系统架构实战:硬件选型、驱动开发与联调验证

ROS2机器人系统架构实战:硬件选型、驱动开发与联调验证

1. 这不是教科书里的“系统架构”,而是你亲手搭起机器人骨架的实操地图如果你正站在机器人开发的门口,手里攥着一块树莓派、一台aubo机械臂、或者刚拆开的米兔积木套件,却卡在“下一步该干什么”——是先焊电路?还是先写Python&am…

2026/9/30 17:38:25 阅读更多 →
一文搞懂通信调制:从AM到OFDM的进化全景图

一文搞懂通信调制:从AM到OFDM的进化全景图

📌 前言 为什么你的手机能同时上网、打电话、刷视频?为什么收音机能收到千里之外的广播?答案都藏在调制(Modulation)这门技术里。 💡 核心结论:调制没有绝对的好坏,只有在特定信道环…

2026/9/30 20:08:14 阅读更多 →

最新新闻

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器这三个字一出来,很多人第一反应是"游戏挂机脚本",但说实话我用了这么多年,鼠标自动连点真正帮我省下大把时间的场景,反而是那些枯燥到让人怀疑人生的重复工作:一遍遍点"下一步"、批量填表、…

2026/10/1 12:50:58 阅读更多 →
Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

1. 从一张账单说起:为什么同一个判断题,成本能差 5 倍 先把场景摆出来。我最近在做一个批量内容审核的小工具,核心逻辑特别简单:给一段文本,让模型判断它是否属于某个类别,输出只有两个值——是或否。这种任…

2026/10/1 12:50:58 阅读更多 →
ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

1. 汽车电子里的ECC公钥,为什么格式值得拿出来单聊做车载安全的人应该都有感触:ECC(椭圆曲线密码)在车联网和汽车电子里的应用已经非常密集,V2X车路协同、OTA升级签名、安全启动、SecOC报文认证、PKI证书链&#xff0c…

2026/10/1 12:50:58 阅读更多 →
IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

拿到IEC 62351-100-3一致性测试任务的时候,我第一反应是找标准原文、打开产品功能清单,准备一项一项打勾。真正进了实验室才发现,这套测试折腾的根本不是“功能是否正常”,而是“产品对安全机制的理解是否和标准一致”。业务功能正…

2026/10/1 12:50:58 阅读更多 →
Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

1. 从“Madeira”这个名字说起:它到底指什么第一次看到“Madeira”这个词,很多人第一反应是葡萄牙那个盛产葡萄酒的海岛,或者是一道叫“马德拉酱汁”的西餐配料。但在技术圈里,尤其是围绕 Wine、FEX-Emu、DXMT 这些关键词的讨论中…

2026/10/1 12:50:58 阅读更多 →
Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 的安装,单看流程图确实简单到让人提不起兴趣:下镜像、写U盘、引导、分区、下一步。但真正动手装过十几台机器之后你会发现,翻车的点几乎全在"下一步"之外——UEFI 和 Legacy 引导混着用导致装完进不去系统、硬盘分区…

2026/10/1 12:49:58 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →