- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
导读
AutotuneAttitudeControlStatus 是 PX4-Autopilot 中连接"自整定(Autotune)模块"与"姿态控制器"的核心 uORB 消息:fw_autotune_attitude_control与mc_autotune_attitude_control模块在用户启动自整定时发布该消息,对应的固定翼/多旋翼姿态控制器订阅它并据此叠加角速率指令。本文基于 AutotuneAttitudeControlStatus.md 与 AutotuneAttitudeControlStatus.msg 源定义,逐字段拆解该消息的语义、整定状态机枚举,并结合 mc_autotune_attitude_control 与 fw_autotune_attitude_control 的源码实现,说明消息如何被发布、消费与记录,帮助读者在日志分析、调试与二次开发时准确解读自整定过程。
消息概述:谁发布、谁订阅、谁记录
从消息定义文件 AutotuneAttitudeControlStatus.msg 开头的注释可以明确该消息的完整数据流:
- 发布方:
fw_autotune_attitude_control(固定翼自整定模块)与mc_autotune_attitude_control(多旋翼自整定模块)。用户通过遥控器或地面站触发自整定后,这两个模块进入各自的整定状态机,并在运行期间周期性发布本消息。 - 订阅方:对应的姿态控制器(
fw_att_control与mc_att_control)。控制器只消费其中的rate_sp字段,将其叠加到自身计算出的角速率设定值上,从而在整定过程中按模块设计的激励信号驱动飞机。 - 日志用途:消息中的其余字段——模型系数、系数方差、整定增益、滤波器输入输出、整定状态等——主要用于日志记录与调试分析。在 logged_topics.cpp 中,
autotune_attitude_control_status被登记为可选日志话题(add_optional_topic("autotune_attitude_control_status", 100)),整定过程中会以 100 Hz 的记录速率写入 ulog,供整定后回放分析。
消息主题名为autotune_attitude_control_status,在 msg/CMakeLists.txt 中注册,由 uORB 代码生成工具(px_generate_uorb_topic_files.py)生成对应的 C/C++ 头文件与结构体autotune_attitude_control_status_s。
字段详解
时间戳与识别结果(模型辨识输出)
| 字段 | 类型 | 单位 | 含义 |
|---|---|---|---|
timestamp | uint64 | us | 自系统启动以来的时间(微秒),用于订阅方判断消息时效 |
coeff | float32[5] | — | 辨识得到的离散时间模型系数(共 5 个) |
coeff_var | float32[5] | — | 上述模型系数的方差 |
fitness | float32 | — | 参数估计的拟合度(fitness),衡量模型与实测数据的匹配程度 |
innov | float32 | rad/s | 新息(innovation),即模型输出与实测输出之间的残差 |
dt_model | float32 | s | 用于系统辨识的模型采样时间 |
其中coeff、coeff_var、fitness、innov、dt_model均来自自整定模块内部的SystemIdentification对象(见 system_identification.hpp)。在发布逻辑(mc_autotune_attitude_control.cpp)中可以看到:
- 辨识系数按轴序排列,其中分子系数乘上了输入缩放因子
_input_scale(用于归一化输入输出量纲、避免协方差矩阵病态化); model_dt由_model_update_scaler * _filter_dt计算得出,其中_filter_dt是实际滤波器采样间隔,_model_update_scaler依据陀螺仪截止频率与采样率确定。
整定所得增益(控制器参数候选)
| 字段 | 类型 | 说明 |
|---|---|---|
kc | float32 | 比例角速率环增益(理想形式) |
ki | float32 | 积分角速率环增益(理想形式) |
kd | float32 | 微分角速率环增益(理想形式) |
kff | float32 | 前馈角速率环增益 |
att_p | float32 | 姿态环比例增益 |
这五个字段携带的是自整定模块在辨识出模型后,通过增益设计算法计算出的候选 PID 增益。多旋翼实现使用lib/pid_design中的computePidGmvc(GMVC,广义最小方差控制)完成计算,源码见 mc_autotune_attitude_control.cpp:
- 期望上升时间
desired_rise_time由参数MC_AT_RISE_TIME给出,偏航轴整定阶段固定取 0.2 s; - 姿态增益
att_p采用经验规则估算:"60 度误差应产生最大控制输出",即K_att * K_rate * rad(60) = 1,并限制在[2, 6.5]范围内。
这些增益字段在整定过程中实时发布,供地面站显示、日志记录,并在状态机推进到STATE_APPLY后写入参数(如MC_ROLLRATE_K/I/D、MC_ROLL_P等)。
指令信号与滤波信号
| 字段 | 类型 | 单位 | 说明 |
|---|---|---|---|
rate_sp | float32[3] | rad/s | 命令给姿态控制器的角速率设定值(roll/pitch/yaw 三轴) |
u_filt | float32 | — | 滤波后的输入信号(归一化力矩设定值),用于系统辨识 |
y_filt | float32 | rad/s | 滤波后的输出信号(角速度),用于系统辨识 |
rate_sp是该消息中唯一被控制器真正消费的字段:它本质上是自整定模块产生的激励信号(扫频/正弦激励,见getIdentificationSignal(),多旋翼实现位于 mc_autotune_attitude_control.cpp)。u_filt与y_filt则是系统辨识环节使用的滤波输入/输出,配合高通/低通滤波(wash-out 与抗混叠)提取激励频带内的有效信息。
state 字段与 STATE 枚举(整定状态机)
state为uint8类型,取值为下面的STATE枚举,完整枚举定义见 AutotuneAttitudeControlStatus.msg:
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | STATE_IDLE | 空闲(未运行) |
| 1 | STATE_INIT | 初始化滤波器与参数设置 |
| 2 | STATE_ROLL_AMPLITUDE_DETECTION | 仅固定翼:确定滚转轴所需激励幅度 |
| 3 | STATE_ROLL | 滚转轴激励与模型辨识 |
| 4 | STATE_ROLL_PAUSE | 暂停以恢复平飞 |
| 5 | STATE_PITCH_AMPLITUDE_DETECTION | 仅固定翼:确定俯仰轴所需激励幅度 |
| 6 | STATE_PITCH | 俯仰轴激励与模型辨识 |
| 7 | STATE_PITCH_PAUSE | 暂停以恢复平飞 |
| 8 | STATE_YAW_AMPLITUDE_DETECTION | 仅固定翼:确定偏航轴所需激励幅度 |
| 9 | STATE_YAW | 偏航轴激励与模型辨识 |
| 10 | STATE_YAW_PAUSE | 暂停以恢复平飞 |
| 11 | STATE_VERIFICATION | 验证模型与候选增益 |
| 12 | STATE_APPLY | 应用增益 |
| 13 | STATE_TEST | 闭环测试增益 |
| 14 | STATE_COMPLETE | 整定成功完成 |
| 15 | STATE_FAIL | 整定失败(模型无效或控制器不稳定) |
| 16 | STATE_WAIT_FOR_DISARM | 等待解锁前最终确认(即等待用户解除武装后落地参数) |
多旋翼状态机(简化):idle → init → roll → roll_pause → pitch → pitch_pause → yaw → yaw_pause → verification → apply → test → complete / fail。在 mc_autotune_attitude_control.cpp 的updateStateMachine()中:
- 收敛判定阈值
converged_thr = 50.f(基于辨识方差/拟合度); - 各轴激励阶段会先暂停(
*_pause)让飞机恢复平飞,再进入下一轴; verification阶段通过areGainsGood()校验模型与候选增益是否可靠(mc_autotune_attitude_control.cpp);- 校验通过进入
apply(备份并写入参数),随后test阶段在闭环下验证新增益,若失稳则回退原参数并置为fail; wait_for_disarm表示整定结果已就绪,等待飞机解锁(disarm)后最终确认写入。
固定翼状态机差异:固定翼额外包含STATE_ROLL_AMPLITUDE_DETECTION/STATE_PITCH_AMPLITUDE_DETECTION/STATE_YAW_AMPLITUDE_DETECTION三个"激励幅度探测"状态(分别对应枚举值 2/5/8),用于在辨识前自动确定各轴所需的激励幅值。
发布与消费的源码链路
发布侧:100 ms 周期发布
多旋翼模块以固定周期发布本消息。在 mc_autotune_attitude_control.hpp 中定义了发布周期:
_publishing_dt_s = 100e-3f(100 ms);_publishing_dt_hrt = 100_ms。
对应的发布循环(mc_autotune_attitude_control.cpp)在每个周期内依次执行:推进状态机 → 读取辨识系数与方差 → 计算候选 PID 增益 → 组装autotune_attitude_control_status_s结构体 → 调用_autotune_attitude_control_status_pub.publish(status)发布。固定翼模块在 fw_autotune_attitude_control.cpp 中以相同模式发布。
订阅侧:控制器叠加 rate_sp
多旋翼姿态控制器 mc_att_control_main.cpp 中的消费逻辑为:
- 通过
_autotune_attitude_control_status_sub.copy(&pid_autotune)获取最新消息(订阅句柄定义于 mc_att_control.hpp); - 仅当
state处于STATE_ROLL/STATE_PITCH/STATE_YAW/STATE_TEST之一,且消息时间戳距今小于 1 秒((now - pid_autotune.timestamp) < 1_s)时,才把rate_sp叠加到控制器输出的rates_sp上; - 叠加后的结果通过
vehicle_rates_setpoint话题发布给后续控制链。
固定翼姿态控制器 FixedwingAttitudeControl.cpp 的逻辑类似,但额外允许STATE_ROLL_AMPLITUDE_DETECTION/STATE_PITCH_AMPLITUDE_DETECTION/STATE_YAW_AMPLITUDE_DETECTION三个幅度探测状态叠加rate_sp(以bodyrate_autotune_ff前馈形式注入)。
该"状态 + 时间戳"双重校验的设计,保证了整定激励信号只在实际激励/测试阶段注入控制回路,避免因旧消息或异常状态导致控制器行为失控。
典型应用场景与调试要点
1. 整定过程的实时监控
state字段是判断整定进度的关键。地面站或调试脚本可通过订阅autotune_attitude_control_status.state实时显示状态机推进,例如:
- 状态 3/6/9(
ROLL/PITCH/YAW)表示对应轴正在激励辨识; - 状态 4/7/10(
*_PAUSE)表示正在恢复平飞; - 状态 11(
VERIFICATION)表示正在校验模型; - 状态 14(
COMPLETE)表示整定成功; - 状态 15(
FAIL)表示整定失败,需检查模型有效性或控制器稳定性; - 状态 16(
WAIT_FOR_DISARM)表示等待用户解锁后确认参数。
2. 日志回放与模型质量评估
整定完成后,通过 ulog 中的autotune_attitude_control_status话题(记录速率 100 Hz,见 logged_topics.cpp)可评估整定质量:
fitness越高说明辨识模型与实测数据越吻合;偏低时需检查激励幅度、飞行状态或传感器噪声;innov(新息)的波动反映了模型残差,若长期偏大说明模型结构未覆盖主导动力学;coeff/coeff_var可用来检查辨识出的离散模型是否在合理量级(系数方差过大说明估计不可靠);u_filt/y_filt用于核对辨识环节的输入输出滤波是否正常(如激励是否进入期望频带)。
3. 二次开发与调试建议
- 若需要扩展整定流程(如新增轴或自定义激励信号),可直接修改
updateStateMachine()与getIdentificationSignal()(mc_autotune_attitude_control.cpp),并保持state枚举与消息定义一致; - 增益计算逻辑位于 pid_design.hpp 的
computePidGmvc,如需调整整定目标(如上升时间、阻尼比)可在此层修改,无需改动消息格式; - 系统辨识核心算法位于 system_identification.hpp,负责系数/方差/拟合度/新息的递推估计。
总结
AutotuneAttitudeControlStatus是 PX4 自整定功能中连接辨识模块、姿态控制器与日志系统三者之间的枢纽消息:
- 发布:
fw_autotune_attitude_control/mc_autotune_attitude_control以 100 ms 周期发布(mc_autotune_attitude_control.cpp); - 消费:姿态控制器仅在激励/测试状态下叠加
rate_sp(mc_att_control_main.cpp、FixedwingAttitudeControl.cpp); - 记录:以 100 Hz 写入日志(logged_topics.cpp)。
理解该消息的字段语义与状态机枚举,是读懂整定日志、排查整定失败原因以及扩展自整定功能的基础。完整的字段与枚举定义始终以 AutotuneAttitudeControlStatus.msg 为准,本文所引源码路径可进一步深入阅读实现细节。
- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
相关推荐
Gopeed Go–Flutter 进程内 API 架构解析:从 REST 到 FFI / gomobile 的统一调用体系
Gopeed Go–Flutter 进程内 API 架构解析:从 REST 到 FFI / gomobile 的统一调用体系 导读 Gopeed 是一个基于 G
嵌入式物联网机器人自动驾驶智能硬件Crawl4AI实战指南:三步构建智能网页爬取流水线
Crawl4AI实战指南:三步构建智能网页爬取流水线 你是否曾为复杂的JavaScript渲染网站而头疼?或者花费数小时清理网页中的广告和导航栏噪音?当面对需要
网页爬虫RAG人工智能AI 应用maku-boot消息日志:消息发送状态监控
maku boot消息日志:消息发送状态监控 概述 在企业级应用开发中,消息服务是不可或缺的重要功能。maku boot作为企业级低代码平台,提供了完善的消息日
低代码后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考