代码解析(自用 自用 自用 怕之后搞忘球)

1.mpu6050_data结构体
typedef struct {
	I2C_HandleTypeDef *i2cx;
	uint8_t port;
	Quaternion normalizedQuaternion;
	float gyroBias[3], accelBias[3]; // Bias corrections for gyro and accelerometer
	int Offset[6];
	volatile float q0, q1, q2, q3;          // quaternion of sensor frame relative to auxiliary frame
}Mpu6050_data;
2.sensor_init()
void sensor_init(Mpu6050_data *sensor, I2C_HandleTypeDef *i2cx, uint8_t port, int *offset)
{
	sensor->i2cx = i2cx;
	sensor->port = port;
	sensor->q0 = 1.0f;
	sensor->q1 = 0.0f;
	sensor->q2 = 0.0f;
	sensor->q3 = 0.0f;
	sensor->accelBias[0] = 0;
	sensor->accelBias[1] = 0;
	sensor->accelBias[2] = 0;
	sensor->gyroBias[0] = 0;
	sensor->gyroBias[1] = 0;
	sensor->gyroBias[2] = 0;
	sensor->normalizedQuaternion.w = 1.0;
	sensor->normalizedQuaternion.x = 0.0;
	sensor->normalizedQuaternion.y = 0.0;
	sensor->normalizedQuaternion.z = 0.0;	
	for(uint8_t i = 0; i < 3; i++)
		sensor->Offset[i+3] = offset[i+3];
	selectPort(i2cx, port);	
  // Self Test
  MPU6050SelfTest(sensor, SelfTest);

  // Initialize MPU6050
  MPU6050_Init(sensor);
}

函数作用:初始化传感器

应用举例:

sensor_init(&armR, &hi2c2, 1, offsetAcGyA);

每个参数的作用分别是:选择传感器、选择使用i2C几(与传感器绑定在哪个i2c有关)、pca9548片选(i2c拓展器,是一个模拟开关,适用于多个地址相同的外设)、选择对应的漂移校准参数

  MPU6050SelfTest(sensor, SelfTest)函数用于自检

  MPU6050_Init(sensor)函数用于初始化陀螺仪

3.sensor_update()
void sensor_update(Mpu6050_data *sensor)
{
  selectPort(sensor->i2cx, sensor->port);
  // Get raw data
  mpu6050_GetData(sensor);

  // Update raw data to Quaternion form
  mpu6050_updateQuaternion(sensor);
/*
   Initially, sampleFreq should be set as (1000000.0f / (Now - lastUpdate)).
   However, when reading data from multiple sensors, this setting appears to be incorrect.
   In theory, this value should not be dependent on the number of sensors.
   Nevertheless, to ensure the proper functioning of the program, it is necessary to set it as
   (1000000.0f / (number of sensors) / (Now - lastUpdate)).
*/
  Now = micros();
  sampleFreq = (100000.0f / (Now - lastUpdate)); 
  lastUpdate = Now;

  //compute data
  MahonyAHRSupdateIMU(sensor, gxrs, gyrs, gzrs, axg, ayg, azg);
  correct_quaternion(sensor);
  //print("%.3f,%.3f,%.3f,%.3f;",sensor->q0,sensor->q1,sensor->q2,sensor->q3);
}

函数作用:更新四元数

4.init_quaternion()
void init_quaternion(Mpu6050_data *sensor)
{
	Quaternion sensorQuat;
	sensorQuat.w = sensor->q0;
	sensorQuat.x = sensor->q1;
	sensorQuat.y = sensor->q2;
	sensorQuat.z = sensor->q3;
	quaternion_inverseTransformation(&sensorQuat);
	sensor->normalizedQuaternion.w = sensorQuat.w;
	sensor->normalizedQuaternion.x = sensorQuat.x;
	sensor->normalizedQuaternion.y = sensorQuat.y;
	sensor->normalizedQuaternion.z = sensorQuat.z;
}

函数作用:初始化并处理一个四元数

主要起作用的是这一个函数——quaternion_inverseTransformation(&sensorQuat);

子函数作用:对一个给定的四元数进行逆变换。四元数是一种用于表示三维空间中旋转的方法,它由一个实部和三个虚部组成。函数通过修改传入的四元数指针来实现这一点。

typedef struct {
    float w, x, y, z;
} Quaternion;

Quaternion结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值