
PX4 姿态控制代码流程解析
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文深入剖析了开源飞行控制系统PX4中姿态控制模块的核心算法与实现细节,旨在帮助开发者理解其背后的代码逻辑和设计思路。适合有一定编程基础的读者学习研究。
### PX4姿态控制流程相关代码分析
#### 一、姿态控制代码流程
在PX4飞行控制系统中,姿态控制是确保无人机稳定飞行的关键组件之一。该模块负责接收来自遥控器或者内部控制器的目标姿态指令,并根据当前无人机的实际姿态计算出需要达到的目标角速度,进而通过PID控制器等算法调整电机输出,使无人机能够按照预定的姿态飞行。
以`STABILIZE`模式为例,主要涉及的函数包括`Copter::stabilize_run()`、`Copter::fast_loop()`和`AC_AttitudeControl::attitude_controller_run_quat()`等。
##### 1.1 `Copter::stabilize_run()`
```cpp
void Copter::stabilize_run()
{
将遥控器的输入转换成pitch、roll、yaw指令,并调用姿态控制模块。
}
```
在这个函数中,主要工作是将来自遥控器的信号转换为无人机需要执行的俯仰(pitch)、横滚(roll)和偏航(yaw)指令,然后调用姿态控制模块进行进一步处理。
##### 1.2 `Copter::fast_loop()`
```cpp
void Copter::fast_loop()
{
根据期望的姿态计算目标角速度,并通过电机输出实现对无人机姿态的精确控制。
run low-level rate controllers that only require IMU data
attitude_control->rate_controller_run();
控制电机输出并发送到电机库中立即执行。
send outputs to the motors library immediately
motors_output();
}
```
此部分涉及到两个核心步骤:首先通过调用`attitude_control->rate_controller_run()`来计算出目标角速度;随后,通过`motors_output()`函数将这些角速度转化为实际的电机输出,以实现对无人机姿态的精确控制。
#### 二、如何将期望的姿态转成角速度
在PX4中,将期望的姿态转换为角速度的过程涉及复杂的数学变换。这一过程主要由`AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw`函数完成。
##### 2.1 `AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw`
```cpp
void AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw(float euler_roll_angle_cd,
float euler_pitch_angle_cd,
float euler_yaw_rate_cds,
float smoothing_gain)
{
将角度值转换成弧度值,并把当前姿态的四元数转为欧拉角。
根据是否启用前馈控制,决定处理方式:
如果启用了前馈控制,则通过摇杆输入与上次目标姿态差异、平滑增益及限制加速度等计算本次目标欧拉角速率;
若未启用,则直接使用遥控器的pitch、roll和yaw值作为目标姿态,并将其转换为四元数表示,同时将欧拉角速率置零。
调用`attitude_controller_run_quat()`函数进行后续处理。
}
```
在此函数中,首先根据是否启用了前馈控制来决定具体的操作方式。如果启用,则通过摇杆输入与上次目标姿态差异、平滑增益及限制加速度等计算本次的目标欧拉角速率;若未启用,则直接使用遥控器的pitch、roll和yaw值作为目标姿态,并将其转换为四元数表示,同时将欧拉角速率置零。
##### 2.2 `AC_AttitudeControl::attitude_controller_run_quat`
```cpp
void AC_AttitudeControl::attitude_controller_run_quat()
{
获取当前的姿态信息。
计算目标姿态与当前姿态之间的差异,并根据此计算所需的角速度。将该角速度转换到机体坐标系中。
根据推力和姿态的角度差,决定如何调整目标推力方向:
如果角度超过60°,则设为当前位置的Z轴;
角度介于30°至60°之间时进行逐步逼近控制;
若角小于30°,直接调整到目标姿态。
}
```
该函数主要负责计算目标姿态和当前姿态之间的差异,并据此确定所需的角速度。具体来说:
- 获取当前的姿态信息。
- 计算目标与当前姿态的差值以得出所需的目标角速度。
- 将所得的角速度转换至机体坐标系中。
根据推力方向的角度误差,决定如何调整目标推力的方向:
- 如果角度误差超过60°,则将目标推力设为当前位置Z轴;
- 角度在30°到60°之间时进行逐步逼近控制;
- 若角小于30°直接调整至目标姿态。
#### 三、电机控制
电机控制是根据计算出的目标角速度来设定实际的电机输出,进而驱动
全部评论 (0)


