☰
PX4 Autopilot VehicleAngularVelocity 消息深度解析:机体角速度/角加速度 uORB 数据结构与生产链路
2026/10/2 13:34:51 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

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

本篇技术指南以 PX4-Autopilot 仓库中的 VehicleAngularVelocity 消息文档 为骨架,深入讲解这条承载机体三轴角速度与角加速度的 uORB 消息的字段语义、坐标系约定、双 TOPICS(vehicle_angular_velocity与vehicle_angular_velocity_groundtruth)的用途差异,并结合 VehicleAngularVelocity 模块源码 与 imu_gyro_parameters.yaml 还原其从陀螺仪原始数据到控制器消费的完整信号链路。读完本文,你将能准确解读日志/订阅数据中的vehicle_angular_velocity消息,理解每个字段的物理含义与坐标系,并掌握 IMU_GYRO_* 系列滤波参数如何影响该消息的产出。

消息概览:机体坐标系下的角速度与角加速度

vehicle_angular_velocity是 PX4 中面向控制器发布的高频姿态率消息,由sensors/vehicle_angular_velocity模块从陀螺仪原始测量经过校准、去偏、滤波后发布。其定义位于 msg/versioned/VehicleAngularVelocity.msg,原始 .msg 文件内容如下:

uint32 MESSAGE_VERSION = 0 uint64 timestamp # time since system start (microseconds) uint64 timestamp_sample # timestamp of the data sample on which this message is based (microseconds) float32[3] xyz # Bias corrected angular velocity about the FRD body frame XYZ-axis in rad/s float32[3] xyz_derivative # angular acceleration about the FRD body frame XYZ-axis in rad/s^2 # TOPICS vehicle_angular_velocity vehicle_angular_velocity_groundtruth

该消息同时声明了两个 TOPICS(# TOPICS注释由 uORB 代码生成器解析,用于为同一消息结构注册多个发布主题):

  • vehicle_angular_velocity:真实传感器链路产出的角速度/角加速度,供飞行控制回路使用;
  • vehicle_angular_velocity_groundtruth:仿真环境(Gazebo/GZ、MAVLink SITL、SIH)发布的地面真值,用于测试与算法验证,不参与真实控制。

字段语义详解

文档中的字段表是理解该消息的核心,四个字段分别承担“时间基准”与“机体运动状态”两类信息:

字段类型单位/坐标系含义
timestampuint64微秒消息发布时刻(自系统启动以来的时间,微秒),由发布端在hrt_absolute_time()时刻写入
timestamp_sampleuint64微秒该消息所基于的数据采样时刻,即陀螺仪产生本次数据的时间戳
xyzfloat32[3]rad/s,FRD 机体坐标系经偏差校正(Bias corrected)后的三轴角速度
xyz_derivativefloat32[3]rad/s²,FRD 机体坐标系三轴角加速度(角速度的导数)

字段序号即数组元素与机体轴的对应关系:xyz[0]对应机体 X 轴(机头方向)、xyz[1]对应 Y 轴(右翼方向)、xyz[2]对应 Z 轴(向下方向),遵循FRD(Front-Right-Down)右手坐标系约定。

timestamp 与 timestamp_sample 的时间关系

两者区分“数据采集时刻”与“发布时刻”,对时间敏感的控制与日志回放分析非常重要:

  • timestamp_sample来自陀螺仪驱动/传感器模块的采样时间戳,标识被滤波的那一帧原始数据的产生时刻;
  • timestamp在 CalibrateAndPublish() 中以hrt_absolute_time()写入,晚于timestamp_sample,两者差值即滤波与发布流水线引入的延迟。

xyz:偏差校正后的角速度

xyz的定义是“Bias corrected”角速度,即已扣除陀螺仪在运行中估计的零偏。在源码发布路径中:

_angular_velocity = _calibration.Correct(angular_velocity_uncalibrated) - _bias; _angular_velocity.copyTo(angular_velocity.xyz);

其中_bias由 SensorBiasUpdate() 从 EKF 的estimator_sensor_bias消息获取(以estimator_selector_status选出的主估计器实例为准,且要求gyro_device_id与当前选中传感器一致),当无有效估计偏差时置零。也就是说,xyz是经过传感器标定(比例、交叉轴、安装旋转)、固定零偏校正与运行中 EKF 偏差剔除之后的机体角速度。

xyz_derivative:角加速度

xyz_derivative是角速度对时间的导数,由 FilterAngularAcceleration() 对相邻采样做差分((data[n] - prev) * inverse_dt_s)并经过一阶低通(AlphaFilter)平滑得到,滤波截止频率由IMU_DGYRO_CUTOFF控制。发布时仅做传感器系到机体系的旋转换算:

_angular_acceleration = _calibration.rotation() * angular_acceleration_uncalibrated; _angular_acceleration.copyTo(angular_velocity.xyz_derivative);

该字段是速率控制器 D 项(角加速度反馈)的直接数据源,在姿态响应中起到阻尼作用。

常量 MESSAGE_VERSION

消息定义了唯一常量MESSAGE_VERSION = 0(uint32),用于标识消息布局版本。当前版本为 0,后续若消息字段发生不兼容变更,该版本号会递增以支持协议协商。

从原始陀螺仪到控制器:消息的生产链路

vehicle_angular_velocity由 src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp 中的VehicleAngularVelocity类(继承ModuleParams与px4::ScheduledWorkItem,挂载于rate_ctrl工作队列)产出。其单次执行周期Run()的主要步骤:

  1. 参数更新:监听parameter_update主题,处理IMU_GYRO_*系列参数变化;
  2. 传感器选择:SensorSelectionUpdate()依据sensor_selection.gyro_device_id选中主陀螺仪,优先使用 FIFO 批量数据(sensor_gyro_fifo),否则退回sensor_gyro单样本主题,并通过vehicle_imu_status校验传感器健康度;
  3. 标定更新:_calibration.SensorCorrectionsUpdate()应用陀螺仪标定参数;
  4. 偏差更新:SensorBiasUpdate()从 EKF 估计的estimator_sensor_bias获取当前陀螺仪零偏;
  5. 滤波:对每轴原始数据依次应用动态陷波(ESC RPM / FFT)、固定陷波(NF0/NF1)、低通(IMU_GYRO_CUTOFF)滤波,见 FilterAngularVelocity();
  6. 差分与 D 项滤波:FilterAngularAcceleration()计算角加速度并经IMU_DGYRO_CUTOFF低通;
  7. 发布:CalibrateAndPublish()完成坐标旋转、偏差扣除后发布。

UpdateSampleRate()(源码)从vehicle_imu_status读取陀螺仪原始采样率,并按IMU_GYRO_RATEMAX计算发布节流:发布间隔被约束在 100 Hz~8 kHz 之间,同时始终以原始全速率读取与滤波传感器数据。

影响该消息的关键参数(来自 imu_gyro_parameters.yaml)

这些参数全部由 imu_gyro_parameters.yaml 定义,隶属于 Sensors 参数组:

参数类型/单位默认值取值范围作用
IMU_GYRO_CUTOFFfloat, Hz40.00~1000角速度 2 阶 Butterworth 低通截止频率;0 表示关闭。仅影响发送给控制器的信号,不影响估计器
IMU_DGYRO_CUTOFFfloat, Hz20.00~1000角加速度(D 项)低通截止频率;0 关闭。D 项对噪声最敏感,适当滤波可允许提高IMU_GYRO_CUTOFF以降低延迟
IMU_GYRO_NF0_FRQfloat, Hz0.00~1000主陀螺仪 2 阶陷波滤波器中心频率;0 关闭。用于抑制特定结构共振的反馈放大
IMU_GYRO_NF0_BWfloat, Hz20.00~100陷波 0 带宽
IMU_GYRO_NF1_FRQfloat, Hz0.00~1000第二陷波中心频率;0 关闭
IMU_GYRO_NF1_BWfloat, Hz20.00~100陷波 1 带宽
IMU_GYRO_RATEMAXenum, Hz400100~2000(选项:100/250/400/800/1000/2000)角速度数据最大发布率,即速率控制器内环频率;修改需重启
IMU_GYRO_DNF_ENbitmask00~3动态陷波开关:bit0=ESC RPM,bit1=FFT
IMU_GYRO_DNF_BWfloat, Hz15.05~30ESC RPM 动态陷波带宽
IMU_GYRO_DNF_HMCint3231~7ESC RPM 动态陷波的谐波数量
IMU_GYRO_DNF_MINfloat, Hz25.0-动态陷波最小频率

注意:两个固定陷波(NF0/NF1)与角速度低通同时作用于角速度和角加速度两条输出(角加速度部分由IMU_DGYRO_CUTOFF单独控制),且只影响送往控制器的信号,不改变 EKF 估计器使用的数据。

TOPICS 双通道:真实信号与仿真地面真值

# TOPICS指令使同一vehicle_angular_velocity_s结构被实例化为两个 uORB 主题:

  • vehicle_angular_velocity:由VehicleAngularVelocity模块发布,是速率控制器、姿态控制回路的输入。订阅方包括 mc_rate_control/MulticopterRateControl.cpp(多旋翼速率控制)、fw_rate_control、airship_att_control、rover_*系列、mc_nn_control、spacecraft、uuv_att_control等;
  • vehicle_angular_velocity_groundtruth:仅由仿真链路发布。例如 simulation/gz_bridge/GZBridge.cpp 将 Gazebo 仿真的机体角速度写入该主题,simulator_mavlink/SimulatorMavlink.hpp 与 simulator_sih/sih.hpp 同理;消费方为 HIL 状态回传流 mavlink/streams/HIL_STATE_QUATERNION.hpp 以及默认飞行日志(logger/logged_topics.cpp)。

这一设计让测试者可以在 SITL/HITL 中对比“地面真值”与“传感器估计值”,量化滤波、估计延迟与噪声水平。

如何查看与订阅该消息

  • NSH 命令行实时监听:在 PX4 终端使用系统命令listener打印主题内容(实现见 src/systemcmds/topic_listener):

    listener vehicle_angular_velocity

    输出将包含timestamp、timestamp_sample、xyz、xyz_derivative及消息速率统计。

  • 日志记录:vehicle_angular_velocity是飞行日志的默认录制主题(见 logged_topics.cpp),可在 Flight Review 等工具中查看角速度时间序列;vehicle_angular_velocity_groundtruth同样以 10 Hz 采样率进入默认日志,便于回放时对照。

  • ROS 2 / DDS 桥接:该主题可通过 uXRCE-DDS 客户端与 Zenoh 桥接发布到 ROS 2 等外部生态,相关映射见 uxrce_dds_client/dds_topics.yaml 与 zenoh/dds_topics.yaml。

设计要点小结

  1. 数据面与控制面解耦:滤波只作用于控制器通路,估计器使用未滤波数据,避免估计延迟;
  2. 时间戳双轨制:timestamp_sample标识采样时刻,timestamp标识发布时刻,支撑延迟分析;
  3. 坐标系统一:全部字段均为 FRD 机体坐标系,传感器安装旋转在校准层完成,消费端无需再处理旋转;
  4. 主题复用:同一消息结构承载真实信号与地面真值两个主题,显著降低仿真代码与日志分析工具的重复定义成本。

通过本文的字段解读与源码链路分析,读者可以准确解析vehicle_angular_velocity的每一条数据,并能在调参(如IMU_GYRO_CUTOFF、IMU_DGYRO_CUTOFF、IMU_GYRO_RATEMAX)时明确其对该消息乃至速率控制回路的实际影响。

  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

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

相关推荐

上一篇:非美式键盘用户必看:Toshy 2026版布局修正功能使用教程
下一篇:TypeGraphQL查询成本分析:资源消耗估算与限制

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

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

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

立即咨询