小四轴姿态融合_asin(-2 q1 q3 + 2 q0 q2) 57

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

		```
		//normalise the measurements
		norm = invSqrt(ax*ax + ay*ay + az*az);      
		ax = ax * norm;
		ay = ay * norm;
		az = az * norm;
		norm = invSqrt(mx*mx + my*my + mz*mz);         
		mx = mx * norm;
		my = my * norm;
		mz = mz * norm;
		//从机体坐标系的电子罗盘测到的矢量转成地理坐标系下的磁场矢量hxyz(测量值),下面这个是从飞行器坐标系到世界坐标系的转换公式
		//compute reference direction of flux
		hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
		hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
		hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);
		//计算地理坐标系下的磁场矢量bxyz(参考值)
		bx = sqrtf((hx*hx) + (hy*hy));
		bz = hz; 
		```
		1. 根据四元数矩阵,将地理坐标系下加速度矢量变换到飞行器坐标下(参考值)
		```
		 //estimated direction of gravity and flux (v and w),下面这个是从世界坐标系到飞行器坐标系的转换公式(转置矩阵)
		//地理坐标系下加速度为(0,0,1g)
		vx = 2*(q1q3 -q0q2);
		vy = 2*(q0q1 +q2q3);
		vz = q0q0 - q1q1 -q2q2 + q3q3;
		```
		1. 将地理坐标系下磁场矢量(参考值)通过四元数矩阵变换到飞行器坐标下
		```
		wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
		wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
		wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);
		```
		1. 将加速度的测量矢量与参考矢量做叉积,把磁场的测量矢量与参考矢量做叉积,得到加速度误差和磁场误差,用于修正陀螺
		```
		// error is sum of cross product between reference direction of fields and direction measured by sensors
		ex = (ay*vz - az*vy) + (my*wz - mz*wy);
		ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
		ez = (ax*vy - ay*vx) + (mx*wy - my*wx);
		```
		1. 误差积分,陀螺仪积分
		```
		// integral error scaled integral gain
		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;
		```
1. 1. 1. 龙格-库塔法更新四元数
		```
		// integrate quaternion rate and normalise,四元数更新算法
		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;
		
		```
+ 1. 1. 归一化四元数,由四元数计算姿态角
		```
		// normalise quaternion
		norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
		q0 = q0 * norm;       //w
		q1 = q1 * norm;       //x
		q2 = q2 * norm;       //y
		q3 = q3 * norm;       //z
		Pitch = asin(-2*q1*q3 + 2*q0*q2) * 57.3; //俯仰角,绕y轴转动	 
		Roll  = atan2(2*q2*q3 + 2*q0*q1,-2*q1*q1 - 2*q2*q2 + 1) * 57.3; //滚动角,绕x轴转动
		Yaw   = atan2(2*q1*q2 + 2*q0*q3,-2*q2*q2 - 2*q3*q3 + 1) * 57.3;  //偏航角,绕z轴转?
		
		```![]()  

四元数矩阵

1. 利用扩展卡尔曼滤波器对加速度计和磁力计的观测值来修正陀螺积分得到的姿态角 


1. 在这后面还有位置控制和姿态控制![]()
1. 姿态控制要实现实时精确控制四旋翼飞行器的飞行姿态,首先通过航姿参考系统检测其三个轴向的欧拉角度和角速率,然后对其实施闭环控制,使飞行器达到期望的姿态![]()
1. 位置控制位置回路控制律设计是为了使四旋翼无人飞行器可以快速、准确的跟踪给定轨迹。位置回路控制算法首先需要计算得到所需姿态角度,然后由姿态控制回路计算得出给定姿态角度,实现位置回路跟踪控制。所以,外环为位置环、内环为姿态环![]()

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. float q0q0 = q0*q0; float q0q1 = q0*q1; float q0q2 = q0*q2; // float q0q3 = q0*q3; float q1q1 = q1*q1; // float q1q2 = q1*q2; float q1q3 = q1*q3; float q2q2 = q2*q2; float q2q3 = q2*q3; float q3q3 = q3*q3; 这段程序就是为了把需要用到的姿态矩阵的元素求出来给出的。 2. vx = 2*(q1q3 - q0q2); / vy = 2*(q0q1 + q2q3); vz = q0q0 - q1q1 - q2q2 + q3q3 ; 可以看到vx,vy,vz为CRb的最后一列的三项,四元数矩阵带入(1)式得vx,vy,vz分别是axB,ayB,azB每一项g前的系数。且静止情况下vx,vy,vz组成向量模长基本可以认为为1. 3. norm = sqrt(ax*ax + ay*ay + az*az); //acc数据归一化 ax = ax /norm; ay = ay / norm; az = az / norm; 以上已说,由四元数倒推回去的加速度,向量模长为1,为了比较误差进行归1化,算的由加计得出的向量。 4. ex = (ay*vz - az*vy) ; ey = (az*vx - ax*vz) ; ez = (ax*vy - ay*vx) ; 接着可以通过叉乘(向量外积)计算误差 5. exInt = exInt + ex * Ki; eyInt = eyInt + ey * Ki; ezInt = ezInt + ez * Ki; 对误差进行积分 6. gx = gx + Kp*ex + exInt; gy = gy + Kp*ey + eyInt; gz = gz + Kp*ez + ezInt; 进行pi滤波,其实就是互补滤波 7. 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; 龙格库塔法。。。就是方程的数值解法。。近似解。。一阶解法 0736fac7228d4220f912874ee8cee5e5_21.png(0 Bytes, 下载次数: 0) 下载附件 2010-12-14 22:54 上传 这个跟四元数的微分方程对应有兴趣的看看书。。。。 8. norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); q0 = q0 / norm; q1 = q1 / norm; q2 = q2 / norm; q3 = q3 / norm; 对四元数进行规范化,即化为模长为1 ,因为只有规范化的四元数才能表示刚体旋转。 9. Q_ANGLE.Y = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch Q_ANGLE.X = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll 仍旧一一对应关系发现2(q1q3 -q0q2)刚好跟欧拉角对应,由此利用自带库函数即可求得俯仰角,横滚角类似,偏航角由于没有罗盘进行校正求没有意义,控制中采用采用PD控制。 补充,由于陀螺仪会有零点漂移开始一定要进行补偿。这段是在mpu6050.c中程序,对直流偏执进行了补偿。 MPU6050_ACC_LAST.X=((((int16_t)mpu6050_buffer[0]) << 8) | mpu6050_buffer[1]) - ACC_OFFSET.X; MPU6050_ACC_LAST.Y=((((int16_t)mpu6050_buffer[2]) << 8) | mpu6050_buffer[3]) - ACC_OFFSET.Y; MPU6050_ACC_LAST.Z=((((int16_t)mpu6050_buffer[4]) << 8) | mpu6050_buffer[5]) - ACC_OFFSET.Z; MPU6050_GYRO_LAST.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9]) - GYRO_OFFSET.X; MPU6050_GYRO_LAST.Y=((((int16_
/* @brief @param[in] gx gy gz 为各轴角速度,单位为rad/s @param[in] ax ay az 为各轴加速度,单位为m/s^2 @param[in] halfT 为更新周期的一半,单位为s @param[out] pitch roll yaw 为当前欧拉角,单位为度 */ float q0 = 1, q1 = 0, q2 = 0, q3 = 0; float q0temp, q1temp, q2temp, q3temp; float vx, vy, vz; float ex, ey, ez; float ix = 0, iy = 0, iz = 0; float kp = 1, ki = 0; void func(float *pitch, float *roll, float *yaw, float gx, float gy, float gz, float ax, float ay, float az, float halfT) { float norm; if(ax * ay *az != 0) { /* 归一化加速度 */ norm = inVSqrt(ax*ax + ay*ay + az*az); ax = ax * norm; ay = ay * norm; az = az * norm; /* 计算当前各轴加速度 */ vx = 2*(q1*q3 - q0*q2); vy = 2*(q0*q1 + q2*q3); vz = q0*q0 - q1*q1 - q2*q2 + q3*q3; /* 计算加速度正交 */ ex = (ay*vz - az*vy) ; ey = (az*vx - ax*vz) ; ez = (ax*vy - ay*vx) ; /* 融合 */ ix += ex; iy += ey; iz += ez; gx = gx + kp*ex + ki*ix; gy = gy + kp*ey + ki*iy; gz = gz + kp*ez + ki*iz; } q0temp=q0; q1temp=q1; q2temp=q2; q3temp=q3; q0 = q0temp + (-q1temp*gx - q2temp*gy - q3temp*gz)*halfT; q1 = q1temp + ( q0temp*gx + q2temp*gz - q3temp*gy)*halfT; q2 = q2temp + ( q0temp*gy - q1temp*gz + q3temp*gx)*halfT; q3 = q3temp + ( q0temp*gz + q1temp*gy - q2temp*gx)*halfT; norm = inVSqrt(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 + q0 * q1), q0*q0 - q1*q1 - q2*q2 + q3*q3)* 57.295773f; *pitch = -asin(2 * (q1 * q3 - q0 * q2))*57.295773f; *yaw = atan2(2 * (q1 * q2 - q0 * q3), q0*q0 + q1*q1 - q2*q2 - q3*q3)*57.295773f; }
最新发布
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值