mpu6050+dmp姿态解算

MPU6050

DMP使用

在这里插入图片描述
在这里插入图片描述

对四元数还原,得到欧拉角

void Read_DMP(float *Pitch,float *Roll,float *Yaw)
{	
	  unsigned long sensor_timestamp;
		unsigned char more;
		long quat[4];

				dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more);		
				if (sensors & INV_WXYZ_QUAT )
				{    
					 q0=quat[0] / q30;
					 q1=quat[1] / q30;
					 q2=quat[2] / q30;
					 q3=quat[3] / q30;
					 *Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; 	
					 *Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
				   *Yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;	//yaw

				}

}

获取陀螺仪的数据

//得到陀螺仪值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
    u8 buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
	if(res==0)
	{
		*gx=((u16)buf[0]<<8)|buf[1];  
		*gy=((u16)buf[2]<<8)|buf[3];  
		*gz=((u16)buf[4]<<8)|buf[5];
	} 	
    return res;;
}

获取加速度值

//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
    u8 buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
	if(res==0)
	{
		*ax=((u16)buf[0]<<8)|buf[1];  
		*ay=((u16)buf[2]<<8)|buf[3];  
		*az=((u16)buf[4]<<8)|buf[5];
	} 	
    return res;;
}

获取温度值

//得到温度值
//返回值:温度值(扩大了100倍)
short MPU_Get_Temperature(void)
{
    u8 buf[2]; 
    short raw;
	float temp;
	MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); 
    raw=((u16)buf[0]<<8)|buf[1];  
    temp=36.53+((double)raw)/340;  
    return temp*100;;
}

总结

参考正点原子讲解视频,代码部分还是很多都涉及到地址指针,需要对寄存器的有一定的理解,自己最近在学习使用mpu6050,做一个简单总结:dmp可以代替mpu进行姿态解算,得到四元数,再通过转换得到欧拉角,即俯仰角,横滚角,航偏角。

MPU6050是一种6轴运动处理组件,它整合了3轴陀螺仪和3轴加速度计,并且还包含了数字运动处理器(DMP)硬件加速引擎。通过使用MPU6050DMP功能,可以进行姿态解算,得到四元数,并通过转换得到欧拉角,如俯仰角、横滚角和航向角。\[2\] 在使用MPU6050进行姿态解算时,需要创建MPU6050对象,并设置相应的地址和I2C通信对象。可以使用MPU6050_Base构造函数来创建对象,并传入地址和I2C通信对象的指针。\[1\] MPU6050的角速度感测范围可以设置为±250、±500、±1000或±2000°/sec,而加速度感测范围可以设置为±2g、±4g、±8g或±16g。此外,MPU6050可以通过I2C或SPI进行数据传输,最高传输速率分别为400kHz和20MHz。\[3\] 因此,通过使用MPU6050DMP功能,结合相应的设置和参数,可以实现姿态解算。 #### 引用[.reference_title] - *1* [ESP32上手笔记 | 05 - 获取MPU6050数据进行姿态解算和展示(I2Cdev+MPU6050+Processing)](https://blog.csdn.net/Mculover666/article/details/123541279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mpu6050+dmp姿态解算](https://blog.csdn.net/m0_58028719/article/details/125949274)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32系列(HAL库)——F103C8T6通过MPU6050+DMP姿态解算读取角度及温度](https://blog.csdn.net/lwb450921/article/details/123575209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值