TwoFootBot-arduion/src/imu/imu.cpp

81 lines
2.1 KiB
C++
Raw Normal View History

2026-10-12 14:00:30 +00:00
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include "Wire.h"
#include <MPU6050.h>
#include "imu.h"
MPU6050 mpu;
bool dmpReady = false;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
// ===== 初始化 =====
void imu_setup() {
Serial.begin(115200);
Wire.begin(21, 22);
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("MPU6050 连接失败");
while (1);
}
uint8_t devStatus = mpu.dmpInitialize();
if (devStatus == 0) {
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
mpu.setDMPEnabled(true);
dmpReady = true;
Serial.println("DMP 就绪");
} else {
Serial.print("DMP 初始化失败,错误码: ");
Serial.println(devStatus);
}
}
// ===== DMP 读取,返回 YPR(角度制)=====
YPR dmp() {
YPR out = {0, 0, 0};
if (!dmpReady) return out;
if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) {
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
float ypr[3];
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
out.yaw = ypr[0] * 180.0f / M_PI;
out.pitch = ypr[1] * 180.0f / M_PI;
out.roll = ypr[2] * 180.0f / M_PI;
}
// Serial.print("Yaw: "); Serial.print(a.yaw);
// Serial.print(" Pitch: "); Serial.print(a.pitch);
// Serial.print(" Roll: "); Serial.println(a.roll);
return out;
}
// ===== 原始数据读取,返回 RawData =====
RawData raw() {
RawData r;
mpu.getMotion6(&r.ax, &r.ay, &r.az, &r.gx, &r.gy, &r.gz);
// ±2g 量程下 1g = 16384 LSB
// r.ax_g = r.ax / 16384.0f;
// r.ay_g = r.ay / 16384.0f;
// r.az_g = r.az / 16384.0f;
// // ±250°/s 量程下 1°/s = 131 LSB
// r.gx_dps = r.gx / 131.0f;
// r.gy_dps = r.gy / 131.0f;
// r.gz_dps = r.gz / 131.0f;
// Serial.print("Accel(g): X="); Serial.print(r.ax_g, 3);
// Serial.print(" Y="); Serial.print(r.ay_g, 3);
// Serial.print(" Z="); Serial.print(r.az_g, 3);
// Serial.print(" | Gyro(°/s): X="); Serial.print(r.gx_dps, 2);
// Serial.print(" Y="); Serial.print(r.gy_dps, 2);
// Serial.print(" Z="); Serial.println(r.gz_dps, 2);
return r;
}