各位朋友,我们工作室以后会长期更新一些飞行器干货,本部分先介绍四旋翼的整体控制方案及相关设计

控制系统的框架如下,借鉴网上来源图片,

第一讲、四旋翼的整体控制方案

传感器主要是姿态传感器,对于大四轴而言,包括三轴陀螺仪、三轴加速度计、三轴磁力计,飞行器的主观三维主要依靠这9轴姿态信息进行姿态解算融合得到四元数和欧拉角,传感器采集的信息作为当前姿态,目标姿态由遥控器的通道信息决定,二者偏差作为PID的输入控制,姿态控制通过串级PID,外环角度环,内环进入角速度环,整定内环和外环PID之后输出加到姿态控制上,以此完成了飞行器的最基本控制飞行。

单环PID:

第一讲、四旋翼的整体控制方案第一讲、四旋翼的整体控制方案

改为串级PID:

第一讲、四旋翼的整体控制方案第一讲、四旋翼的整体控制方案


控制算法:

第一讲、四旋翼的整体控制方案第一讲、四旋翼的整体控制方案

首先,为了让四轴平稳的悬停或飞行在半空中,四个电机必须提供准确的力矩->假设力矩与电机PWM输出呈线性关系,也就是必须提供准确的4路PWM->4路PWM由遥控器输入(期望角度)、PID算法及其参数和姿态解算输出(当前角度)组成,假设遥控器输入不变(类似脱控)、PID算法及其参数也较为准确(PID参数无需十分精确,但只要在某个合理的范围内,控制品质差不了多

少),也就是姿态解算的输出必须是十分准确的,可以真实反应飞行器的实际角度->姿态解算的结果由加速度计和陀螺仪给出,根据前述惯性导航的描述,加速度计补偿陀螺仪,因此要得到精确的姿态解算结果,务必要求加速度输出精确的重力加速度g->这里仅讨论悬停飞行,因此忽略掉额外的线性加速度(事实证明,在四轴强机动飞行过程中,线性加速度必须要考虑并消除),假设加速度计输出重力加速度g,这个重力加速度g必须十分“精确”


在控制之前需要得到飞行器的姿态,姿态就需要进行算法,目前常见的有AHRS、IMU还有姿态传感器直接输出的DMP,这里以IMU为例,涉及的硬件部分包括:

MPU6050和电子罗盘或者磁力计作用作为姿态传感器作用:

加速度计和磁力计共同可以计算得三轴姿态角即三轴角度

陀螺仪误差积分得到偏航角,偏航角通过磁力计进行地磁补偿

数据融合:

陀螺仪会发生漂移,磁力计的输出值稳定补偿和矫正陀螺仪的漂移。

部分IMU姿态解算程序如下:

norm = sqrt(ax*ax + ay*ay + az*az);       
ax = ax /norm;
ay = ay / norm;
az = az / norm;

// estimated direction of gravity and flux (v and w)              
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3 ;

// error is sum of cross product between reference direction of fields and direction measured by sensors
ex = (ay*vz - az*vy) * Accel_magnitude;                          
ey = (az*vx - ax*vz) * Accel_magnitude;
ez = (ax*vy - ay*vx) * Accel_magnitude;

exInt = exInt + ex * Ki;
eyInt = eyInt + ey * Ki;
ezInt = ezInt + ez * Ki;

// adjusted gyroscope measurements
gx = gx + Kp*ex + exInt; 
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt; 


q0 = q0 + (-q1*gx - q2*gy - q3*gz)*HalfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*HalfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*HalfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*HalfT;

// normalise quaternion
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;

Roll = -atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1);
Pitch = -asin(-2 * q1 * q3 + 2 * q0* q2);


Q_ANGLE.Z = GYRO_I.Z;//atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw
Q_ANGLE.Y = Pitch * 57.29578 - AngleOffset_Pit;
Q_ANGLE.X = Roll * 57.29578 - AngleOffset_Rol;




相关文章:

  • 2021-12-15
  • 2021-07-17
  • 2021-10-05
  • 2022-01-18
  • 2022-01-10
  • 2021-04-18
  • 2021-05-05
  • 2021-04-06
猜你喜欢
  • 2021-11-28
  • 2022-01-29
  • 2021-08-27
  • 2021-07-29
  • 2021-09-24
  • 2021-07-08
相关资源
相似解决方案