代码解释:

  1. 首先计算时间间隔 dt,用于后续姿态解算的更新计算。
  2. 更新计时器 timer。
  3. 计算加速度计数据中的滚转角 roll。
  4. 计算加速度计数据中的俯仰角 pitch。
  5. 使用 Kalman 滤波算法对俯仰角进行优化。
  6. 判断计算得到的俯仰角是否大于90度或小于-90度,并通过调整 Gx 的正负值来保证舵机的转动不出现问题。
  7. 使用 Kalman 滤波算法对滚转角进行优化。

代码示例:

double dt = (double) (HAL_GetTick() - timer) / 1000;//首先计算时间间隔 dt,用于后续姿态解算的更新计算
timer = HAL_GetTick();
double roll;
double roll_sqrt = sqrt(
        DataStruct->Accel_X_RAW * DataStruct->Accel_X_RAW + DataStruct->Accel_Z_RAW * DataStruct->Accel_Z_RAW);
if (roll_sqrt != 0.0) {
    roll = atan(DataStruct->Accel_Y_RAW / roll_sqrt) * RAD_TO_DEG;
} else {
    roll = 0.0;
}
double pitch = atan2(-DataStruct->Accel_X_RAW, DataStruct->Accel_Z_RAW) * RAD_TO_DEG;
if ((pitch < -90 && DataStruct->KalmanAngleY > 90) || (pitch > 90 && DataStruct->KalmanAngleY < -90)) {
    KalmanY.angle = pitch;//Kalman 滤波算法对俯仰角进行优化
    DataStruct->KalmanAngleY = pitch;
} else {
    DataStruct->KalmanAngleY = Kalman_getAngle(&KalmanY, pitch, DataStruct->Gy, dt);
}
//计算滚转角 roll 和俯仰角 pitch ,这里使用 MPU6050 内置的加速度计数据计算姿态角度。

//判断计算得到的滚转角是否大于90度或小于-90度,并通过调整 Gx 的正负值来保证舵机的转动不出现问题
if (fabs(DataStruct->KalmanAngleY) > 90)
    DataStruct->Gx = -DataStruct->Gx;
DataStruct->KalmanAngleX = Kalman_getAngle(&KalmanX, roll, DataStruct->Gy, dt);

代码解释:

  1. double dt = (double) (HAL_GetTick() - timer) / 1000;: 计算两次调用 HAL_GetTick() 之间的间隔时间,并将其转换为秒作为时间间隔 dt, 用于后续的姿态解算计算。
  2. timer = HAL_GetTick();: 更新计时器 timer, 用于下次计算时间间隔。
  3. double roll;: 定义滚转角 roll 变量, 用于存储计算得到的滚转角。
  4. double roll_sqrt = sqrt(DataStruct->Accel_X_RAW * DataStruct->Accel_X_RAW + DataStruct->Accel_Z_RAW * DataStruct->Accel_Z_RAW);: 计算加速度计数据中的 Accel_X_RAWAccel_Z_RAW 的平方和的平方根, 用于计算滚转角。
  5. if (roll_sqrt != 0.0) { roll = atan(DataStruct->Accel_Y_RAW / roll_sqrt) * RAD_TO_DEG; } else { roll = 0.0; }: 如果 roll_sqrt 不为零, 则计算滚转角 roll, 否则将 roll 设置为 0。 这里使用 atan 函数计算反正切, 并乘以 RAD_TO_DEG 将弧度转换为角度。
  6. double pitch = atan2(-DataStruct->Accel_X_RAW, DataStruct->Accel_Z_RAW) * RAD_TO_DEG;: 计算加速度计数据中的 Accel_X_RAWAccel_Z_RAW 的反正切, 并乘以 RAD_TO_DEG 将弧度转换为角度, 得到俯仰角 pitch
  7. if ((pitch < -90 && DataStruct->KalmanAngleY > 90) || (pitch > 90 && DataStruct->KalmanAngleY < -90)) { KalmanY.angle = pitch; DataStruct->KalmanAngleY = pitch; } else { DataStruct->KalmanAngleY = Kalman_getAngle(&KalmanY, pitch, DataStruct->Gy, dt); }: 判断俯仰角是否大于 90 度或小于 -90 度。 如果是, 则使用当前计算得到的俯仰角 pitch 更新 Kalman 滤波器 KalmanY 的角度 angleDataStruct 中的 KalmanAngleY。 否则, 使用 Kalman 滤波函数 Kalman_getAngle 计算优化后的俯仰角, 并更新 DataStruct 中的 KalmanAngleY
  8. if (fabs(DataStruct->KalmanAngleY) > 90) DataStruct->Gx = -DataStruct->Gx;: 判断优化后的俯仰角是否大于 90 度或小于 -90 度。 如果是, 则将 DataStruct 中的 Gx 值取反, 用于控制舵机的转动方向。
  9. DataStruct->KalmanAngleX = Kalman_getAngle(&KalmanX, roll, DataStruct->Gy, dt);: 使用 Kalman 滤波函数 Kalman_getAngle 计算优化后的滚转角, 并更新 DataStruct 中的 KalmanAngleX

这段代码使用 MPU6050 的加速度计数据计算滚转角和俯仰角, 并使用 Kalman 滤波算法对姿态数据进行优化。 同时, 通过判断俯仰角的大小来调整舵机 Gx 的正负值, 以保证舵机正常转动。

MPU6050 姿态解算代码逐句解释

原文地址: https://www.cveoy.top/t/topic/nUor 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录