- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
本篇技术指南以 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)发布的地面真值,用于测试与算法验证,不参与真实控制。
字段语义详解
文档中的字段表是理解该消息的核心,四个字段分别承担“时间基准”与“机体运动状态”两类信息:
| 字段 | 类型 | 单位/坐标系 | 含义 |
|---|---|---|---|
timestamp | uint64 | 微秒 | 消息发布时刻(自系统启动以来的时间,微秒),由发布端在hrt_absolute_time()时刻写入 |
timestamp_sample | uint64 | 微秒 | 该消息所基于的数据采样时刻,即陀螺仪产生本次数据的时间戳 |
xyz | float32[3] | rad/s,FRD 机体坐标系 | 经偏差校正(Bias corrected)后的三轴角速度 |
xyz_derivative | float32[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()的主要步骤:
- 参数更新:监听
parameter_update主题,处理IMU_GYRO_*系列参数变化; - 传感器选择:
SensorSelectionUpdate()依据sensor_selection.gyro_device_id选中主陀螺仪,优先使用 FIFO 批量数据(sensor_gyro_fifo),否则退回sensor_gyro单样本主题,并通过vehicle_imu_status校验传感器健康度; - 标定更新:
_calibration.SensorCorrectionsUpdate()应用陀螺仪标定参数; - 偏差更新:
SensorBiasUpdate()从 EKF 估计的estimator_sensor_bias获取当前陀螺仪零偏; - 滤波:对每轴原始数据依次应用动态陷波(ESC RPM / FFT)、固定陷波(NF0/NF1)、低通(
IMU_GYRO_CUTOFF)滤波,见 FilterAngularVelocity(); - 差分与 D 项滤波:
FilterAngularAcceleration()计算角加速度并经IMU_DGYRO_CUTOFF低通; - 发布:
CalibrateAndPublish()完成坐标旋转、偏差扣除后发布。
UpdateSampleRate()(源码)从vehicle_imu_status读取陀螺仪原始采样率,并按IMU_GYRO_RATEMAX计算发布节流:发布间隔被约束在 100 Hz~8 kHz 之间,同时始终以原始全速率读取与滤波传感器数据。
影响该消息的关键参数(来自 imu_gyro_parameters.yaml)
这些参数全部由 imu_gyro_parameters.yaml 定义,隶属于 Sensors 参数组:
| 参数 | 类型/单位 | 默认值 | 取值范围 | 作用 |
|---|---|---|---|---|
IMU_GYRO_CUTOFF | float, Hz | 40.0 | 0~1000 | 角速度 2 阶 Butterworth 低通截止频率;0 表示关闭。仅影响发送给控制器的信号,不影响估计器 |
IMU_DGYRO_CUTOFF | float, Hz | 20.0 | 0~1000 | 角加速度(D 项)低通截止频率;0 关闭。D 项对噪声最敏感,适当滤波可允许提高IMU_GYRO_CUTOFF以降低延迟 |
IMU_GYRO_NF0_FRQ | float, Hz | 0.0 | 0~1000 | 主陀螺仪 2 阶陷波滤波器中心频率;0 关闭。用于抑制特定结构共振的反馈放大 |
IMU_GYRO_NF0_BW | float, Hz | 20.0 | 0~100 | 陷波 0 带宽 |
IMU_GYRO_NF1_FRQ | float, Hz | 0.0 | 0~1000 | 第二陷波中心频率;0 关闭 |
IMU_GYRO_NF1_BW | float, Hz | 20.0 | 0~100 | 陷波 1 带宽 |
IMU_GYRO_RATEMAX | enum, Hz | 400 | 100~2000(选项:100/250/400/800/1000/2000) | 角速度数据最大发布率,即速率控制器内环频率;修改需重启 |
IMU_GYRO_DNF_EN | bitmask | 0 | 0~3 | 动态陷波开关:bit0=ESC RPM,bit1=FFT |
IMU_GYRO_DNF_BW | float, Hz | 15.0 | 5~30 | ESC RPM 动态陷波带宽 |
IMU_GYRO_DNF_HMC | int32 | 3 | 1~7 | ESC RPM 动态陷波的谐波数量 |
IMU_GYRO_DNF_MIN | float, Hz | 25.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。
设计要点小结
- 数据面与控制面解耦:滤波只作用于控制器通路,估计器使用未滤波数据,避免估计延迟;
- 时间戳双轨制:
timestamp_sample标识采样时刻,timestamp标识发布时刻,支撑延迟分析; - 坐标系统一:全部字段均为 FRD 机体坐标系,传感器安装旋转在校准层完成,消费端无需再处理旋转;
- 主题复用:同一消息结构承载真实信号与地面真值两个主题,显著降低仿真代码与日志分析工具的重复定义成本。
通过本文的字段解读与源码链路分析,读者可以准确解析vehicle_angular_velocity的每一条数据,并能在调参(如IMU_GYRO_CUTOFF、IMU_DGYRO_CUTOFF、IMU_GYRO_RATEMAX)时明确其对该消息乃至速率控制回路的实际影响。
- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
相关推荐
DifferentialPressure UORB 消息:PX4 空速传感器数据链路深度解析
DifferentialPressure UORB 消息:PX4 空速传感器数据链路深度解析 PX4 固件通过 DifferentialPressure UOR
嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot uORB 消息解析:SensorAccel 加速度计数据消息的字段、发布与消费全指南
PX4 Autopilot uORB 消息解析:SensorAccel 加速度计数据消息的字段、发布与消费全指南 本文是 PX4 Autopilot 中 sen
嵌入式物联网机器人自动驾驶智能硬件PX4 Autopilot 起落架状态 uORB 消息 LandingGear 深度解析:定义、产生机制与数据流向
PX4 Autopilot 起落架状态 uORB 消息 LandingGear 深度解析:定义、产生机制与数据流向 PX4 Autopilot 的 Landin
嵌入式物联网机器人自动驾驶智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考