☰
PX4-Autopilot 消息详解:AutotuneAttitudeControlStatus 自整定姿态控制状态消息
2026/9/26 10:15:43 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

导读

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。

字段详解

时间戳与识别结果(模型辨识输出)

字段类型单位含义
timestampuint64us自系统启动以来的时间(微秒),用于订阅方判断消息时效
coefffloat32[5]—辨识得到的离散时间模型系数(共 5 个)
coeff_varfloat32[5]—上述模型系数的方差
fitnessfloat32—参数估计的拟合度(fitness),衡量模型与实测数据的匹配程度
innovfloat32rad/s新息(innovation),即模型输出与实测输出之间的残差
dt_modelfloat32s用于系统辨识的模型采样时间

其中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依据陀螺仪截止频率与采样率确定。

整定所得增益(控制器参数候选)

字段类型说明
kcfloat32比例角速率环增益(理想形式)
kifloat32积分角速率环增益(理想形式)
kdfloat32微分角速率环增益(理想形式)
kfffloat32前馈角速率环增益
att_pfloat32姿态环比例增益

这五个字段携带的是自整定模块在辨识出模型后,通过增益设计算法计算出的候选 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_spfloat32[3]rad/s命令给姿态控制器的角速率设定值(roll/pitch/yaw 三轴)
u_filtfloat32—滤波后的输入信号(归一化力矩设定值),用于系统辨识
y_filtfloat32rad/s滤波后的输出信号(角速度),用于系统辨识

rate_sp是该消息中唯一被控制器真正消费的字段:它本质上是自整定模块产生的激励信号(扫频/正弦激励,见getIdentificationSignal(),多旋翼实现位于 mc_autotune_attitude_control.cpp)。u_filt与y_filt则是系统辨识环节使用的滤波输入/输出,配合高通/低通滤波(wash-out 与抗混叠)提取激励频带内的有效信息。

state 字段与 STATE 枚举(整定状态机)

state为uint8类型,取值为下面的STATE枚举,完整枚举定义见 AutotuneAttitudeControlStatus.msg:

值名称说明
0STATE_IDLE空闲(未运行)
1STATE_INIT初始化滤波器与参数设置
2STATE_ROLL_AMPLITUDE_DETECTION仅固定翼:确定滚转轴所需激励幅度
3STATE_ROLL滚转轴激励与模型辨识
4STATE_ROLL_PAUSE暂停以恢复平飞
5STATE_PITCH_AMPLITUDE_DETECTION仅固定翼:确定俯仰轴所需激励幅度
6STATE_PITCH俯仰轴激励与模型辨识
7STATE_PITCH_PAUSE暂停以恢复平飞
8STATE_YAW_AMPLITUDE_DETECTION仅固定翼:确定偏航轴所需激励幅度
9STATE_YAW偏航轴激励与模型辨识
10STATE_YAW_PAUSE暂停以恢复平飞
11STATE_VERIFICATION验证模型与候选增益
12STATE_APPLY应用增益
13STATE_TEST闭环测试增益
14STATE_COMPLETE整定成功完成
15STATE_FAIL整定失败(模型无效或控制器不稳定)
16STATE_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

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

相关推荐

上一篇:大麦网抢票实战手册:揭秘自动化脚本背后的技术黑科技
下一篇:stackplz事件并发处理:多CPU核心下的日志时序问题解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询