1. PX4姿态控制概述
各位同学好,我是你们这门课的老朋友。今天咱们聊聊PX4姿态控制——说白了,就是让无人机知道“自己正着还是歪着”,然后把它掰正的过程。
我最早接触飞控时,觉得姿态控制不就是个PID嘛,调调参数就完事了。后来在项目里摔过几次机,才明白这里面门道很深。你想想看,一个四旋翼在空中,四个电机转速一变,飞机就得跟着动。怎么动、动多快、稳不稳,全看姿态控制写得好不好。
1.1 姿态控制的基本概念
姿态,英文叫Attitude,指的是飞行器相对于地面的朝向。通常我们用三个角度来描述:横滚角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。这三个角合起来,就是飞机的“姿态”。
核心理解:姿态控制的目标,就是让飞机的实际姿态,跟上你期望的姿态。比如遥控器往前推,飞机就该低头往前飞;风把飞机吹歪了,它得自己回正。
这里面有个关键点——姿态控制不是直接控制电机转速,而是控制角速度。为什么?因为电机转速和姿态之间隔着一层动力学,直接控姿态容易震荡。我习惯把姿态控制拆成两层:
- 外环(角度环):算误差,输出期望角速度
- 内环(角速度环):跟踪期望角速度,输出电机控制量
这种串级结构,是PX4姿态控制的基石。我在做植保无人机项目时,遇到过外环响应太慢、飞机转弯像“老牛拉车”的情况。后来把外环P增益调高了一倍,效果立竿见影。嗯,这里要注意——外环增益不是越大越好,调过了会抖。
1.2 PX4姿态控制架构
PX4的姿态控制,藏在mc_att_control模块里。它的整体流程,我画了张图,你一看就明白:
这张图里,我特意把反馈回路画出来了。很多人只看前向通路,忽略了反馈——其实反馈才是姿态控制的灵魂。没有准确的反馈,再好的控制器也是白搭。
在PX4里,姿态控制的核心代码在src/modules/mc_att_control/AttitudeControl.cpp。我带你看看关键的数据结构:
// PX4姿态控制核心结构体
struct vehicle_attitude_setpoint_s {
uint64_t timestamp; // 时间戳
float roll_body; // 期望横滚角 [rad]
float pitch_body; // 期望俯仰角 [rad]
float yaw_body; // 期望偏航角 [rad]
float thrust_body[3]; // 期望推力向量 [N]
uint8_t landing_gear; // 起落架状态
};
struct vehicle_attitude_s {
uint64_t timestamp; // 时间戳
float q[4]; // 四元数姿态表示
float roll; // 横滚角 [rad]
float pitch; // 俯仰角 [rad]
float yaw; // 偏航角 [rad]
float rollspeed; // 横滚角速度 [rad/s]
float pitchspeed; // 俯仰角速度 [rad/s]
float yawspeed; // 偏航角速度 [rad/s]
};
你看,期望姿态用vehicle_attitude_setpoint_s表示,实际姿态用vehicle_attitude_s表示。两者一减,就是误差。我刚开始看代码时,总搞不清四元数和欧拉角怎么切换。后来发现PX4内部统一用四元数做运算,只在日志和地面站里转成欧拉角。这样做的好处是——避免了万向锁。
小技巧:调试时如果发现飞机在某个角度突然“卡住”不动,十有八九是欧拉角表示遇到了万向锁。这时候检查一下代码里有没有用四元数做插值。PX4默认用四元数,但如果你自己写了外环控制器,记得保持一致。
1.3 姿态控制在无人机中的重要性
姿态控制有多重要?我这么说吧——它是无人机飞控的“地基”。地基不稳,上面盖的导航、路径规划、任务管理,全是空中楼阁。
具体来说,姿态控制决定了三件事:
| 维度 | 影响 | 实际表现 |
|---|---|---|
| 稳定性 | 抗风扰、抗振动 | 悬停时漂移量 < 0.5m(无GPS) |
| 机动性 | 响应速度、最大角速度 | 急转弯不侧滑、翻滚不掉高 |
| 精度 | 角度跟踪误差 | 航向保持误差 < 2° |
我记得有一次做测绘无人机,客户要求航线偏差不超过10厘米。我调了三天姿态参数,最后发现问题是角速度环的积分项太大,导致过冲。把积分限幅砍掉一半,精度立马达标。你看,姿态控制的好坏,直接决定了无人机能不能干“精细活”。
⚠️ 常见误区:很多人觉得姿态控制参数调好了就一劳永逸。其实不同负载、不同风速下,最优参数是不一样的。我建议你在实际部署时,至少准备三套参数:无风悬停、有风巡航、急停急转。PX4支持参数动态切换,别浪费这个功能。
另外,姿态控制还影响着上层算法的可靠性。比如视觉SLAM,如果姿态估计不准,特征点匹配就会出错。再比如路径规划,如果姿态响应太慢,规划出来的轨迹飞机根本跟不住。所以,我习惯把姿态控制比作“飞控的腰”——腰不好,全身都别扭。
最后说一句,姿态控制不是孤立存在的。它和状态估计(EKF)、电机控制(混控器)、传感器校准(IMU温补)都紧密相关。后面几章,我会带你把这些环节一个个打通。今天先把概念理清楚,后面动手调参时,你心里就有底了。