MPU6050 姿态解算代码逐句解释
代码解释:
- 首先计算时间间隔 dt,用于后续姿态解算的更新计算。
- 更新计时器 timer。
- 计算加速度计数据中的滚转角 roll。
- 计算加速度计数据中的俯仰角 pitch。
- 使用 Kalman 滤波算法对俯仰角进行优化。
- 判断计算得到的俯仰角是否大于90度或小于-90度,并通过调整 Gx 的正负值来保证舵机的转动不出现问题。
- 使用 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);
代码解释:
double dt = (double) (HAL_GetTick() - timer) / 1000;: 计算两次调用HAL_GetTick()之间的间隔时间,并将其转换为秒作为时间间隔dt, 用于后续的姿态解算计算。timer = HAL_GetTick();: 更新计时器timer, 用于下次计算时间间隔。double roll;: 定义滚转角roll变量, 用于存储计算得到的滚转角。double roll_sqrt = sqrt(DataStruct->Accel_X_RAW * DataStruct->Accel_X_RAW + DataStruct->Accel_Z_RAW * DataStruct->Accel_Z_RAW);: 计算加速度计数据中的Accel_X_RAW和Accel_Z_RAW的平方和的平方根, 用于计算滚转角。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将弧度转换为角度。double pitch = atan2(-DataStruct->Accel_X_RAW, DataStruct->Accel_Z_RAW) * RAD_TO_DEG;: 计算加速度计数据中的Accel_X_RAW和Accel_Z_RAW的反正切, 并乘以RAD_TO_DEG将弧度转换为角度, 得到俯仰角pitch。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的角度angle和DataStruct中的KalmanAngleY。 否则, 使用 Kalman 滤波函数Kalman_getAngle计算优化后的俯仰角, 并更新DataStruct中的KalmanAngleY。if (fabs(DataStruct->KalmanAngleY) > 90) DataStruct->Gx = -DataStruct->Gx;: 判断优化后的俯仰角是否大于 90 度或小于 -90 度。 如果是, 则将DataStruct中的Gx值取反, 用于控制舵机的转动方向。DataStruct->KalmanAngleX = Kalman_getAngle(&KalmanX, roll, DataStruct->Gy, dt);: 使用 Kalman 滤波函数Kalman_getAngle计算优化后的滚转角, 并更新DataStruct中的KalmanAngleX。
这段代码使用 MPU6050 的加速度计数据计算滚转角和俯仰角, 并使用 Kalman 滤波算法对姿态数据进行优化。 同时, 通过判断俯仰角的大小来调整舵机 Gx 的正负值, 以保证舵机正常转动。
原文地址: https://www.cveoy.top/t/topic/nUor 著作权归作者所有。请勿转载和采集!