首页 > 编程知识 正文

小型四旋翼无人机,军用四旋翼无人机

时间:2023-05-06 04:59:19 阅读:54470 作者:1894

姿态计算姿态传感器读取加速度和角速度,但一个系统的自动控制往往需要更上层且更接近APP应用的属性——角度。 因此,有必要对加速度和角速度进行数据融合变换得到姿态角度。

以MPU6050为例,姿态解包括硬解DMP解和软解,传感器内部配置的运动处理器可以与DMP软件库结合进行DMP解,根据IMU的特性进行MCU等开发平台软件解只关注对传感器原始数据进行算法融合,但这里只讨论软件姿态解。

互补滤波器软件解的主要原理是互补滤波器,实际上角速度积分可以单独得到角度,加速度可以单独通过反正切得到角度,但这两种方式都有缺点。 角速度积分得到的角度在积分中积累误差,随着积分时间的延长精度逐渐减小,而角加速度瞬间稳定性差,角加速度得到的角度稳定有效果,但物体工作时效果不理想。 互补滤波就是针对这种情况将两者结合起来,用很长的时间来弥补较短的时间。 通过首先对角速度进行积分而求出角度值,并以加速度不断地修正该值,能够使动态且长时间的情况下得到的角度值更准确。

一阶互补滤波的简单c语言求解姿态的基本步骤:

1 .根据反正切公式由加速度求出角度

2 .用角速度积分求角度,施加积分限制

3 .求两者误差补偿角速度积分

4 .调节积分参数和角度融合参数

注:

1 .求出哪个轴角度取决于积分中使用的轴的角速度

2 .仅适用于平衡车等简单场景,不适用于无人机操纵,存在接头锁定问题

# define pi _ math 3.14159265358979 f # define gyro _ k 0.005 # define angle _ k 0.02 float angle _ get (float gyro _ y,floatgyryry ) ACC_angle_y=Atan2(Accel_x,accel_z ) * 180/PI_MATH; gyro_integration =gyro_y * GYRO_K; if (ACC_angle_y=gyro_integration10 ) ACC _ angle _ y=gyro _ integration 10; if (ACC _ angle _ y=gyro _ integration-10 ) ACC _ angle _ y=gyro _ integration-10; angle _ err=ACC _ angle _ y-gyro _ integration; gyro _ integration=angle _ err * angle _ k; angle_out=gyro_integration; 返回angle _ out; )四元数姿态分析IMU (惯性导航单元)包括三轴加速度和三轴角速度,可以通过各轴的数据融合进行姿态分析。 姿态实质上是机体坐标系相对于地理坐标系的状态,表现姿态以地理坐标系为基准表现两者的变换关系。 机体的姿势,矢量可以在地理坐标系的各轴上用馀弦(投影)表示。 三个向量在三个轴上的方向馀弦可以构成一个三次矩阵。

姿势有三种表现形式: wsdlm、余弦旋转矩阵和四元数。 wsdlm最适合人类的思维习惯,但存在关节死锁问题(旋转轴重叠时无法按规则正确到达目标位置),计算较慢,因此使用计算快、内存小的四元数进行姿态计算过程,从而

这里采用四元数形式PI控制思想的Mahony互补滤波算法,利用传感器读出的角速度求出四元数,提取四元数中的重力分量,利用机体坐标系上的重力分量和机体坐标系的矢量进行差分运算计算出误差。

对该重力,即加速度误差进行积分和比例运算(PI ),对陀螺仪进行补偿,修正角速度积分漂移误差。 q为四元数、b为机体坐标系、r为地理坐标系时,地理坐标系向机体坐标系的转换如下。

余弦矩阵形式的wsdlm旋转表示与四元数表示的旋转关系的对等性。 可以用四元数求出wsdlm。 四元数将转换为wsdlm,即三维空间的角度。

Mahony互补滤波算法c的实现笔者读过多种无人机飞控源代码,Mahony互补滤波算法在姿态分析时最常用,源代码的实现也很相似。 最后的主要步骤如下:

1、重力加速度归一化

2、用各轴角度馀弦矩阵求估计重力分量

3、推算重力方向与测量重力方向的外积之和求误差

4、积分误差反馈调节及比例反馈调节(互补滤波) ) ) ) )。

5、用一阶长达求解四元数微分方程

6、四元数归一化

7、四元数旋转wsdlm

浮动my _ sqrt (浮动编号) {long i; 浮动x,y; 常数浮动f=1.5f; x=number * 0.5F; y=number; I=*(long* ) y; I=0x5f3759df-(I1 ) )

;y = * ( float * ) &i;y = y * ( f - ( x * y * y ) );y = y * ( f - ( x * y * y ) );return number * y;}#define Kp (80.0f)#define Ki (50.0f)void mahony_imu_update(float *gyro , float *acc*,float *angle*) {float gx,gy, gz, ax, ay, az;gx = gyro[0];gy = gyro[1];gz = gyro[2];ax = acc[0];ay = acc[1];az = acc[2];static float q0 = 1, q1 = 0, q2 = 0, q3 = 0;static float exInt = 0, eyInt = 0, ezInt = 0;float norm;float vx, vy, vz;// wx, wy, wz;float ex, ey, ez;float halfT =0.001f ;// Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))){// Normalise accelerometer measurementnorm = my_sqrt(ax * ax + ay * ay + az * az); norm = 1/norm;ax *= norm;ay *= norm;az *= norm;// Estimated direction of gravity and vector perpendicular to magnetic fluxvx = (q1 * q3 - q0 * q2)*2;vy = (q0 * q1 + q2 * q3)*2;vz = q0 * q0 - q1*q1-q2*q2 + q3 * q3;// Error is sum of cross product between estimated and measured direction of gravityex = (ay * vz - az * vy);ey = (az * vx - ax * vz);ez = (ax * vy - ay * vx);// Compute and apply integral feedback if enabled exInt = exInt + ex * Ki;eyInt = eyInt + ey * Ki;ezInt = ezInt + ez * Ki;// Apply proportional feedbackgx += Kp*ex + exInt; gy += Kp*ey + eyInt; gz += Kp*ez + ezInt; }// Integrate rate of change of quaternionq0 += (-q1 * gx - q2 * gy -q3 * gz)*halfT;q1 += (q0 * gx + q2 * gz - q3 * gy)*halfT;q2 += (q0 * gy - q1 * gz + q3 * gx)*halfT;q3 += (q0 * gz + q1 * gy - q2 * gx)*halfT; // Normalise quaternionnorm = my_sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);norm = 1/norm;q0 *= norm;q1 *= norm;q2 *= norm;q3 *= norm;angle[PITCH]=asin(-2*q1*q3 + 2*q0*q2) * 57.3;angle[ROLL] = atan2(2*q2*q3 + 2*q0*q1, -2*q1*q1 - 2*q2*q2 + 1) * 57.3; angle[YAW] = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1) * 57.3; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。